{"version":3,"sources":["webpack:///./public/components/utils/index.tsx","webpack:///./public/module/k8s/index.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/coderefs/coderef-resolver.ts","webpack:///./public/models/index.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/index.ts","webpack:///./packages/console-shared/src/index.ts","webpack:///./packages/console-shared/src/constants/index.ts","webpack:///./public/components/factory/index.tsx","webpack:///./public/components/secrets/create-secret/index.tsx","webpack:///./packages/console-shared/src/components/dashboard/status-card/states.tsx","webpack:///./public/actions/ui.ts","webpack:///./public/components/monitoring/utils.ts","webpack:///./public/actions/observe.ts","webpack:///./packages/console-shared/src/hooks/index.ts","webpack:///./packages/console-plugin-sdk/src/index.ts","webpack:///./packages/knative-plugin/src/models.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/index.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/lib-core.ts","webpack:///./packages/console-shared/src/constants/common.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/k8s-ref.ts","webpack:///./public/co-fetch.ts","webpack:///./public/components/factory/modal.tsx","webpack:///./public/components/utils/k8s-watch-hook.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/k8s/actions/k8s.ts","webpack:///./public/components/utils/details-item.tsx","webpack:///./packages/operator-lifecycle-manager/src/models.ts","webpack:///./public/components/modals/index.ts","webpack:///./packages/knative-plugin/src/const.ts","webpack:///./packages/console-shared/src/components/formik-fields/field-utils.ts","webpack:///./public/components/utils/resource-link.tsx","webpack:///./packages/console-shared/src/components/status/index.tsx","webpack:///./public/components/utils/status-box.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/cloud-shell-utils.ts","webpack:///./packages/operator-lifecycle-manager/src/types.ts","webpack:///./packages/console-shared/src/components/catalog/utils/types.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/console-types.ts","webpack:///./public/components/utils/datetime.ts","webpack:///./public/components/graphs/index.tsx","webpack:///./packages/metal3-plugin/src/models.ts","webpack:///./public/module/k8s/k8s-ref.ts","webpack:///./packages/console-shared/src/components/error/index.ts","webpack:///./packages/console-shared/src/hooks/useTelemetry.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/fetch/index.ts","webpack:///./packages/console-shared/src/utils/index.ts","webpack:///./packages/console-app/src/models/index.ts","webpack:///./packages/console-plugin-shared/src/datetime/prometheus.ts","webpack:///./public/components/utils/link.tsx","webpack:///./public/reducers/features.ts","webpack:///./packages/console-shared/src/components/catalog/utils/catalog-utils.tsx","webpack:///./public/actions/features.ts","webpack:///./packages/console-shared/src/components/markdown-extensions/const.ts","webpack:///./public/components/graphs/helpers.ts","webpack:///./packages/console-shared/src/hooks/flag.ts","webpack:///./public/components/monitoring/hooks/useBoolean.ts","webpack:///./public/reducers/connectToFlags.ts","webpack:///./public/components/utils/async.tsx","webpack:///./packages/console-plugin-sdk/src/api/pluginSubscriptionService.ts","webpack:///./public/module/k8s/pods.ts","webpack:///./public/redux.ts","webpack:///./packages/console-shared/src/utils/user-settings.ts","webpack:///./packages/console-shared/src/components/dashboard/status-card/alert-utils.ts","webpack:///./public/module/k8s/k8s.ts","webpack:///./packages/console-app/src/consts.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/hooks/k8s-watcher.ts","webpack:///./public/components/utils/headings.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sModel.ts","webpack:///./packages/console-shared/src/hooks/useUserSettings.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/k8s-utils.ts","webpack:///./packages/console-shared/src/hooks/useActiveNamespace.ts","webpack:///./public/reducers/dashboards.ts","webpack:///./packages/console-shared/src/components/status/icons.tsx","webpack:///./public/components/factory/Table/VirtualizedTable.tsx","webpack:///./public/components/factory/table-filters.ts","webpack:///./public/graphql/client.ts","webpack:///./packages/console-app/src/components/tour/const.ts","webpack:///./packages/metal3-plugin/src/features.ts","webpack:///./packages/patternfly/src/index.ts","webpack:///./public/i18n.js","webpack:///./public/components/monitoring/types.ts","webpack:///./public/module/k8s/cluster-settings.ts","webpack:///./packages/console-shared/src/components/catalog/utils/category-utils.ts","webpack:///./public/components/events.jsx","webpack:///./public/module/k8s/builds.ts","webpack:///./public/components/utils/resource-icon.tsx","webpack:///./packages/console-app/src/components/user-preferences/language/getLastLanguage.ts","webpack:///./public/components/monitoring/dashboards/monitoring-dashboard-utils.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/error/http-error.ts","webpack:///./public/components/utils/rbac.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/app/modal-support/useModal.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/components/status/StatusIconAndText.tsx","webpack:///./packages/console-shared/src/hooks/useK8sModel.ts","webpack:///./packages/console-shared/src/components/dashboard/inventory-card/status-group.ts","webpack:///./packages/console-shared/src/selectors/common.ts","webpack:///./public/plugins.ts","webpack:///./packages/console-app/src/components/nav/utils.ts","webpack:///./public/actions/dashboards.ts","webpack:///./public/reducers/ui.ts","webpack:///./packages/operator-lifecycle-manager/src/index.ts","webpack:///./packages/console-shared/src/components/dashboard/inventory-card/InventoryCard.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/index.ts","webpack:///./packages/console-shared/src/hooks/useUserSettingsCompatibility.ts","webpack:///./packages/console-shared/src/utils/pod-utils.ts","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/setup/cloud-shell-setup-utils.ts","webpack:///./public/components/monitoring/dashboards/types.ts","webpack:///./packages/console-shared/src/components/dashboard/Dashboard.tsx","webpack:///./public/kinds.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/k8s-resource.ts","webpack:///./packages/webterminal-plugin/src/redux/reducers/cloud-shell-selectors.ts","webpack:///./public/components/graphs/area.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/error/custom-error.ts","webpack:///./packages/console-shared/src/components/catalog/utils/filter-utils.ts","webpack:///./packages/console-shared/src/utils/resource-utils.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/k8s/reducers/k8sSelector.ts","webpack:///./packages/console-shared/src/components/synced-editor/editor-toggle.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/api/common-types.ts","webpack:///./packages/console-app/src/components/user-preferences/search/index.ts","webpack:///./packages/console-app/src/components/tour/tour-context.ts","webpack:///./public/components/factory/Table/sort.ts","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/useCloudShellAvailable.ts","webpack:///./packages/webterminal-plugin/src/redux/actions/cloud-shell-actions.ts","webpack:///./packages/console-shared/src/components/quick-search/utils/quick-search-utils.tsx","webpack:///./packages/console-shared/src/components/actions/types.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/core/actions/core.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/storeHandler.ts","webpack:///./packages/console-plugin-sdk/src/utils/extension-i18n.ts","webpack:///./public/components/radio.tsx","webpack:///./public/components/utils/timestamp.tsx","webpack:///./packages/knative-plugin/src/utils/icons.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/hooks/index.ts","webpack:///./packages/metal3-plugin/src/constants/index.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/promise.ts","webpack:///./packages/console-shared/src/components/query-browser/index.ts","webpack:///./packages/console-shared/src/components/alerts/error.tsx","webpack:///./public/components/utils/drag-drop-context.tsx","webpack:///./packages/webterminal-plugin/src/const.ts","webpack:///./packages/container-security/src/const.ts","webpack:///./public/components/utils/k8s-watcher.js","webpack:///./public/components/notification-drawer.tsx","webpack:///./packages/console-shared/src/components/getting-started/useGettingStartedShowState.tsx","webpack:///./packages/console-shared/src/components/virtualized-grid/utils.ts","webpack:///./packages/container-security/src/models.ts","webpack:///./packages/dev-console/src/const.ts","webpack:///./packages/console-shared/src/graph-helper/data-utils.ts","webpack:///./public/components/utils/url-poll-hook.ts","webpack:///./public/components/error.tsx","webpack:///./packages/console-shared/src/hooks/debounce.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sWatchResource.ts","webpack:///./public/components/RBAC/index.js","webpack:///./packages/service-binding-plugin/src/models.ts","webpack:///./public/components/factory/ListPage/ListPageCreate.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/app/components/status/icons.tsx","webpack:///./public/module/auth.js","webpack:///./packages/rhoas-plugin/src/const.ts","webpack:///./packages/console-shared/src/components/pagetitle/PageTitleContext.tsx","webpack:///./packages/local-storage-operator-plugin/src/models.ts","webpack:///./packages/console-shared/src/components/namespace/filters.ts","webpack:///./public/actions/k8s.ts","webpack:///./packages/console-shared/src/hooks/useQueryParams.tsx","webpack:///./public/module/k8s/k8s-models.ts","webpack:///./packages/console-shared/src/components/error/error-boundary.tsx","webpack:///./packages/console-shared/src/hooks/deep-compare-memoize.ts","webpack:///./packages/console-shared/src/utils/default-categories.ts","webpack:///./packages/console-shared/src/components/catalog/CatalogBadges.tsx","webpack:///./packages/console-shared/src/constants/time.ts","webpack:///./packages/console-app/src/components/user-preferences/language/const.ts","webpack:///./packages/console-app/src/components/user-preferences/const.ts","webpack:///./packages/webterminal-plugin/models.ts","webpack:///./packages/knative-plugin/src/utils/fetch-dynamic-eventsources-utils.ts","webpack:///./packages/operator-lifecycle-manager/src/const.ts","webpack:///./public/components/default-resource.tsx","webpack:///./public/components/utils/file-input.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/fetch/console-fetch.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/api/useResolvedExtensions.ts","webpack:///./packages/console-shared/src/selectors/node.ts","webpack:///./packages/console-shared/src/hooks/useQuickStartContext.ts","webpack:///./public/module/k8s/selector-requirement.js","webpack:///./public/components/monitoring/alertmanager/alertmanager-utils.tsx","webpack:///./packages/console-shared/src/components/catalog/utils/index.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/core/reducers/coreSelectors.ts","webpack:///./public/module/k8s/get-resources.ts","webpack:///./public/components/RBAC/bindings.jsx","webpack:///./packages/console-shared/src/hooks/version.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/resource-metadata.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/components/status/GenericStatus.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/app/components/status/statuses.tsx","webpack:///./packages/console-shared/src/constants/duration.ts","webpack:///./packages/console-shared/src/components/namespace/NamespaceDropdown.tsx","webpack:///./packages/knative-plugin/src/actions/index.ts","webpack:///./public/components/masthead.jsx","webpack:///./packages/insights-plugin/src/components/InsightsPopup/mappers.ts","webpack:///./packages/console-shared/src/promql/resource-metrics.ts","webpack:///./packages/console-shared/src/components/virtualized-grid/const.ts","webpack:///./packages/knative-plugin/src/providers/index.ts","webpack:///./public/components/resource-list.tsx","webpack:///./public/components/conditions.tsx","webpack:///./packages/service-binding-plugin/src/const.ts","webpack:///./public/components/build.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/api/core-api.ts","webpack:///./public/components/start-guide.tsx","webpack:///./public/components/utils/dropdown.jsx","webpack:///./public/components/utils/kebab.tsx","webpack:///./public/components/utils/units.js","webpack:///./public/components/utils/router.ts","webpack:///./packages/console-shared/src/hooks/useCreateNamespaceOrProjectModal.ts","webpack:///./public/components/resource-pages.ts","webpack:///./public/components/utils/breadcrumbs.ts","webpack:///./public/module/k8s/selector.ts","webpack:///./packages/console-shared/src/components/close-button/index.ts","webpack:///./public/components/filter-toolbar.tsx","webpack:///./public/module/ws-factory.ts","webpack:///./public/components/cluster-settings/global-config.tsx","webpack:///./packages/console-plugin-sdk/src/api/useDynamicPluginInfo.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/hooks/useDeepCompareMemoize.ts","webpack:///./public/components/RBAC/role.jsx","webpack:///./packages/console-dynamic-plugin-sdk/src/perspective/perspective-context.ts","webpack:///./public/components/utils/poll-hook.ts","webpack:///./public/components/utils/button-bar.jsx","webpack:///./public/components/utils/ref-width-hook.ts","webpack:///./packages/console-shared/src/utils/hpa-utils.ts","webpack:///./packages/console-plugin-sdk/src/api/useExtensions.ts","webpack:///./packages/console-shared/src/hooks/useForceRender.ts","webpack:///./packages/console-plugin-sdk/src/store.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/fetch/console-fetch-utils.ts","webpack:///./packages/console-plugin-sdk/src/typings/index.ts","webpack:///./packages/console-shared/src/selectors/infrastructure.ts","webpack:///./packages/console-shared/src/hooks/formik-validation-fix.ts","webpack:///./packages/console-shared/src/hooks/useResizeObserver.ts","webpack:///./public/components/utils/safe-fetch-hook.ts","webpack:///./public/components/secret.jsx","webpack:///./public/components/utils/owner-references.tsx","webpack:///./packages/console-shared/src/components/actions/utils.ts","webpack:///./packages/knative-plugin/src/components/pub-sub/PubSubModalLauncher.ts","webpack:///./packages/console-shared/src/components/modal/index.ts","webpack:///./packages/console-shared/src/components/popper/index.ts","webpack:///./packages/console-shared/src/components/toast/ToastContext.tsx","webpack:///./packages/console-shared/src/components/catalog/index.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/alerts.ts","webpack:///./packages/console-shared/src/components/popper/Portal.tsx","webpack:///./packages/console-app/src/components/user-preferences/namespace/usePreferredNamespace.ts","webpack:///./public/components/monitoring/format.tsx","webpack:///./packages/console-shared/src/utils/validation/types.ts","webpack:///./packages/console-shared/src/components/formik-fields/text-column-field/text-column-types.ts","webpack:///./packages/console-app/src/components/nav/NavItemResource.tsx","webpack:///./packages/console-shared/src/hooks/useLocation.ts","webpack:///./packages/console-app/src/components/user-preferences/language/usePreferredLanguage.ts","webpack:///./public/actions/common.ts","webpack:///./public/components/build-pipeline.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/runtime/plugin-utils.ts","webpack:///./packages/dev-console/src/components/guided-tour/GuidedTourText.tsx","webpack:///./packages/topology/src/operators/index.ts","webpack:///./packages/operator-lifecycle-manager/src/utils.ts","webpack:///./public/components/graphs/prometheus-poll-hook.ts","webpack:///./public/components/utils/copy-to-clipboard.tsx","webpack:///./packages/console-shared/src/hooks/useUtilizationDuration.ts","webpack:///./public/components/factory/ListPage/ListPageFilter.tsx","webpack:///./public/components/factory/ListPage/ListPageHeader.tsx","webpack:///./public/components/factory/ListPage/filter-hook.ts","webpack:///./public/components/utils/namespace-redirect.tsx","webpack:///./public/components/graphs/graph-empty.tsx","webpack:///./packages/console-shared/src/utils/annotations.ts","webpack:///./packages/console-shared/src/components/popper/Popper.tsx","webpack:///./packages/console-shared/src/selectors/index.ts","webpack:///./packages/console-shared/src/components/error/fallbacks/ErrorBoundaryFallbackPage.tsx","webpack:///./public/components/utils/service-level.tsx","webpack:///./packages/console-shared/src/components/actions/ActionServiceProvider.tsx","webpack:///./packages/rhoas-plugin/src/models/index.ts","webpack:///./packages/console-app/src/components/user-preferences/index.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/horizontal-nav-tabs.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/components/safety-first.tsx","webpack:///./packages/console-shared/src/components/error/fallbacks/ErrorBoundaryFallbackInline.tsx","webpack:///./packages/console-shared/src/components/error/fallbacks/withFallback.tsx","webpack:///./packages/console-shared/src/components/badges/InlineBadge.tsx","webpack:///./public/components/utils/selector.tsx","webpack:///./packages/console-shared/src/hooks/previous.ts","webpack:///./packages/console-shared/src/components/query-browser/theme.ts","webpack:///./public/components/utils/types.ts","webpack:///./public/components/utils/inject.js","webpack:///./public/module/k8s/managed-by.ts","webpack:///./packages/console-plugin-shared/src/hooks/index.ts","webpack:///./public/components/ThemeProvider.tsx","webpack:///./packages/console-shared/src/components/catalog/service/CatalogExtensionHookResolver.tsx","webpack:///./packages/console-app/src/queries.ts","webpack:///./packages/console-app/src/components/user-preferences/perspective/usePreferredPerspective.ts","webpack:///./packages/console-app/src/components/user-preferences/language/index.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/object.ts","webpack:///./packages/console-app/src/components/dashboards-page/status.ts","webpack:///./packages/console-app/src/components/detect-namespace/namespace.ts","webpack:///./public/imgs/logos/serverlessfx.svg","webpack:///./public/components/monitoring/labels.tsx","webpack:///./public/imgs/logos/redhat.svg","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/TerminalLoadingBox.tsx","webpack:///./public/components/utils/draggable-item-types.js","webpack:///./packages/topology/src/components/graph-view/components/nodes/decorators/getDefaultDecorators.ts","webpack:///./packages/topology/src/utils/connector-utils.ts","webpack:///./public/components/catalog/catalog-item-icon.tsx","webpack:///./packages/knative-plugin/src/index.ts","webpack:///./packages/operator-lifecycle-manager/src/components/index.tsx","webpack:///./public/components/graphs/utils.ts","webpack:///./packages/console-shared/src/components/dashboard/status-card/state-utils.ts","webpack:///./public/components/pod.tsx","webpack:///./public/components/utils/details-page.tsx","webpack:///./packages/knative-plugin/src/utils/get-knative-resources.ts","webpack:///./public/components/utils/label-list.tsx","webpack:///./public/components/utils/alerts.tsx","webpack:///./packages/console-shared/src/utils/utils.ts","webpack:///./packages/console-shared/src/hooks/useNotificationAlerts.ts","webpack:///./packages/console-shared/src/components/namespace/index.tsx","webpack:///./packages/service-binding-plugin/src/utils.ts","webpack:///./packages/console-shared/src/components/getting-started/index.ts","webpack:///./packages/console-shared/src/components/actions/menu/ActionMenuItem.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/app/components/status/Status.tsx","webpack:///./packages/console-shared/src/components/toast/index.ts","webpack:///./public/components/utils/firehose.jsx","webpack:///./public/components/configmap-and-secret-data.tsx","webpack:///./public/components/row-filter.jsx","webpack:///./packages/console-shared/src/hooks/perspective-utils.ts","webpack:///./packages/operator-lifecycle-manager/src/status/csv-status.ts","webpack:///./packages/console-plugin-shared/src/hooks/useForceRender.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/components/index.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/components/utils/resource-status.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/app/components/utils/rbac.tsx","webpack:///./public/module/k8s/label-selector.js","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sWatchResources.ts","webpack:///./public/components/utils/expand-collapse.tsx","webpack:///./packages/console-shared/src/components/badges/DevPreviewBadge.tsx","webpack:///./packages/console-plugin-shared/src/hooks/useResizeObserver.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/api/internal-types.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/flags.ts","webpack:///./public/components/utils/number-spinner.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/cluster-settings.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/details-item.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/feature-flags.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/core/actions/index.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/core/reducers/index.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/core/reducers/core.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/ws-factory.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/redux.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/components/utils/camel-case-wrap.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/app/components/status/PopoverStatus.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/app/constants.ts","webpack:///./packages/console-plugin-sdk/src/typings/kebab-actions.ts","webpack:///./packages/console-plugin-sdk/src/typings/guided-tour.ts","webpack:///./packages/console-shared/src/components/badges/TechPreviewBadge.tsx","webpack:///./packages/console-shared/src/hooks/useCanClusterUpgrade.ts","webpack:///./public/components/utils/line-buffer.ts","webpack:///./public/components/utils/promise-component.tsx","webpack:///./packages/console-shared/src/utils/useCombineRefs.ts","webpack:///./packages/console-shared/src/components/close-button/CloseButton.tsx","webpack:///./packages/console-app/src/components/user-preferences/namespace/index.ts","webpack:///./public/components/RBAC/rules.jsx","webpack:///./public/components/factory/table.tsx","webpack:///./public/components/utils/dom-utils.tsx","webpack:///./packages/console-shared/src/hooks/useScrollContainer.ts","webpack:///./public/components/modals/labels-modal.tsx","webpack:///./public/components/utils/documentation.tsx","webpack:///./packages/patternfly/src/components/notification-drawer/notification-drawer-heading.tsx","webpack:///./packages/console-shared/src/utils/keyword-filter.ts","webpack:///./packages/console-shared/src/utils/order-extensions.ts","webpack:///./packages/console-shared/src/hooks/useServicesWatcher.ts","webpack:///./packages/console-shared/src/hooks/post-form-submit-action.ts","webpack:///./packages/console-shared/src/hooks/hpa-hooks.ts","webpack:///./packages/console-shared/src/components/dropdown/ResourceDropdown.tsx","webpack:///./packages/console-shared/src/components/status/statuses.tsx","webpack:///./packages/console-shared/src/components/status/SecondaryStatus.tsx","webpack:///./packages/console-shared/src/components/formik-fields/InputField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/RadioButtonField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/RadioGroupField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/field-types.ts","webpack:///./packages/console-shared/src/components/pod/PodStatus.tsx","webpack:///./packages/console-shared/src/components/drawer/Drawer.tsx","webpack:///./packages/console-shared/src/components/virtualized-grid/index.ts","webpack:///./packages/console-shared/src/components/toast/ToastProvider.tsx","webpack:///./packages/console-shared/src/components/catalog/catalog-view/CatalogCategories.tsx","webpack:///./public/imgs/logos/catalog-icon.svg","webpack:///./packages/console-shared/src/components/catalog/catalog-view/CatalogEmptyState.tsx","webpack:///./packages/console-shared/src/components/catalog/catalog-view/CatalogGrid.tsx","webpack:///./packages/console-shared/src/components/catalog/catalog-view/CatalogToolbar.tsx","webpack:///./packages/console-shared/src/components/catalog/catalog-view/CatalogTypeSelector.tsx","webpack:///./packages/console-shared/src/components/catalog/catalog-view/CatalogView.tsx","webpack:///./packages/console-shared/src/components/catalog/details/CatalogDetailsModal.tsx","webpack:///./packages/console-shared/src/components/catalog/hooks/useCtaLink.ts","webpack:///./packages/console-shared/src/components/catalog/details/CatalogDetailsPanel.tsx","webpack:///./packages/console-shared/src/components/catalog/hooks/useCatalogExtensions.ts","webpack:///./packages/console-shared/src/components/catalog/CatalogTile.tsx","webpack:///./packages/console-shared/src/components/progressive-list/ProgressiveListFooter.tsx","webpack:///./packages/console-shared/src/components/progressive-list/ProgressiveListItem.tsx","webpack:///./packages/console-app/src/components/user-preferences/language/useLanguage.ts","webpack:///./packages/console-app/src/components/quick-starts/utils/quick-start-context.tsx","webpack:///./packages/console-app/src/components/user-preferences/lightspeed/index.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/configSetup.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/k8s.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/hooks/useModelsLoaded.ts","webpack:///./packages/console-shared/src/components/error/fallbacks/ErrorDetailsBlock.tsx","webpack:///./public/module/k8s/container.ts","webpack:///./public/components/resource-dropdown.tsx","webpack:///./packages/console-shared/src/components/namespace/NamespaceMenuToggle.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/app/modal-support/ModalProvider.tsx","webpack:///./packages/console-shared/src/components/modals/CreateNamespaceModal.tsx","webpack:///./packages/console-shared/src/components/modals/CreateProjectModal.tsx","webpack:///./public/components/useMirroredLocalState.ts","webpack:///./public/components/monitoring/table-pagination.tsx","webpack:///./packages/console-shared/src/components/formik-fields/ToggleableFieldBase.tsx","webpack:///./packages/console-shared/src/components/formik-fields/BaseInputField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/multi-column-field/MultiColumnFieldFooter.tsx","webpack:///./packages/console-shared/src/components/formik-fields/text-column-field/TextColumnItemContent.tsx","webpack:///./packages/console-shared/src/components/Tooltip/Tooltip.tsx","webpack:///./packages/webterminal-plugin/src/redux/actions/cloud-shell-dispatchers.ts","webpack:///./packages/console-shared/src/components/actions/menu/ActionMenuContent.tsx","webpack:///./packages/console-shared/src/components/actions/menu/ActionMenuToggle.tsx","webpack:///./packages/console-app/src/components/nav/confirmNavUnpinModal.tsx","webpack:///./packages/console-app/src/components/tour/index.ts","webpack:///./packages/console-app/src/components/nav/NavLink.tsx","webpack:///./packages/console-app/src/components/nav/NavItemHref.tsx","webpack:///./packages/console-app/src/components/nav/useNavExtensionForPerspective.ts","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/MultiTabbedTerminal.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/setup/CloudShellSetupForm.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/url.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/models/index.ts","webpack:///./public/components/monitoring/kebab-dropdown.tsx","webpack:///./public/imgs/logos/openjdk.svg","webpack:///./packages/console-app/src/components/tour/StepComponent.tsx","webpack:///./public/imgs/openshift-logo.svg","webpack:///./public/components/utils/telemetry.ts","webpack:///./packages/console-shared/src/utils/yaml.ts","webpack:///./public/components/modals/error-modal.tsx","webpack:///./public/components/graphs/prometheus-graph.tsx","webpack:///./packages/metal3-plugin/src/selectors/index.ts","webpack:///./public/components/namespace-bar.tsx","webpack:///./public/components/utils/horizontal-nav.tsx","webpack:///./packages/console-shared/src/components/dashboard/activity-card/ActivityBody.tsx","webpack:///./packages/helm-plugin/src/models/index.ts","webpack:///./public/components/utils/name-value-editor.jsx","webpack:///./public/components/factory/Table/active-columns-hook.ts","webpack:///./packages/service-binding-plugin/src/types.ts","webpack:///./public/components/pod-traffic.tsx","webpack:///./packages/console-app/src/components/quick-starts/loader/QuickStartsLoader.tsx","webpack:///./packages/console-app/src/status/index.ts","webpack:///./packages/console-shared/src/components/actions/LazyActionMenu.tsx","webpack:///./public/components/utils/list-dropdown.jsx","webpack:///./packages/console-dynamic-plugin-sdk/src/perspective/useActivePerspective.ts","webpack:///./packages/console-shared/src/hooks/useLabelsModal.tsx","webpack:///./public/components/monitoring/alerting.tsx","webpack:///./public/components/graphs/status.jsx","webpack:///./packages/console-shared/src/hooks/useAnnotationsModal.tsx","webpack:///./packages/patternfly/src/components/notification-drawer/notification-entry.tsx","webpack:///./packages/console-shared/src/components/virtualized-grid/VirtualizedGrid.tsx","webpack:///./packages/container-security/src/components/summary.tsx","webpack:///./packages/console-app/src/components/user-preferences/UserPreferencePage.tsx","webpack:///./packages/console-app/src/components/detect-namespace/useLastNamespace.ts","webpack:///./public/components/modals/tags.tsx","webpack:///./public/components/utils/build-utils.ts","webpack:///./public/components/modals/delete-modal.tsx","webpack:///./public/components/monitoring/dashboards/index.tsx","webpack:///./public/components/monitoring/silence-form.tsx","webpack:///./public/components/utils/value-from-pair.jsx","webpack:///./public/components/search.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/app/k8s/api-discovery/discovery-cache.ts","webpack:///./public/actions/features.gql","webpack:///./packages/console-app/src/components/dashboards-page/activity.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/hooks/usePrevious.ts","webpack:///./packages/console-app/src/components/detect-namespace/checkNamespaceExists.ts","webpack:///./packages/console-shared/src/hooks/useDetailsItemExtensionsForResource.ts","webpack:///./packages/console-shared/src/components/details-page/ExtensionDetailsItem.tsx","webpack:///./packages/knative-plugin/src/imgs/event-sink.svg","webpack:///./packages/knative-plugin/src/imgs/event-source.svg","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/dashboard-data-source.ts","webpack:///./public/components/monitoring/metrics.tsx","webpack:///./packages/console-app/src/components/user-preferences/synced-editor/index.ts","webpack:///./packages/console-shared/src/components/virtualized-grid/Cell.tsx","webpack:///./public/imgs/logos/apache.svg","webpack:///./public/imgs/logos/golang.svg","webpack:///./packages/gitops-plugin/src/models/index.ts","webpack:///./packages/knative-plugin/src/utils/kebab-actions.ts","webpack:///./packages/topology/src/operators/operatorResources.ts","webpack:///./public/components/search-filter-dropdown.tsx","webpack:///./public/components/create-resource.tsx","webpack:///./public/components/console-notifier.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/const.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/runtime/plugin-loader.ts","webpack:///./packages/topology/src/const.ts","webpack:///./public/components/routes.tsx","webpack:///./packages/console-app/src/components/pdb/PodDisruptionBudgetField.tsx","webpack:///./public/components/volumes-table.tsx","webpack:///./packages/console-shared/src/components/dashboard/status-card/StatusPopup.tsx","webpack:///./packages/knative-plugin/src/types.ts","webpack:///./packages/console-app/src/status/node.ts","webpack:///./packages/console-shared/src/hooks/promise-handler.ts","webpack:///./packages/operator-lifecycle-manager/src/components/operator-group.tsx","webpack:///./packages/console-shared/src/constants/resource.ts","webpack:///./public/components/markdown-view.tsx","webpack:///./packages/console-app/src/status/snapshot.ts","webpack:///./packages/console-plugin-shared/src/index.ts","webpack:///./packages/console-app/src/components/modals/service-binding/index.ts","webpack:///./packages/topology/src/models/index.ts","webpack:///./packages/console-shared/src/components/pod/PodRing.tsx","webpack:///./packages/console-shared/src/hooks/useCreateNamespaceModal.ts","webpack:///./packages/console-shared/src/hooks/useCreateProjectModal.ts","webpack:///./packages/console-shared/src/components/formik-fields/SelectorInputField.tsx","webpack:///./packages/console-shared/src/components/form-utils/index.ts","webpack:///./public/models/yaml-templates.ts","webpack:///./packages/console-shared/src/components/shortcuts/Shortcut.tsx","webpack:///./packages/metal3-plugin/src/hooks/useMaintenanceCapability.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/pvc.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/yaml-templates.ts","webpack:///./packages/console-app/src/components/pdb/utils/get-pdb-resources.ts","webpack:///./packages/knative-plugin/src/components/modals/index.ts","webpack:///./packages/console-shared/src/components/utils/index.ts","webpack:///./packages/console-shared/src/components/modals/index.ts","webpack:///./packages/console-shared/src/components/actions/index.ts","webpack:///./packages/service-binding-plugin/src/components/service-binding-utils/ServiceBindingAlerts.tsx","webpack:///./packages/rhoas-plugin/src/models/rhoas.ts","webpack:///./public/module/k8s/swagger.ts","webpack:///./packages/console-shared/src/utils/operator-utils.ts","webpack:///./packages/console-shared/src/components/shortcuts/index.ts","webpack:///./packages/topology/src/models/gitops-primer.ts","webpack:///./packages/console-shared/src/components/index.ts","webpack:///./public/components/utils/field-level-help.tsx","webpack:///./public/components/AsyncCodeEditor.tsx","webpack:///./packages/console-shared/src/hooks/select-list.ts","webpack:///./packages/console-shared/src/hooks/usePrometheusGate.ts","webpack:///./packages/console-shared/src/components/formik-fields/index.ts","webpack:///./packages/console-shared/src/components/synced-editor/useEditorType.ts","webpack:///./packages/console-shared/src/components/quick-search/QuickSearchIcon.tsx","webpack:///./packages/console-app/src/components/nodes/csr.ts","webpack:///./packages/console-shared/src/hooks/useK8sModels.ts","webpack:///./packages/console-shared/src/components/badges/index.ts","webpack:///./public/components/graphs/themes.ts","webpack:///./public/components/autocomplete.tsx","webpack:///./public/components/utils/managed-by.tsx","webpack:///./public/components/utils/truncate-middle.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/api/dynamic-core-api.ts","webpack:///./packages/knative-plugin/src/actions/add-event-source.tsx","webpack:///./packages/knative-plugin/src/imgs/channel.svg","webpack:///./packages/knative-plugin/src/actions/add-trigger.ts","webpack:///./packages/knative-plugin/src/actions/add-subscription.ts","webpack:///./packages/knative-plugin/src/actions/knatify.ts","webpack:///./public/components/monitoring/alertmanager/alertmanager-config.tsx","webpack:///./packages/console-shared/src/hooks/useCopyCodeModal.tsx","webpack:///./packages/console-shared/src/components/dropdown/index.ts","webpack:///./packages/console-shared/src/selectors/machine.ts","webpack:///./public/imgs/logos/helm.svg","webpack:///./public/imgs/logos/openshift.svg","webpack:///./packages/dev-console/src/components/topology/bindable-services/fetch-bindable-services-utils.ts","webpack:///./packages/metal3-plugin/src/constants/bare-metal-host.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/actions.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/add-actions.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/breadcrumbs.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/catalog.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/cluster-configuration.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/cluster-overview.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/context-providers.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/create-resource.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/dashboards.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/file-upload.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/import-environments.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/navigation.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/notification-alert.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/pages.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/perspectives.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/project-overview.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/redux.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/storage-class-provisioner.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/storage-provider.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/telemetry.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/topology-details.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/topology.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/user-preferences.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/node.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/extensions/create-project-modal.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/perspective/index.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/index.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/AppInitSDK.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/app/components/factory/ListPage/ListPageBody.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/app/core/index.ts","webpack:///./packages/console-shared/src/constants/pod.ts","webpack:///./packages/console-shared/src/constants/ui.ts","webpack:///./packages/console-plugin-sdk/src/typings/base.ts","webpack:///./packages/console-plugin-sdk/src/typings/dashboards.ts","webpack:///./packages/console-plugin-sdk/src/typings/features.ts","webpack:///./packages/console-plugin-sdk/src/typings/models.ts","webpack:///./packages/console-plugin-sdk/src/typings/overview.ts","webpack:///./packages/console-plugin-sdk/src/typings/pages.ts","webpack:///./packages/console-plugin-sdk/src/typings/horizontal-nav.ts","webpack:///./packages/console-plugin-sdk/src/typings/post-form-submit.ts","webpack:///./packages/console-plugin-sdk/src/typings/detail-page-bread-crumbs.ts","webpack:///./public/module/k8s/job.js","webpack:///./public/module/k8s/resource.ts","webpack:///./packages/console-plugin-sdk/src/api/withExtensions.tsx","webpack:///./public/module/k8s/cluster-operator.ts","webpack:///./public/module/k8s/template.ts","webpack:///./public/module/k8s/types.ts","webpack:///./packages/console-shared/src/components/error/fallbacks/ErrorBoundaryPage.tsx","webpack:///./packages/console-shared/src/components/error/fallbacks/ErrorBoundaryInline.tsx","webpack:///./packages/console-shared/src/components/badges/badge-factory.tsx","webpack:///./packages/console-shared/src/components/badges/EmptyStateResourceBadge.tsx","webpack:///./packages/console-shared/src/components/text/index.ts","webpack:///./packages/console-shared/src/components/text/ClampedText.tsx","webpack:///./packages/console-shared/src/hooks/document-listener.ts","webpack:///./packages/console-shared/src/hooks/fullscreen.ts","webpack:///./packages/console-shared/src/hooks/scroll.ts","webpack:///./packages/console-shared/src/hooks/useScrollShadows.ts","webpack:///./packages/console-shared/src/hooks/plugins-overview-tab-section.ts","webpack:///./packages/helm-plugin/src/models/helm.ts","webpack:///./public/components/utils/selector-input.jsx","webpack:///./public/components/utils/resource-log.tsx","webpack:///./public/components/factory/details.tsx","webpack:///./public/components/graphs/tooltip.tsx","webpack:///./public/components/secrets/create-secret/utils.ts","webpack:///./public/components/secrets/create-secret/const.ts","webpack:///./public/components/secrets/create-secret/SecretFormWrapper.tsx","webpack:///./public/components/secrets/create-secret/PullSecretForm.tsx","webpack:///./public/components/secrets/create-secret/PullSecretCredentialEntry.tsx","webpack:///./public/components/secrets/create-secret/CreateConfigSubform.tsx","webpack:///./public/components/secrets/create-secret/UploadConfigSubform.tsx","webpack:///./public/components/secrets/create-secret/WebHookSecretForm.tsx","webpack:///./public/components/secrets/create-secret/SourceSecretForm.tsx","webpack:///./public/components/secrets/create-secret/BasicAuthSubform.tsx","webpack:///./public/components/secrets/create-secret/SSHAuthSubform.tsx","webpack:///./public/components/secrets/create-secret/GenericSecretForm.tsx","webpack:///./public/components/secrets/create-secret/KeyValueEntryForm.tsx","webpack:///./public/components/secrets/create-secret/EditSecret.tsx","webpack:///./public/components/secrets/create-secret/CreateSecret.tsx","webpack:///./public/components/secrets/create-secret/DropableFileInput.tsx","webpack:///./public/components/secrets/create-secret/SecretSubForm.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sModels.ts","webpack:///./packages/console-app/src/components/user-preferences/namespace/NamespaceDropdown.tsx","webpack:///./packages/console-app/src/components/user-preferences/search/useExactSearch.ts","webpack:///./packages/console-shared/src/constants/auth.ts","webpack:///./public/components/factory/list-page.tsx","webpack:///./packages/console-shared/src/components/query-browser/QueryBrowser.tsx","webpack:///./public/components/utils/disabled.tsx","webpack:///./public/components/utils/toggle-play.jsx","webpack:///./public/components/utils/cloud-provider.js","webpack:///./public/components/utils/router-hooks.ts","webpack:///./public/components/utils/download-button.tsx","webpack:///./public/components/utils/entitlements.ts","webpack:///./public/components/utils/build-strategy.tsx","webpack:///./public/components/utils/build-hooks.tsx","webpack:///./public/components/utils/webhooks.tsx","webpack:///./public/components/utils/scroll-to-top-on-mount.tsx","webpack:///./public/components/utils/container-table.tsx","webpack:///./public/components/utils/simple-tab-nav.tsx","webpack:///./public/components/utils/request-size-input.tsx","webpack:///./public/components/utils/workload-pause.tsx","webpack:///./public/components/utils/list-input.tsx","webpack:///./public/components/utils/volume-type.tsx","webpack:///./public/components/utils/skeleton-catalog.tsx","webpack:///./public/components/utils/hint-block.tsx","webpack:///./public/components/utils/operator-backed-owner-references.tsx","webpack:///./public/components/utils/release-notes-link.tsx","webpack:///./packages/patternfly/src/components/index.ts","webpack:///./packages/patternfly/src/components/notification-drawer/index.ts","webpack:///./packages/patternfly/src/components/notification-drawer/notification-drawer.tsx","webpack:///./packages/patternfly/src/components/notification-drawer/notification-category.tsx","webpack:///./packages/console-shared/src/hooks/useBuildConfigsWatcher.ts","webpack:///./packages/console-shared/src/utils/grammar.ts","webpack:///./packages/console-shared/src/utils/pod-ring-utils.ts","webpack:///./packages/knative-plugin/src/actions/sink-source.ts","webpack:///./packages/console-shared/src/utils/pod-resource-utils.ts","webpack:///./public/components/monitoring/poll-interval-dropdown.tsx","webpack:///./public/components/monitoring/fetch-alerts.tsx","webpack:///./packages/console-shared/src/utils/validation/index.ts","webpack:///./packages/console-shared/src/utils/validation/validation.ts","webpack:///./packages/console-shared/src/utils/storage-utils.ts","webpack:///./packages/console-shared/src/utils/icon-utils.ts","webpack:///./packages/console-shared/src/utils/namespace.ts","webpack:///./packages/console-shared/src/utils/label-filter.ts","webpack:///./packages/console-shared/src/utils/alert-utils.ts","webpack:///./packages/console-shared/src/utils/helm-utils.ts","webpack:///./packages/console-shared/src/utils/sample-utils.ts","webpack:///./packages/console-shared/src/utils/multiselectdropdown.tsx","webpack:///./packages/console-shared/src/utils/xterm-addon-fullscreen.ts","webpack:///./packages/console-shared/src/utils/yup-validations.ts","webpack:///./packages/console-shared/src/utils/console-plugin.ts","webpack:///./packages/console-shared/src/hooks/useJobsForCronJobWatcher.ts","webpack:///./packages/console-shared/src/hooks/usePodsWatcher.ts","webpack:///./packages/console-shared/src/hooks/useReplicationControllersWatcher.ts","webpack:///./packages/console-shared/src/hooks/useRoutesWatcher.ts","webpack:///./packages/console-shared/src/hooks/csv-watch-hook.ts","webpack:///./packages/console-shared/src/hooks/useTabbedTableBreadcrumb.ts","webpack:///./packages/console-shared/src/hooks/usePinnedResources.ts","webpack:///./packages/console-shared/src/hooks/useIsMobile.ts","webpack:///./packages/console-shared/src/hooks/useBoundingClientRect.ts","webpack:///./packages/console-shared/src/hooks/useEventListener.ts","webpack:///./packages/console-shared/src/components/modal/Modal.tsx","webpack:///./packages/console-shared/src/hooks/useCopyLoginCommands.ts","webpack:///./packages/console-shared/src/components/contextMenu/index.ts","webpack:///./packages/console-shared/src/components/contextMenu/PopupKebabMenu.tsx","webpack:///./packages/console-shared/src/components/dropdown/dropdown-with-switch/DropdownWithSwitch.tsx","webpack:///./packages/console-shared/src/selectors/machineSet.ts","webpack:///./packages/console-shared/src/selectors/namespace.ts","webpack:///./packages/console-shared/src/selectors/storage.ts","webpack:///./packages/console-shared/src/components/form-utils/FormFooter.tsx","webpack:///./packages/console-shared/src/components/form-utils/FormHeader.tsx","webpack:///./packages/console-shared/src/components/form-utils/PageBody.tsx","webpack:///./packages/console-shared/src/components/form-utils/FlexForm.tsx","webpack:///./packages/console-shared/src/components/form-utils/ActionGroupWithIcons.tsx","webpack:///./packages/console-shared/src/components/form-utils/FormBody.tsx","webpack:///./packages/console-shared/src/components/formik-fields/CheckboxField.tsx","webpack:///./packages/console-shared/src/components/status/Status.tsx","webpack:///./packages/console-shared/src/components/status/NodeUnschedulableStatus.tsx","webpack:///./packages/console-shared/src/components/formik-fields/DropdownField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/DroppableFileInputField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/EnvironmentField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/FormSelectField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/multi-column-field/MultiColumnField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/NSDropdownField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/NumberSpinnerField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/ResourceDropdownField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/ResourceLimitField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/SwitchField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/TextAreaField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/CodeEditorField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/item-selector-field/ItemSelectorField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/InputGroupField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/text-column-field/TextColumnField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/DynamicFormField.tsx","webpack:///./packages/console-shared/src/components/formik-fields/SyncedEditorField.tsx","webpack:///./packages/console-app/src/components/user-preferences/synced-editor/usePreferredCreateEditMethod.ts","webpack:///./packages/console-shared/src/components/formik-fields/SelectInputField.tsx","webpack:///./packages/console-shared/src/components/getting-started/GettingStartedGrid.tsx","webpack:///./packages/console-shared/src/components/getting-started/GettingStartedCard.tsx","webpack:///./packages/console-shared/src/components/getting-started/RestoreGettingStartedButton.tsx","webpack:///./packages/console-shared/src/components/getting-started/QuickStartGettingStartedCard.tsx","webpack:///./packages/console-app/src/components/quick-starts/utils/useQuickStarts.ts","webpack:///./packages/console-shared/src/components/getting-started/GettingStartedExpandableGrid.tsx","webpack:///./packages/console-shared/src/components/lists/index.ts","webpack:///./packages/console-shared/src/components/lists/DetailPropertyList.tsx","webpack:///./packages/console-shared/src/components/lists/DetailPropertyListItem.tsx","webpack:///./packages/console-shared/src/components/log/index.ts","webpack:///./packages/console-shared/src/components/log/LogSnippet.tsx","webpack:///./packages/console-shared/src/components/pod/index.ts","webpack:///./packages/console-shared/src/components/shortcuts/ShortcutTable.tsx","webpack:///./packages/console-shared/src/components/drawer/index.ts","webpack:///./packages/console-shared/src/components/health-checks/index.ts","webpack:///./packages/console-shared/src/components/health-checks/HealthChecksAlert.tsx","webpack:///./packages/console-shared/src/components/alerts/index.ts","webpack:///./packages/console-shared/src/components/alerts/AlertSeverityIcon.tsx","webpack:///./packages/console-shared/src/components/popover/index.ts","webpack:///./packages/console-shared/src/components/popover/Popover.tsx","webpack:///./packages/console-shared/src/components/popover/const.ts","webpack:///./packages/console-shared/src/components/layout/index.ts","webpack:///./packages/console-shared/src/components/layout/PageLayout.tsx","webpack:///./packages/console-shared/src/components/utils/ConsolePluginRadioInputs.tsx","webpack:///./packages/console-shared/src/components/utils/ConsolePluginWarning.tsx","webpack:///./packages/console-shared/src/components/hpa/index.ts","webpack:///./packages/console-shared/src/components/hpa/DeleteHPAModal.tsx","webpack:///./packages/console-shared/src/components/multi-tab-list/index.ts","webpack:///./packages/console-shared/src/components/multi-tab-list/MultiTabListPage.tsx","webpack:///./packages/console-shared/src/components/spotlight/index.ts","webpack:///./packages/console-shared/src/components/spotlight/Spotlight.tsx","webpack:///./packages/console-shared/src/components/custom-resource-list/index.ts","webpack:///./packages/console-shared/src/components/custom-resource-list/CustomResourceList.tsx","webpack:///./packages/console-shared/src/components/toast/useToast.ts","webpack:///./packages/console-shared/src/components/markdown-extensions/index.ts","webpack:///./packages/console-shared/src/components/markdown-extensions/MarkdownCopyClipboard.tsx","webpack:///./packages/console-shared/src/components/markdown-extensions/MarkdownExecuteSnippet.tsx","webpack:///./packages/console-shared/src/components/markdown-extensions/inline-clipboard-extension.ts","webpack:///./packages/console-shared/src/components/markdown-extensions/inline-execute-extension.ts","webpack:///./packages/console-shared/src/components/markdown-extensions/multiline-clipboard-extension.ts","webpack:///./packages/console-shared/src/components/markdown-extensions/multiline-execute-extension.ts","webpack:///./packages/console-shared/src/components/actions/menu/ActionMenu.tsx","webpack:///./packages/console-shared/src/components/quick-search/index.ts","webpack:///./packages/console-shared/src/components/quick-search/QuickSearchController.tsx","webpack:///./packages/console-shared/src/components/catalog/catalog-view/index.ts","webpack:///./packages/console-plugin-shared/src/components/index.ts","webpack:///./packages/console-plugin-shared/src/components/OverviewPage/index.ts","webpack:///./packages/console-plugin-shared/src/components/OverviewPage/OverviewDetailItem.tsx","webpack:///./packages/console-plugin-shared/src/components/Markdown/index.ts","webpack:///./packages/console-plugin-shared/src/components/Markdown/MarkdownView.tsx","webpack:///./packages/console-plugin-shared/src/datetime/index.ts","webpack:///./packages/console-shared/src/components/catalog/details/index.ts","webpack:///./packages/console-shared/src/components/catalog/hooks/index.ts","webpack:///./packages/console-shared/src/components/catalog/hooks/useCatalogCategories.ts","webpack:///./packages/console-shared/src/components/catalog/service/index.ts","webpack:///./packages/console-shared/src/components/catalog/service/CatalogServiceProvider.tsx","webpack:///./packages/console-shared/src/components/catalog/CatalogController.tsx","webpack:///./packages/console-shared/src/components/progressive-list/index.ts","webpack:///./packages/console-shared/src/components/progressive-list/ProgressiveList.tsx","webpack:///./packages/console-shared/src/types/index.ts","webpack:///./packages/console-shared/src/sorts/index.ts","webpack:///./packages/console-shared/src/sorts/nodes.ts","webpack:///./packages/console-shared/src/sorts/pvc.ts","webpack:///./packages/console-shared/src/sorts/snapshot.ts","webpack:///./packages/console-shared/src/hoc/index.ts","webpack:///./packages/console-shared/src/hoc/withPostFormSubmissionCallback.tsx","webpack:///./packages/console-shared/src/hoc/withUserSettingsCompatibility.tsx","webpack:///./packages/console-shared/src/hoc/withUserSettings.tsx","webpack:///./packages/console-shared/src/hoc/withActivePerspective.tsx","webpack:///./packages/console-shared/src/hoc/withTelemetry.tsx","webpack:///./packages/dev-console/src/components/topology/bindable-services/bindable-service-resources.ts","webpack:///./packages/dev-console/src/components/topology/bindable-services/models.ts","webpack:///./packages/gitops-plugin/src/models/gitops.ts","webpack:///./packages/metal3-plugin/src/constants/node-maintenance.ts","webpack:///./packages/metal3-plugin/src/selectors/node-maintenance.ts","webpack:///./packages/metal3-plugin/src/selectors/baremetal-hosts.ts","webpack:///./packages/topology/src/models/application.ts","webpack:///./packages/console-shared/src/hooks/create-resource-hook.ts","webpack:///./packages/console-app/src/components/tour/GuidedTour.tsx","webpack:///./packages/console-app/src/components/tour/GuidedTourMastheadTrigger.tsx","webpack:///./packages/console-app/src/components/tabs/Tabs.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/useCloudShellNamespace.ts","webpack:///./packages/console-app/src/components/detect-perspective/useValuesForPerspectiveContext.ts","webpack:///./packages/console-app/src/components/user-preferences/perspective/index.ts","webpack:///./packages/console-app/src/components/user-preferences/perspective/PerspectiveDropdown.tsx","webpack:///./packages/console-app/src/components/user-preferences/language/LanguageDropdown.tsx","webpack:///./packages/console-app/src/components/user-preferences/lightspeed/useHideLightspeed.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/api/internal-api.ts","webpack:///./packages/console-app/src/components/lightspeed/Lightspeed.tsx","webpack:///./packages/console-plugin-sdk/src/utils/useTranslatedExtensions.ts","webpack:///./packages/console-plugin-sdk/src/utils/useTranslationExt.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/k8s/api-discovery/api-discovery.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/utils/k8s/k8s-get-resource.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/useReduxStore.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/app/k8s/reducers/k8s.ts","webpack:///./public/graphql/client.gql","webpack:///./packages/console-app/src/components/user-preferences/UserPreferenceCheckboxField.tsx","webpack:///./packages/console-shared/src/hooks/useUserSettingsLocalStorage.ts","webpack:///./packages/console-app/src/components/user-preferences/UserPreferenceCustomField.tsx","webpack:///./packages/console-app/src/components/user-preferences/UserPreferenceDropdownField.tsx","webpack:///./public/components/utils/useToggleLineBuffer.ts","webpack:///./public/propTypes.ts","webpack:///./public/components/routes/route-metrics.tsx","webpack:///./public/imgs/restricted-sign.svg","webpack:///./public/components/overview/constants.ts","webpack:///./public/components/modals/add-secret-to-workload.tsx","webpack:///./packages/console-app/src/components/detect-namespace/getValueForNamespace.ts","webpack:///./public/components/useRowFilterFix.ts","webpack:///./public/components/useLabelSelectionFix.ts","webpack:///./public/components/useSearchFilters.ts","webpack:///./public/components/cluster-settings/filterNonUpgradableResources.ts","webpack:///./public/components/factory/details-breadcrumb-resolver.tsx","webpack:///./public/components/ingress.jsx","webpack:///./public/components/factory/table-data-hook.ts","webpack:///./public/components/utils/event-stream.tsx","webpack:///./public/components/pod-logs.jsx","webpack:///./public/components/factory/Table/VirtualizedTableBody.tsx","webpack:///./packages/console-app/src/components/pdb/AvailabilityRequirement.tsx","webpack:///./public/components/utils/resource-metrics.tsx","webpack:///./public/components/build-logs.jsx","webpack:///./packages/console-shared/src/components/actions/loader/ActionsLoader.tsx","webpack:///./packages/console-shared/src/components/actions/loader/ActionsHookResolver.tsx","webpack:///./packages/console-shared/src/constants/monitoring.ts","webpack:///./public/components/monitoring/dashboards/bar-chart.tsx","webpack:///./public/components/monitoring/dashboards/graph.tsx","webpack:///./public/components/monitoring/dashboards/single-stat.tsx","webpack:///./public/components/monitoring/dashboards/table.tsx","webpack:///./public/components/monitoring/dashboards/timespan-dropdown.tsx","webpack:///./public/components/monitoring/dashboards/custom-time-range-modal.tsx","webpack:///./public/components/monitoring/hooks/useIsVisible.ts","webpack:///./public/components/monitoring/dashboards/useFetchDashboards.ts","webpack:///./public/components/monitoring/targets.tsx","webpack:///./public/components/monitoring/alertmanager/alertmanager-yaml-editor.tsx","webpack:///./public/imgs/network-policy-samples/1-deny-other-namespaces.svg","webpack:///./public/imgs/network-policy-samples/2-limit-certain-apps.svg","webpack:///./public/imgs/network-policy-samples/3-allow-ingress.svg","webpack:///./public/imgs/network-policy-samples/4-default-deny-all.svg","webpack:///./public/imgs/network-policy-samples/5-web-allow-external.svg","webpack:///./public/imgs/network-policy-samples/6-web-db-allow-all-ns.svg","webpack:///./public/imgs/network-policy-samples/7-web-allow-production.svg","webpack:///./packages/console-shared/src/components/dropdown/dropdown-with-switch/DropdownWithSwitchMenu.tsx","webpack:///./packages/console-shared/src/components/dropdown/dropdown-with-switch/DropdownWithSwitchGroups.tsx","webpack:///./packages/console-shared/src/components/dropdown/dropdown-with-switch/DropdownWithSwitchToggle.tsx","webpack:///./packages/console-shared/src/components/formik-fields/multi-column-field/multicolumn-field-utils.ts","webpack:///./packages/console-shared/src/components/formik-fields/multi-column-field/MultiColumnFieldHeader.tsx","webpack:///./packages/console-shared/src/components/formik-fields/multi-column-field/MultiColumnFieldRow.tsx","webpack:///./packages/console-shared/src/components/formik-fields/item-selector-field/SelectorCard.tsx","webpack:///./packages/console-shared/src/components/formik-fields/text-column-field/TextColumnItem.tsx","webpack:///./packages/console-shared/src/components/formik-fields/text-column-field/TextColumnItemWithDnd.tsx","webpack:///./packages/console-app/src/components/quick-starts/loader/QuickStartPermissionChecker.tsx","webpack:///./packages/console-app/src/components/quick-starts/utils/useQuickStartPermission.ts","webpack:///./packages/console-shared/src/hooks/useForceUpdate.ts","webpack:///./packages/console-shared/src/components/drawer/DraggableCoreIFrameFix.tsx","webpack:///./packages/console-shared/src/components/virtualized-grid/Grid.tsx","webpack:///./packages/console-shared/src/components/virtualized-grid/GroupByFilterGrid.tsx","webpack:///./packages/console-shared/src/components/spotlight/InteractiveSpotlight.tsx","webpack:///./packages/console-shared/src/components/spotlight/StaticSpotlight.tsx","webpack:///./packages/console-shared/src/components/popper/Tippy.tsx","webpack:///./packages/console-shared/src/components/quick-search/QuickSearchModal.tsx","webpack:///./packages/console-shared/src/components/quick-search/QuickSearchModalBody.tsx","webpack:///./packages/console-shared/src/components/quick-search/QuickSearchBar.tsx","webpack:///./packages/console-shared/src/components/quick-search/QuickSearchContent.tsx","webpack:///./packages/console-shared/src/components/quick-search/QuickSearchDetails.tsx","webpack:///./public/imgs/logos/3scale.svg","webpack:///./public/imgs/logos/aerogear.svg","webpack:///./public/imgs/logos/amq.svg","webpack:///./public/imgs/logos/angularjs.svg","webpack:///./public/imgs/logos/ansible.svg","webpack:///./public/imgs/logos/beaker.svg","webpack:///./public/imgs/logos/build-icon.svg","webpack:///./public/imgs/logos/camel.svg","webpack:///./public/imgs/logos/capedwarf.svg","webpack:///./public/imgs/logos/cassandra.svg","webpack:///./public/imgs/logos/clojure.svg","webpack:///./public/imgs/logos/codeigniter.svg","webpack:///./public/imgs/logos/cordova.png","webpack:///./public/imgs/logos/datagrid.svg","webpack:///./public/imgs/logos/datavirt.svg","webpack:///./public/imgs/logos/debian.svg","webpack:///./public/imgs/logos/decisionserver.svg","webpack:///./public/imgs/logos/django.svg","webpack:///./public/imgs/logos/dotnet.svg","webpack:///./public/imgs/logos/drupal.svg","webpack:///./public/imgs/logos/eap.svg","webpack:///./public/imgs/logos/elastic.svg","webpack:///./public/imgs/logos/erlang.svg","webpack:///./public/imgs/logos/fedora.svg","webpack:///./public/imgs/logos/freebsd.svg","webpack:///./public/imgs/logos/git.svg","webpack:///./public/imgs/logos/github.svg","webpack:///./public/imgs/logos/gitlab.svg","webpack:///./public/imgs/logos/gitea.svg","webpack:///./public/imgs/logos/glassfish.svg","webpack:///./public/imgs/logos/grails.svg","webpack:///./public/imgs/logos/hadoop.svg","webpack:///./public/imgs/logos/haproxy.svg","webpack:///./public/imgs/logos/infinispan.svg","webpack:///./public/imgs/logos/jboss.svg","webpack:///./public/imgs/logos/jenkins.svg","webpack:///./public/imgs/logos/jetty.svg","webpack:///./public/imgs/logos/joomla.svg","webpack:///./public/imgs/logos/jruby.svg","webpack:///./public/imgs/logos/js.svg","webpack:///./public/imgs/logos/knative.svg","webpack:///./public/imgs/logos/kubevirt.svg","webpack:///./public/imgs/logos/laravel.svg","webpack:///./public/imgs/logos/load-balancer.svg","webpack:///./public/imgs/logos/mariadb.svg","webpack:///./public/imgs/logos/mediawiki.svg","webpack:///./public/imgs/logos/memcached.svg","webpack:///./public/imgs/logos/mongodb.svg","webpack:///./public/imgs/logos/mssql.svg","webpack:///./public/imgs/logos/mysql-database.svg","webpack:///./public/imgs/logos/nginx.svg","webpack:///./public/imgs/logos/nodejs.svg","webpack:///./public/imgs/logos/openliberty.svg","webpack:///./public/imgs/logos/openstack.svg","webpack:///./public/imgs/logos/other-linux.svg","webpack:///./public/imgs/logos/other-unknown.svg","webpack:///./public/imgs/logos/perl.svg","webpack:///./public/imgs/logos/phalcon.svg","webpack:///./public/imgs/logos/php.svg","webpack:///./public/imgs/logos/play.svg","webpack:///./public/imgs/logos/postgresql.svg","webpack:///./public/imgs/logos/processserver.svg","webpack:///./public/imgs/logos/python.svg","webpack:///./public/imgs/logos/quarkus.svg","webpack:///./public/imgs/logos/rabbitmq.svg","webpack:///./public/imgs/logos/rails.svg","webpack:///./public/imgs/logos/react.svg","webpack:///./public/imgs/logos/redis.svg","webpack:///./public/imgs/logos/rh-integration.svg","webpack:///./public/imgs/logos/rh-spring-boot.svg","webpack:///./public/imgs/logos/rh-tomcat.svg","webpack:///./public/imgs/logos/ruby.svg","webpack:///./public/imgs/logos/rust.svg","webpack:///./public/imgs/logos/scala.svg","webpack:///./public/imgs/logos/shadowman.svg","webpack:///./public/imgs/logos/spring.svg","webpack:///./public/imgs/logos/spring-boot.svg","webpack:///./public/imgs/logos/sso.svg","webpack:///./public/imgs/logos/stackoverflow.svg","webpack:///./public/imgs/logos/suse.svg","webpack:///./public/imgs/logos/symfony.svg","webpack:///./public/imgs/logos/tomcat.svg","webpack:///./public/imgs/logos/ubuntu.svg","webpack:///./public/imgs/logos/vertx.svg","webpack:///./public/imgs/logos/wildfly.svg","webpack:///./public/imgs/logos/windows.svg","webpack:///./public/imgs/logos/wordpress.svg","webpack:///./public/imgs/logos/xamarin.svg","webpack:///./public/imgs/logos/zend.svg","webpack:///./public/imgs/logos/operator.svg","webpack:///./packages/console-shared/src/components/catalog/catalog-view/CatalogFilters.tsx","webpack:///./packages/console-shared/src/components/quick-search/QuickSearchList.tsx","webpack:///./packages/dev-console/src/components/guided-tour/index.ts","webpack:///./packages/gitops-plugin/src/const.ts","webpack:///./packages/insights-plugin/src/components/InsightsPopup/status.ts","webpack:///./packages/knative-plugin/src/topology/topology-plugin.ts","webpack:///./packages/operator-lifecycle-manager/src/components/dashboard/utils.ts","webpack:///./packages/topology/src/components/graph-view/components/nodes/decorators/defaultDecoratorsPlugin.ts","webpack:///./packages/topology/src/operators/operatorsTopologyPlugin.ts","webpack:///./packages/topology/src/operators/actions/index.ts","webpack:///./public/reducers/observe.ts","webpack:///./public/components/app-contents.tsx","webpack:///./public/components/global-notifications.jsx","webpack:///./public/components/impersonate-notifier.jsx","webpack:///./public/components/kube-admin-notifier.jsx","webpack:///./packages/console-app/src/hooks/usePluginRoutes.tsx","webpack:///./public/components/global-telemetry-notifications.tsx","webpack:///./public/components/masthead-toolbar.jsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/CloudShellMastheadButton.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/CloudShellMastheadAction.tsx","webpack:///./public/components/about-modal.tsx","webpack:///./public/module/status.js","webpack:///./packages/console-app/src/components/tour/utils.ts","webpack:///./packages/console-app/src/components/tour/TourStepComponent.tsx","webpack:///./packages/console-app/src/components/tour/steps/StepBadge.tsx","webpack:///./packages/console-app/src/components/tour/steps/StepContent.tsx","webpack:///./packages/console-app/src/components/tour/steps/StepFooter.tsx","webpack:///./packages/console-app/src/components/tour/steps/StepHeader.tsx","webpack:///./packages/console-app/src/components/nav/ClusterMenu.tsx","webpack:///./packages/console-app/src/components/nav/ClusterMenuToggle.tsx","webpack:///./public/components/feedback-local.jsx","webpack:///./public/imgs/okd-logo.svg","webpack:///./public/imgs/openshift-online-logo.svg","webpack:///./public/imgs/openshift-dedicated-logo.svg","webpack:///./public/imgs/openshift-service-on-aws-logo.svg","webpack:///./packages/console-app/src/components/nav/index.tsx","webpack:///./packages/console-app/src/components/nav/NavHeader.tsx","webpack:///./public/imgs/ACM-icon.svg","webpack:///./packages/console-app/src/components/nav/PerspectiveNav.tsx","webpack:///./packages/console-app/src/components/nav/PinnedResource.tsx","webpack:///./packages/console-app/src/components/nav/PluginNavItem.tsx","webpack:///./packages/console-app/src/components/nav/NavSection.tsx","webpack:///./packages/console-app/src/components/nav/useNavExtensionsForSection.ts","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/CloudShell.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/CloudShellDrawer.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/MinimizeRestoreButton.tsx","webpack:///./packages/console-app/src/components/tabs/index.ts","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/CloudShellTerminal.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/CloudShellExec.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/ExecuteCommand.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/Terminal.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/setup/CloudShellAdminSetup.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/setup/AdminNamespaceSection.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/setup/CloudShellAdvancedOption.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/setup/ImageSection.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/setup/TimeoutSection.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/setup/NamespaceSection.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/setup/CloudShellDeveloperSetup.tsx","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/useCloudShellWorkspace.ts","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/useActivityTick.ts","webpack:///./packages/webterminal-plugin/src/components/cloud-shell/CloudShellTab.tsx","webpack:///./packages/console-app/src/components/detect-perspective/DetectPerspective.tsx","webpack:///./packages/console-app/src/components/detect-perspective/PerspectiveDetector.tsx","webpack:///./packages/console-app/src/components/user-preferences/UserPreferenceForm.tsx","webpack:///./packages/console-app/src/components/user-preferences/UserPreferenceField.tsx","webpack:///./packages/console-app/src/components/user-preferences/utils/getUserPreferenceGroups.ts","webpack:///./packages/console-app/src/components/detect-perspective/useLastPerspective.ts","webpack:///./packages/console-app/src/components/detect-namespace/DetectNamespace.tsx","webpack:///./packages/console-app/src/components/detect-language/DetectLanguage.tsx","webpack:///./packages/console-app/src/components/flags/FeatureFlagExtensionLoader.tsx","webpack:///./packages/console-app/src/components/flags/FeatureFlagExtensionHookResolver.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/runtime/plugin-init.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/build-types.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/shared-modules-init.ts","webpack:///./packages/console-shared/src/components/dashboard/activity-card/EventItem.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/runtime/plugin-dependencies.ts","webpack:///./packages/console-dynamic-plugin-sdk/src/runtime/plugin-manifest.ts","webpack:///./packages/console-app/src/components/quick-starts/QuickStartDrawerAsync.tsx","webpack:///./packages/console-app/src/components/admission-webhook-warnings/AdmissionWebhookWarningNotifications.tsx","webpack:///./packages/console-shared/src/hooks/usePackageManifestCheck.ts","webpack:///./packages/console-shared/src/components/dashboard/status-card/HealthBody.tsx","webpack:///./packages/console-shared/src/components/dashboard/utilization-card/UtilizationBody.tsx","webpack:///./packages/console-shared/src/components/dashboard/utilization-card/UtilizationDurationDropdown.tsx","webpack:///./packages/console-shared/src/components/dashboard/DashboardGrid.tsx","webpack:///./packages/console-shared/src/components/dashboard/status-card/AlertsBody.tsx","webpack:///./packages/console-shared/src/components/dashboard/status-card/AlertItem.tsx","webpack:///./packages/console-shared/src/components/dashboard/status-card/HealthItem.tsx","webpack:///./packages/console-shared/src/components/dashboard/inventory-card/InventoryItem.tsx","webpack:///./packages/console-shared/src/components/dashboard/details-card/DetailsBody.tsx","webpack:///./packages/console-shared/src/components/dashboard/utilization-card/UtilizationItem.tsx","webpack:///./packages/console-shared/src/components/dashboard/activity-card/ActivityItem.tsx","webpack:///./public/components/AsyncResourceYAMLEditor.tsx","webpack:///./packages/console-dynamic-plugin-sdk/src/lib-internal.ts","webpack:///./packages/console-shared/src/hooks/useDeleteModal.tsx","webpack:///./public/components/app.jsx","webpack:///./packages/console-app/src/plugin.tsx","webpack:///./packages/console-telemetry-plugin/src/plugin.ts","webpack:///./packages/container-security/src/plugin.ts","webpack:///./packages/dev-console/src/plugin.tsx","webpack:///./packages/gitops-plugin/src/plugin.ts","webpack:///./packages/helm-plugin/src/plugin.ts","webpack:///./packages/insights-plugin/src/plugin.tsx","webpack:///./packages/knative-plugin/src/plugin.tsx","webpack:///./packages/local-storage-operator-plugin/src/plugin.ts","webpack:///./packages/metal3-plugin/src/plugin.tsx","webpack:///./packages/network-attachment-definition-plugin/src/plugin.ts","webpack:///./packages/operator-lifecycle-manager-v1/src/plugin.tsx","webpack:///./packages/operator-lifecycle-manager/src/plugin.tsx","webpack:///./packages/pipelines-plugin/src/plugin.tsx","webpack:///./packages/rhoas-plugin/src/plugin.ts","webpack:///./packages/service-binding-plugin/src/plugin.ts","webpack:///./packages/shipwright-plugin/src/plugin.ts","webpack:///./packages/topology/src/plugin.tsx","webpack:///./packages/vsphere-plugin/src/plugin.ts","webpack:///./packages/webterminal-plugin/src/plugin.ts","webpack:///./public/components/service.jsx","webpack:///./packages/console-shared/src/hooks/useDashboardResources.ts","webpack:///./packages/console-dynamic-plugin-sdk/generated/schema/plugin-manifest.cjs"],"names":["codeRefSymbol","Symbol","applyCodeRefSymbol","ref","isEncodedCodeRef","obj","Object","getOwnPropertyNames","$codeRef","isExecutableCodeRef","getOwnPropertySymbols","codeRefErrorSymbol","resolveEncodedCodeRefs","extensions","entryModule","pluginID","errorCallback","map","e","properties","key","loader","moduleName","exportName","value","match","parseEncodedCodeRefValue","requestedModule","console","error","get","loadReferencedObject","defineProperty","resolveExtension","extension","valueResolutions","isCodeRefError","getCodeRefError","push","then","resolvedValue","warn","catch","setCodeRefError","PrometheusModel","kind","label","labelKey","labelPlural","labelPluralKey","apiGroup","apiVersion","abbr","namespaced","crd","plural","propagationPolicy","ServiceMonitorModel","PodMonitorModel","AlertmanagerModel","ServiceModel","id","PodModel","ContainerModel","DaemonSetModel","ReplicationControllerModel","HorizontalPodAutoscalerModel","ServiceAccountModel","ReplicaSetModel","DeploymentModel","DeploymentConfigModel","BuildConfigModel","BuildModel","TemplateModel","TemplateInstanceModel","ImageStreamModel","ImageStreamTagModel","ImageStreamImportsModel","JobModel","NodeModel","CertificateSigningRequestModel","EventModel","ComponentStatusModel","NamespaceModel","ProjectModel","ProjectRequestModel","IngressModel","RouteModel","ConfigMapModel","SecretModel","ClusterRoleBindingModel","ClusterRoleModel","RoleBindingModel","RoleModel","SelfSubjectAccessReviewModel","SelfSubjectReviewModel","ResourceAccessReviewsModel","LocalResourceAccessReviewsModel","PersistentVolumeModel","PersistentVolumeClaimModel","StatefulSetModel","ResourceQuotaModel","ClusterResourceQuotaModel","AppliedClusterResourceQuotaModel","NetworkPolicyModel","CustomResourceDefinitionModel","CronJobModel","StorageClassModel","LimitRangeModel","APIServiceModel","UserModel","GroupModel","MachineModel","MachineSetModel","MachineDeploymentModel","MachineConfigPoolModel","MachineConfigModel","MachineAutoscalerModel","MachineHealthCheckModel","ClusterOperatorModel","ClusterVersionModel","CSIDriverModel","ClusterAutoscalerModel","OAuthModel","InfrastructureModel","NetworkOperatorConfigModel","ConsoleOperatorConfigModel","ConsoleLinkModel","ConsoleCLIDownloadModel","ConsoleNotificationModel","ConsoleExternalLogLinkModel","ConsoleYAMLSampleModel","VolumeSnapshotModel","VolumeSnapshotClassModel","VolumeSnapshotContentModel","ConsolePluginModel","CloudCredentialModel","AuthenticationModel","MultiNetworkPolicyModel","healthStateMessage","state","t","OK","UNKNOWN","PROGRESS","UPDATING","WARNING","ERROR","LOADING","UPGRADABLE","NOT_AVAILABLE","healthStateMapping","priority","health","icon","title","className","ActionType","getActiveNamespace","getState","UI","getActiveUserName","username","getNamespaceMetric","ns","metric","metrics","getIn","metadata","name","getPodMetric","pod","namespace","getNodeMetric","node","getPVCMetric","pvc","formatNamespaceRoute","activeNamespace","originalPath","location","forceList","path","substr","window","SERVER_FLAGS","basePath","length","parts","split","filter","p","prefix","shift","previousNS","slice","join","search","hash","setCurrentLocation","SetCurrentLocation","setServiceLevel","serviceLevel","daysRemaining","clusterID","trialDateEnd","hasSecretAccess","SetServiceLevel","setActiveApplication","application","SetActiveApplication","setActiveNamespace","trim","sessionStorage","setItem","SetActiveNamespace","startImpersonate","dispatch","textEncoder","TextEncoder","info","module","imp","subprotocols","encodedName","encode","String","fromCharCode","apply","replace","close","stopImpersonate","sortList","listId","field","func","orderBy","SortList","selectOverviewDetailsTab","tab","SelectOverviewDetailsTab","updateOverviewMetrics","UpdateOverviewMetrics","updateTimestamps","lastTick","UpdateTimestamps","notificationDrawerToggleExpanded","NotificationDrawerToggleExpanded","setPodMetrics","podMetrics","SetPodMetrics","setNamespaceMetrics","namespaceMetrics","SetNamespaceMetrics","setNodeMetrics","nodeMetrics","SetNodeMetrics","setPVCMetrics","pvcMetrics","SetPVCMetrics","setUtilizationDuration","duration","SetUtilizationDuration","setUtilizationDurationSelectedKey","SetUtilizationDurationSelectedKey","setUtilizationDurationEndTime","endTime","SetUtilizationDurationEndTime","setShowOperandsInAllNamespaces","SetShowOperandsInAllNamespaces","setDeprecatedPackage","SetDeprecatedPackage","setDeprecatedChannel","SetDeprecatedChannel","setDeprecatedVersion","SetDeprecatedVersion","PROMETHEUS_BASE_PATH","prometheusBaseURL","AlertResource","RuleResource","SilenceResource","labelsToParams","labels","v","k","encodeURIComponent","alertURL","alert","ruleID","getAlertsAndRules","data","perspective","groups","rules","g","type","r","file","query","forEach","rule","alerts","a","alertState","silenceState","s","status","silenceMatcherEqualitySymbol","isEqual","isRegex","alertDescription","annotations","description","message","alertname","isSilenced","silence","Firing","Silenced","includes","matchers","m","alertValue","isMatch","RegExp","test","alertSeverityOrder","severity","Critical","Warning","None","alertingRuleStateOrder","counts","Pending","Number","MAX_SAFE_INTEGER","targetSource","target","prometheus","Platform","User","dashboardsPatchVariable","patch","DashboardsPatchVariable","dashboardsPatchAllVariables","variables","DashboardsPatchAllVariables","DashboardsClearVariables","dashboardsSetEndTime","DashboardsSetEndTime","dashboardsSetPollInterval","pollInterval","DashboardsSetPollInterval","dashboardsSetTimespan","timespan","DashboardsSetTimespan","dashboardsVariableOptionsLoaded","newOptions","DashboardsVariableOptionsLoaded","alertingLoading","AlertingSetData","loaded","loadError","alertingLoaded","alertingErrored","alertingSetRules","AlertingSetRules","toggleGraphs","ToggleGraphs","queryBrowserDeleteAllQueries","QueryBrowserDeleteAllQueries","queryBrowserDeleteAllSeries","QueryBrowserDeleteAllSeries","queryBrowserPatchQuery","index","QueryBrowserPatchQuery","queryBrowserSetTimespan","QueryBrowserSetTimespan","queryBrowserToggleAllSeries","QueryBrowserToggleAllSeries","queryBrowserToggleSeries","QueryBrowserToggleSeries","setAlertCount","alertCount","SetAlertCount","ConfigurationModel","color","KnativeServingModel","RevisionModel","DomainMappingModel","EventingSubscriptionModel","EventingBrokerModel","EventingTriggerModel","CamelIntegrationModel","KafkaModel","KafkaTopicModel","CamelKameletBindingModel","CamelKameletModel","KafkaSinkModel","CONST","freeze","PULL_SECRET_TYPE","PULL_SECRET_DATA","ANNOTATIONS","displayName","providerDisplayName","documentationURL","supportURL","KEYBOARD_SHORTCUTS","focusFilterInput","blurFilterInput","focusNamespaceDropdown","RESOURCE_NAME_TRUNCATE_LENGTH","ALL_NAMESPACES_KEY","ALL_APPLICATIONS_KEY","UNASSIGNED_APPLICATIONS_KEY","STORAGE_PREFIX","USERSETTINGS_PREFIX","NAMESPACE_USERSETTINGS_PREFIX","NAMESPACE_LOCAL_STORAGE_KEY","APPLICATION_USERSETTINGS_PREFIX","APPLICATION_LOCAL_STORAGE_KEY","LAST_NAMESPACE_NAME_USER_SETTINGS_KEY","LAST_NAMESPACE_NAME_LOCAL_STORAGE_KEY","API_DISCOVERY_RESOURCES_LOCAL_STORAGE_KEY","COMMUNITY_PROVIDERS_WARNING_LOCAL_STORAGE_KEY","COMMUNITY_PROVIDERS_WARNING_USERSETTINGS_KEY","PINNED_RESOURCES_LOCAL_STORAGE_KEY","COLUMN_MANAGEMENT_LOCAL_STORAGE_KEY","LOG_WRAP_LINES_USERSETTINGS_KEY","SHOW_YAML_EDITOR_TOOLTIPS_USER_SETTING_KEY","SHOW_YAML_EDITOR_TOOLTIPS_LOCAL_STORAGE_KEY","SHOW_FULL_LOG_USERSETTINGS_KEY","KUBE_ADMIN_USERNAMES","RH_OPERATOR_SUPPORT_POLICY_LINK","OPERATOR_HUB_LABEL","FLAGS","CONFIG_STORAGE_CONSOLE","COLUMN_MANAGEMENT_CONFIGMAP_KEY","ACM_LINK_ID","SYSTEM_NAMESPACES_PREFIX","SYSTEM_NAMESPACES","REQUESTER_FILTER","USER_TELEMETRY_ANALYTICS","CLUSTER_TELEMETRY_ANALYTICS","CLUSTER_VERSION_DEFAULT_UPSTREAM_SERVER_URL_PLACEHOLDER","GETTING_STARTED_USER_SETTINGS_KEY_ADD_PAGE","GETTING_STARTED_USER_SETTINGS_KEY_CLUSTER_DASHBOARD","PREFERRED_TELEMETRY_USER_SETTING_KEY","getReference","group","version","getReferenceForModel","model","getAPIVersionForModel","getGroupVersionKindForResource","resource","apiVersionSplit","apiVersionSplitLen","Error","undefined","getGroupVersionKindForModel","getGroupVersionKindForReference","reference","referenceSplit","transformGroupVersionKindToReference","validateStatus","response","url","method","retry","ok","shouldLogout","next","pathname","logout","contentType","headers","indexOf","statusText","json","details","cause","causes","reason","initDefaults","credentials","appInternalFetch","options","attempt","op1","token","applyConsoleHeaders","allOptions","fetch","resp","ModalWrapper","blocking","children","onClose","parentSelector","document","querySelector","contentLabel","isOpen","onRequestClose","overlayClassName","shouldCloseOnOverlayClick","createModalLauncher","Component","modalWrapper","modalClassName","cancel","props","getModalElement","containerElement","getElementById","result","Promise","resolve","stopPropagation","createModal","handleClose","handleCancel","store","history","basename","ModalTitle","component","h1","onClick","ModalBody","ModalFooter","errorMessage","inProgress","infoMessage","ModalSubmitFooter","submitText","cancelText","submitDisabled","submitDanger","buttonAlignment","resetText","reset","cancelButton","variant","submitButton","isDisabled","isLoading","resetButton","isInline","updateListFromWS","k8sObjects","UpdateListFromWS","Loaded","bulkAddToList","BulkAddToList","startWatchK8sObject","StartWatchK8sObject","startWatchK8sList","StartWatchK8sList","modifyObject","ModifyObject","stopWatchK8s","StopWatchK8s","errored","Errored","filterList","FilterList","partialObjectMetadataListHeader","Accept","partialObjectMetadataHeader","WS","POLLs","REF_COUNTS","stopK8sWatch","ws","destroy","poller","clearInterval","watchK8sList","k8skind","extraAction","partialMetadata","incrementallyLoad","continueToken","requestOptions","limit","continue","items","f","resourceVersion","pollAndWatch","log","setTimeout","timeout","onclose","event","code","ondestroy","timedOut","onbulkmessage","events","watchK8sObject","k8sModel","watch","o","err","setInterval","fieldSelector","object","receivedResources","resources","ReceivedResources","getResourcesInFlight","GetResourcesInFlight","PropertyPath","pathArray","property","i","isLast","isActive","EditButton","testId","DetailsItem","defaultValue","editAsGroup","hideEmpty","labelClassName","onEdit","canEdit","valueClassName","hide","popoverContent","editable","headerContent","bodyContent","footerContent","maxWidth","isFilled","OperatorSourceModel","CatalogSourceModel","PackageManifestModel","ClusterServiceVersionModel","legacyPluralURL","InstallPlanModel","SubscriptionModel","OperatorGroupModel","OperatorHubModel","isModalOpen","body","classList","contains","configureCountModal","configureReplicaCountModal","configureJobParallelismModal","confirmModal","deleteNamespaceModal","errorModal","configureNamespacePullSecretModal","labelsModalLauncher","podSelectorModal","rollbackModal","configureUpdateStrategyModal","annotationsModalLauncher","deleteModal","clusterChannelModal","clusterMoreUpdatesModal","clusterUpdateModal","taintsModal","tolerationsModal","expandPVCModal","clonePVCModal","default","removeVolumeModal","configureClusterUpstreamModal","configureMachineAutoscalerModal","createAlertRoutingModal","createColumnManagementModal","addUsersModal","removeUserModal","restorePVCModal","managedResourceSaveModal","FLAG_KNATIVE_SERVING_CONFIGURATION","FLAG_KNATIVE_SERVING","FLAG_KNATIVE_EVENTING","FLAG_KNATIVE_SERVING_REVISION","FLAG_KNATIVE_SERVING_ROUTE","FLAG_KNATIVE_SERVING_SERVICE","KNATIVE_SERVING_LABEL","PRIVATE_KNATIVE_SERVING_LABEL","KNATIVE_SERVING_APIGROUP","KNATIVE_EVENTING_APIGROUP","KNATIVE_EVENT_MESSAGE_APIGROUP","KNATIVE_EVENT_SOURCE_APIGROUP","CAMEL_APIGROUP","STRIMZI_KAFKA_APIGROUP","EVENT_SOURCE_ICON","CAMEL_KAMELET_ICON","CAMEL_SOURCE_INTEGRATION","FLAG_KNATIVE_EVENTING_BROKER","FLAG_KNATIVE_EVENTING_CHANNEL","FLAG_CAMEL_KAMELETS","CAMEL_K_PROVIDER_ANNOTATION","CAMEL_K_TYPE_LABEL","KNATIVE_MINSCALE_ANNOTATION","KNATIVE_MAXSCALE_ANNOTATION","KNATIVE_CONCURRENCYTARGET_ANNOTATION","KNATIVE_CONCURRENCYUTILIZATION_ANNOTATION","KNATIVE_AUTOSCALEWINDOW_ANNOTATION","SERVERLESS_FUNCTION_LABEL_DEPRECATED","SERVERLESS_FUNCTION_LABEL","GLOBAL_OPERATOR_NS","CAMEL_K_OPERATOR_NS","EVENTING_KAFKA_CHANNEL_KIND","EVENTING_CHANNEL_KIND","EVENTING_IMC_KIND","EVENT_SOURCE_SINK_BINDING_KIND","EVENT_SOURCE_KAFKA_KIND","EVENT_SOURCE_CAMEL_KIND","EVENT_SOURCE_API_SERVER_KIND","EVENT_SOURCE_CONTAINER_KIND","EVENT_SOURCE_PING_KIND","EVENT_SINK_KAFKA_KIND","FLAG_KNATIVE_EVENT_SOURCE_CATALOG_TYPE","FLAG_KNATIVE_EVENT_SINK_CATALOG_TYPE","EVENT_SOURCE_CATALOG_TYPE_ID","EVENT_SINK_CATALOG_TYPE_ID","FLAG_EVENT_SOURCE_PING","FLAG_KNATIVE_EVENTING_ENABLED","EVENT_SOURCE_ACTION_ID","EVENT_SINK_ACTION_ID","EVENTING_CHANNEL_ACTION_ID","EVENTING_BROKER_ACTION_ID","FUNCTIONS_GETTING_STARTED_SECTION_USER_SETTING_KEY","getFieldId","fieldName","fieldType","unknownKinds","Set","resourcePathFromModel","resourceListPathFromModel","resourcePath","has","add","resourceObjPath","ResourceLink","inline","groupVersionKind","linkTo","nameSuffix","hideIcon","dataTest","truncate","kindReference","classes","to","NodeLink","CAN_LIST_NODE","flags","Box","LoadError","canRetry","reload","bind","Loading","LoadingInline","LoadingBox","EmptyBox","MsgBox","detail","AccessDenied","src","Data","NoDataEmptyMsg","EmptyMsg","unfilteredData","StatusBox","skeleton","dataProps","Intl","ListFormat","style","format","CLOUD_SHELL_LABEL","CLOUD_SHELL_CREATOR_LABEL","CLOUD_SHELL_RESTRICTED_ANNOTATION","CLOUD_SHELL_STOPPED_BY_ANNOTATION","CLOUD_SHELL_PROTECTED_NAMESPACE","createCloudShellResourceName","CLOUD_SHELL_PHASE","v1alpha1DevworkspaceComponent","plugin","devWorkspaceComponent","image","kubernetes","components","container","env","newCloudShellWorkSpace","workspaceNamespace","operatorNamespace","spec","started","routingClass","template","startWorkspace","workspace","workspaceModel","op","initTerminal","workspaceName","payload","kubeconfig","post","sendActivityTick","checkTerminalAvailable","getCloudShellCR","getTerminalInstalledNamespace","AppCatalog","ClusterServiceVersionPhase","CSVConditionReason","InstallPlanApproval","InstallModeType","SubscriptionState","ClusterServiceVersionStatus","InstallPlanPhase","CatalogQueryParams","CatalogSortOrder","InventoryStatusGroup","HealthState","GridPosition","LIMIT_STATE","K8sResourceConditionStatus","maxClockSkewMS","lang","timeFormatter","DateTimeFormat","hour","minute","timeFormatterWithSeconds","second","dateFormatter","month","day","year","dateFormatterNoYear","dateTimeFormatter","langArg","dateTimeFormatterWithSeconds","utcDateTimeFormatter","timeZone","timeZoneName","relativeTimeFormatter","RelativeTimeFormat","getDuration","ms","seconds","Math","floor","minutes","hours","days","fromNow","dateTime","now","Date","d","getTime","justNow","omitSuffix","count","isValid","valueOf","PROMETHEUS_TENANCY_BASE_PATH","prometheusTenancyBaseURL","ALERTMANAGER_TENANCY_BASE_PATH","alertManagerBaseURL","alertmanagerUserWorkloadBaseURL","DEFAULT_PROMETHEUS_SAMPLES","DEFAULT_PROMETHEUS_TIMESPAN","Area","c","Bar","Stack","CursorVoronoiContainer","BareMetalHostModel","NodeMaintenanceModel","NodeMaintenanceKubevirtBetaModel","ProvisioningModel","NodeMaintenanceKubevirtAlphaModel","CephClusterModel","referenceForGroupVersionKind","telemetryEvents","getClusterProperties","clusterProperties","clusterId","telemetry","CLUSTER_ID","clusterType","CLUSTER_TYPE","DEVSANDBOX","consoleVersion","organizationId","ORGANIZATION_ID","useTelemetry","currentUserPreferenceTelemetryValue","ALLOW","STATE","OPTIN","eventType","listener","DISABLED","DENY","OPTOUT","QuickStartModel","PodDisruptionBudgetModel","EndPointSliceModel","h","units","w","formatPrometheusDuration","remaining","str","factor","unit","n","parsePrometheusDuration","parseInt","ignored","legalNamePattern","basePathPattern","namespacedPrefixes","stripBasePath","getNamespace","x","getURLSearchParams","all","params","URLSearchParams","entries","ExternalLink","href","text","additionalClassName","dataTestID","rel","ExternalLinkWithCopy","link","copied","setCopied","tooltipText","tooltipContent","content","trigger","exitDelay","onCopy","onMouseEnter","LinkifyExternal","defaults","flag","AUTH_ENABLED","authDisabled","MONITORING","baseCRDs","CLUSTER_AUTOSCALER","CONSOLE_LINK","CONSOLE_CLI_DOWNLOAD","CONSOLE_EXTERNAL_LOG_LINK","CONSOLE_NOTIFICATION","CONSOLE_YAML_SAMPLE","MACHINE_AUTOSCALER","MACHINE_CONFIG","MACHINE_HEALTH_CHECK","CLUSTER_API","PROMETHEUS","CRDs","addToCRDs","getExtensionsInUse","ff","added","removed","getModelRef","featureReducerName","featureReducer","action","SetFlag","set","ClearSSARFlags","withMutations","reduce","acc","curr","remove","models","nextState","getFlagsObject","featureState","toObject","flagPending","CatalogVisibilityState","catalogItemCompare","keyword","item","toLowerCase","tags","some","tag","cta","keywordCompare","filterString","getIconProps","iconImg","iconClass","class","setURLParams","URL","searchParams","toString","updateURLParams","paramName","Array","isArray","JSON","stringify","delete","getURLWithParams","getCatalogTypeCounts","catalogTypes","catalogTypeCounts","catalogType","matchedItems","customPropertyPresent","catalogItemDetails","proppertyName","applyCatalogItemMetadata","catalogItems","metadataProviderMap","metadataProviders","values","metadataProvider","badges","attributes","assign","attributeCount","keys","isCatalogTypeEnabled","developerCatalogTypes","parse","Enabled","enabled","Disabled","disabled","useGetAllDisabledSubCatalogs","catalogExtensionsArray","catalogTypeExtensions","disabledSubCatalogs","val","useIsDeveloperCatalogEnabled","sort","setFlag","retryFlagDetection","cb","handleError","res","detectShowOpenShiftStartGuide","canListNS","SHOW_OPENSHIFT_START_GUIDE","ssarChecks","CAN_CREATE_NS","resourceAttributes","verb","CAN_GET_NS","CAN_LIST_NS","after","CAN_LIST_PV","CAN_LIST_USERS","CAN_LIST_GROUPS","CAN_LIST_CRD","CAN_LIST_OPERATOR_GROUP","CAN_LIST_PACKAGE_MANIFEST","CAN_LIST_VSC","clearSSARFlags","check","detectOpenShift","OPENSHIFT","detectClusterVersion","clusterVersion","hasClusterVersion","CLUSTER_VERSION","detectCanCreateProject","CAN_CREATE_PROJECT","detectUser","userInfo","selfSubjectReview","newUserInfo","extra","uid","ssarCheckActions","fn","allowed","selfSubjectAccessReview","graphQLErrors","detectFeatures","detector","detect","featureFlagController","resolvedExtension","handler","MARKDOWN_COPY_BUTTON_ID","MARKDOWN_EXECUTE_BUTTON_ID","MARKDOWN_SNIPPET_ID","getSearchParams","endpoint","samples","QUERY_RANGE","append","getRangeVectorSearchParams","getPrometheusURL","RULES","useBoolean","initialValue","setValue","stateToFlagsObject","desiredFlags","allFlags","connectToFlags","stateToProps","areStatePropsEqual","AsyncComponentError","AsyncComponent","retryCount","maxRetries","isAsyncMounted","b","this","loadComponent","reject","ComponentNotFound","setState","retryAfter","base","pow","LoadingComponent","forwardRef","rest","subscriptionServiceInitialized","extensionSubscriptions","dynamicPluginListeners","onExtensionSubscriptionAdded","onDynamicPluginListenerAdded","subscribe","sub","subList","invokeListener","isSubscribed","splice","initSubscriptionService","pluginStore","reduxStore","getFlags","invokeExtensionListener","currentExtensions","currentFlags","extensionsInUse","typeGuards","tg","listenerLastArgs","getDynamicPluginInfo","lastExtensions","lastFlags","invokeAllExtensionListeners","nextExtensions","nextFlags","lastPluginEntries","invokeAllDynamicPluginListeners","nextPluginEntries","subscribeToExtensions","subscribeToDynamicPlugins","extensionDiffListener","prevExtensions","VolumeSource","emptyDir","hostPath","gitRepo","nfs","secret","gcePersistentDisk","awsElasticBlockStore","glusterfs","iscsi","configMap","projected","getVolumeType","volume","getVolumeLocation","vtype","typeID","repository","revision","volInfo","readOnly","genericFormatter","getRestartPolicyLabel","Always","OnFailure","Never","getRestartPolicy","podRestarts","initContainerStatuses","containerStatuses","terminated","exitCode","restartCount","podReadiness","ready","readyCount","totalContainers","podPhase","deletionTimestamp","initializing","phase","waiting","initContainerSpec","initContainers","find","restartPolicy","signal","hasRunning","running","podPhaseFilterReducer","isWindowsPod","tolerations","isContainerCrashLoopBackOff","containerName","containerStatus","composeEnhancers","baseReducers","observe","dashboards","applyReduxExtensions","reducerExtensions","pluginReducers","scope","reducer","nextReducers","plugins","replaceReducer","USER_SETTING_CONFIGMAP_NAMESPACE","createConfigMap","updateConfigMap","deseralizeData","seralizeData","getAlertSeverity","getAlertMessage","getAlertDescription","getAlertSummary","summary","getAlertTime","activeAt","getAlertName","getQN","catalogSource","k8sBasePath","getGroupVersionKind","isGroupVersionKind","groupVersionFor","parseAPIVersion","parsed","exec","majorVersion","qualifier","minorVersion","apiVersionCompare","v1","v2","v1Parsed","v2Parsed","localeCompare","isBetaV1","getLatestVersionForCRD","versions","served","referenceForCRD","names","referenceForOwnerRef","ownerRef","referenceForExtensionModel","referenceFor","kindForReference","apiGroupForReference","apiVersionForReference","nameForModel","LAST_PERSPECTIVE_USER_SETTINGS_KEY","LAST_PERSPECTIVE_LOCAL_STORAGE_KEY","HIDE_USER_WORKLOAD_NOTIFICATIONS_USER_SETTINGS_KEY","FLAG_DEVELOPER_PERSPECTIVE","ACM_PERSPECTIVE_ID","NoModelError","super","makeReduxID","k8sKind","qs","makeQuery","labelSelector","INTERNAL_REDUX_IMMUTABLE_TOARRAY_CACHE_SYMBOL","INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL","getReduxData","immutableData","isList","toArray","toJSON","getIDAndDispatch","selector","BreadCrumbs","breadcrumbs","crumb","ActionButtons","actionButtons","actionButton","callback","PageHeading","kindObj","menuActions","buttonActions","customActionMenu","breadcrumbsFor","titleFunc","customData","badge","getResourceStatus","centerText","helpText","dataTestId","extraResources","resourceKeys","extraObjs","resourceTitle","hasButtonActions","hasMenuActions","hasData","showActions","resourceStatus","showHeading","showBreadcrumbs","alignItems","ownerReferences","additionalClassNames","actions","SectionHeading","required","SidebarSectionHeading","getK8sModel","k8s","k8sGroupVersionKind","useK8sModel","alwaysUseFallbackLocalStorage","userSettingsLocation","useUserSettings","sync","mounted","current","keyRef","defaultValueRef","settings","setSettingsUnsafe","setSettings","args","settingsRef","setLoadedUnsafe","setLoaded","isRequestPending","increaseRequest","decreaseRequest","counterRef","increment","decrement","useCounterRef","userUid","impersonateName","hashName","update","digest","hashNameOrKubeadmin","impersonate","fallbackLocalStorage","setFallbackLocalStorageUnsafe","setFallbackLocalStorage","isLocalStorage","lsData","setLsDataCallback","configMapResource","cfData","cfLoaded","cfLoadError","hasOwnProperty","previousSettings","newState","resultedSettings","staticModels","getK8sResourcePath","u","isLegacy","getK8sAPIPath","queryParams","resourceURL","requirementToString","requirement","operator","createEquals","toRequirements","requirements","matchLabels","matchExpressions","isOldFormat","me","selectorToString","k8sWatch","wsOptions","opts","wsOptionsUpdated","host","reconnect","jsonParse","bufferFlushInterval","bufferMax","encodedSelector","setPluginStore","modelKey","modelsToMap","isModelDefinition","k8sModels","namespacedResources","allModels","hasModel","pluginModels","md","merge","getNamespacedResources","useActiveNamespace","setNamespace","RESULTS_TYPE","isWatchActive","dashboardsReducer","ActivateWatch","activePath","active","hasIn","setIn","UpdateWatchTimeout","UpdateWatchInFlight","inFlight","StopWatch","clearTimeout","SetError","SetData","GrayUnknownIcon","size","BlueSyncIcon","RedResourcesFullIcon","YellowResourcesAlmostFullIcon","BlueArrowCircleUpIcon","TableData","activeColumnIDs","role","columns","allColumns","scrollNode","ariaLabel","gridBreakPoint","none","onSelect","Row","rowData","mock","sortColumnIndex","sortDirection","navigate","columnShift","sortBy","setSortBy","direction","asc","windowWidth","setWindowWidth","innerWidth","colIDs","col","widthInPixels","column","columnIDs","columnIndex","isColumnVisible","applySort","sp","sortColumn","handleResize","sortOrder","desc","addEventListener","removeEventListener","onSort","preventDefault","renderVirtualizedTable","scrollContainer","scrollElement","height","isScrolling","registerChild","onChildScroll","scrollTop","disableHeight","width","cells","rows","fuzzyCaseInsensitive","exactMatch","tableFilters","isExactSearch","matchFn","selected","requester","needle","every","roleRef","subject","binding","userName","groupName","statuses","roles","roleList","elem","filters","pkg","defaultChannel","channels","ch","currentCSVDesc","phases","build","strategies","buildConfig","strategy","route","types","project","instance","machine","snapshot","disks","imageManifestVuln","vulnerability","imageVulnerability","csv","clusterServiceVersionDisplayName","getAllTableFilters","rowFilters","isExactMatch","rowFiltersToFilterFuncs","wssErrors","graphQLReady","wasCalled","subsClient","protocol","graphqlBaseURL","connectionParams","reconnectionAttempts","connectionCallback","setReady","onError","httpLink","uri","wsLink","client","cache","defaultOptions","fetchPolicy","mutate","watchQuery","fetchURL","fetchK8s","TOUR_LOCAL_STORAGE_KEY","TourActions","BAREMETAL_FLAG","NODE_MAINTENANCE_FLAG","NODE_MAINTENANCE_ENABLED_FLAG","BMO_ENABLED_FLAG","NODE_MAINTENANCE_KV_BETA_FLAG","NODE_MAINTENANCE_KV_ALPHA_FLAG","detectBaremetalPlatform","infra","detectBMOEnabled","useDetectNodeMaintenance","setFeatureFlag","loading","pseudolocalizationEnabled","language","resolvedLoading","init","use","languageToPseudo","wrapped","backend","loadPath","lng","startsWith","firstTransform","fallbackLng","load","debug","detection","caches","contextSeparator","getI18nNamespaces","defaultNS","nsSeparator","keySeparator","postProcess","interpolation","NumberFormat","escapeValue","react","useSuspense","wait","transSupportBasicHtmlNodes","saveMissing","missingKeyHandler","windowError","AlertSource","ClusterUpdateStatus","clusterVersionReference","getAvailableClusterUpdates","cv","availableUpdates","getSortedAvailableUpdates","available","left","right","getNotRecommendedUpdateCondition","conditions","condition","getNotRecommendedUpdates","conditionalUpdates","release","getConditionalClusterUpdates","getSortedNotRecommendedUpdates","notRecommended","getNewerMinorVersionUpdate","currentVersion","currentVersionParsed","updateParsed","major","minor","isMinorVersionNewer","otherVersion","otherVersionParsed","getAvailableClusterChannels","desired","getDesiredClusterVersion","getClusterVersionChannel","channel","splitClusterVersionChannel","getSimilarClusterVersionChannels","currentPrefix","getNewerClusterVersionChannel","similarChannels","currentChannel","getLastCompletedUpdate","lastCompleted","getClusterVersionCondition","isProgressing","Progressing","True","updateFailing","Failing","hasAvailableUpdates","hasNotRecommendedUpdates","getClusterUpdateStatus","Invalid","invalid","ReleaseAccepted","False","releaseNotAccepted","ReleaseNotAccepted","UpdatingAndFailing","Updating","RetrievedUpdates","failedToRetrieveUpdates","ErrorRetrieving","UpdatesAvailable","UpToDate","getK8sGitVersion","k8sVersionResponse","getOpenShiftVersion","lastUpdate","getCurrentVersion","getReportBugLink","prerelease","productName","branding","showReleaseNotes","getReleaseNotesLink","getClusterID","getOCMLink","getConditionUpgradeableFalse","getNotUpgradeableResources","NodeTypes","NodeTypeNames","isMCPMaster","mcp","master","isMCPWorker","worker","isMCPPaused","paused","sortMCPsByCreationTimestamp","creationTimestamp","clusterIsUpToDateOrUpdateAvailable","getMCPsToPausePromises","machineConfigPools","NO_GROUPING","ALL_CATEGORY","OTHER_CATEGORY","matchSubcategories","category","subcategories","intersection","matchedSubcategories","subCategory","valuesIntersection","addItem","categorizedIds","itemId","categoryId","categorize","categories","itemCategorized","subcategory","findActiveCategory","activeId","activeCategory","hasActiveDescendant","isActiveTab","getFirstTime","firstTimestamp","eventTime","getLastTime","lastObservedTime","series","lastTimestamp","sortEvents","typeFilter","Actions","list","clear","recomputeRowHeights","secondary","sm","DROPDOWN","Inner","involvedObject","source","reportingComponent","tooltipMsg","isWarning","firstTime","lastTime","timestamp","sourceComponent","sourceHost","eventCount","simple","context","EventsList","setType","textFilter","setTextFilter","setSelected","eventTypes","normal","warning","clearSelection","onChange","selection","prev","updateItems","from","selectedKey","autoFocus","_event","categoryName","defaultIsOpen","collapsedText","numRemaining","expandedText","isClosable","chip","removeResource","EventStream","NoEvents","NoMatchingEvents","allCount","ErrorLoadingEvents","EventStreamPage","noProjectsAvailable","resourceEventStream","setActive","sortedEvents","setSortedEvents","setError","setLoading","filteredEvents","filterEvents","webSocketID","watchURLOptions","webSocketOptions","messages","currentSortedEvents","topEvents","batch","onopen","evt","wasClean","onerror","unpause","pause","noMatches","sysEventStatus","statusBtnTxt","klass","messageCount","EventComponent","defaultProps","propTypes","isRequired","showTitle","words","involvedObjectRef","kindFilter","flt","word","textMatches","ResourceEventStream_","ResourcesEventStream","WrappedResourceEventStream","BuildPhase","createBuildRequest","subresource","req","startBuild","cloneBuild","getBuildNumber","buildNumber","MEMO","ResourceIcon","memoKey","kindStr","backgroundColor","iconLabel","rendered","ResourceName","getLastLanguage","localStorage","getItem","navigator","DEFAULT_GRAPH_SAMPLES","getActivePerspective","getAllVariables","boards","newBoardName","allVariables","templating","includeAll","datasource","isHidden","HttpError","400","401","402","403","404","405","406","407","408","409","410","411","412","413","414","415","416","417","418","421","426","428","429","431","451","500","501","502","503","504","505","506","510","511","TimeoutError","IncompleteDataError","RetryError","useAccessReview2","useAccessReview","RequireCreatePermission","asAccessReview","useModal","launchModal","spin","iconOnly","noTooltip","getName","getUID","getDeletetionTimestamp","getOwnerReferences","getLabels","getAnnotations","activePlugins","dynamicPluginNames","allPluginNames","consolePlugins","disabledPlugins","disabledPluginNames","pluginName","getEnabledDynamicPluginNames","i18nNamespaces","isPositioned","allItems","s1","s2","insertBefore","insertAfter","before","itemDependsOnItem","findIndexForItem","insertBeforeIndex","currentItem","findIndex","findInsertBeforeIndex","newIndex","findInsertAfterIndex","insertItem","currentItems","insertPositionedItems","insertItems","sortedItems","positionedItems","getSortedNavExtensions","navItems","stripScopeFromPath","navItemHrefIsActive","scopelessLocation","scopelessHref","locationSegments","segment","navItemResourceIsActive","scopelessPath","firstSegment","isTopLevelNavItem","section","stopWatch","setData","activateWatch","updateWatchTimeout","updateWatchInFlight","getQueryKey","getPrometheusQueryResponse","prometheusResults","queryKey","fetchPeriodically","getURL","watchPrometheusQuery","QUERY","watchURL","k8sURL","stopWatchPrometheusQuery","stopWatchURL","activeNavSectionId","showOperandsInAllNamespaces","activeApplication","createProjectMessage","level","overview","selectedDetailsTab","selectedUID","selectedGroup","GROUP_BY_APPLICATION","groupOptions","filterValue","user","utilizationDuration","deprecatedOperator","package","mergeIn","SetCreateProjectMessage","SetClusterID","SelectOverviewItem","DismissOverviewDetails","UpdateOverviewResources","newResources","UpdateOverviewSelectedGroup","UpdateOverviewLabels","UpdateOverviewFilterValue","createProjectMessageStateToProps","userStateToProps","getActiveApplication","InventoryItemLoading","InventoryItemTitle","InventoryItemBody","InventoryItemStatus","useUserSettingsCompatibility","storageKey","removeItem","podStatus","isReady","containers","numReady","numContainersReadyFilter","getPodStatus","Terminating","warnings","Running","isContainerFailedFilter","Failed","isContainerLoopingFilter","CrashLoopBackOff","podWarnings","Unknown","NotReady","calculateRadius","radius","podStatusStrokeWidth","podStatusInset","podStatusOuterRadius","podStatusInnerRadius","decoratorRadius","checkPodEditAccess","resourceKind","isKnativeServing","configRes","isIdled","deploymentConfig","podDataInProgress","dc","isRollingOut","complete","recreate","rolling","getPodData","podRCData","currentDeploymentphase","currentPods","pods","previousPods","previous","inProgressDeploymentData","completedDeploymentData","rollingUpdate","ScalingUp","CREATE_NAMESPACE_KEY","newNamespaceValidationSchema","when","is","matches","advancedOptionsValidationSchema","shape","cloudShellSetupValidationSchema","newNamespace","advancedOptions","getCloudShellTimeout","MONITORING_DASHBOARDS_DEFAULT_TIMESPAN","MONITORING_DASHBOARDS_VARIABLE_ALL_OPTION_KEY","connectToModel","kindsInFlight","connectToPlural","modelRef","adapterFunc","knownArgs","arg","k8sGet","requestInit","k8sGetResource","k8sCreate","k8sCreateResource","k8sUpdate","put","k8sUpdateResource","k8sPatch","patches","k8sPatchResource","k8sKill","jsonData","k8sDeleteResource","k8sList","raw","newVal","listURL","typedItems","k8sListResource","k8sListResourceItems","cloudShellReducerName","isCloudShellExpanded","isExpanded","isCloudShellActive","getCloudShellCommand","command","DEFAULT_HEIGHT","DEFAULT_TICK_COUNT","AreaChartStatus","chartStatusColors","AreaChart","formatDate","humanize","padding","tickCount","ariaChartLinkLabel","ariaChartTitle","xAxis","yAxis","chartStyle","byteDataType","showAllTooltip","mainDataName","theme","blue","containerRef","processedData","nonEmptyDataSets","dataSet","allZero","y","xTickFormat","tick","yTickFormat","string","domain","getLabel","prop","includeDate","datum","date","multiLine","legendData","childName","symbol","activateData","cursorDimension","mouseFollowTooltips","labelComponent","stack","voronoiDimension","ariaTitle","containerComponent","domainPadding","scale","tickFormat","dependentAxis","limitQuery","requestedQuery","prometheusPollProps","utilization","utilizationLoading","limitLoading","requested","requestedLoading","CustomError","enumerable","configurable","captureStackTrace","constructor","setPrototypeOf","prototype","ErrorWithCause","filterByAttributes","filteredByGroup","filtered","activeFilters","filterValues","filterByGroup","filterBySearchKeyword","searchKeyword","filterByCategory","determineAvailableFilters","initialFilters","filterGroups","getActiveFilters","attributeFilters","filterType","getFilterGroupCounts","newFilterCounts","filterGroup","getFilterSearchParam","groupFilter","activeValues","typeKey","concat","WORKLOAD_TYPES","MONITORABLE_KINDS","getResourcePausedAlert","getBuildAlerts","buildConfigs","buildAlerts","addAlert","buildPhase","bc","seenComplete","builds","getOwnedResources","controller","sortByRevision","replicators","getRevision","descending","leftVersion","rightVersion","leftName","rightName","getAnnotation","annotation","getDeploymentRevision","getDeploymentConfigVersion","getOwnerNameByKind","sortBuilds","leftBuildNumber","rightBuildNumber","leftCreationTime","getMilliseconds","byCreationTime","getDeploymentPhase","rc","podAlertKey","combinePodAlerts","waitingReason","getPodAlerts","getReplicationControllerAlerts","getIdledStatus","Idle","getRolloutStatus","currentRC","notFailedOrCancelled","cancelled","failed","isReplicationControllerVisible","new","pending","isDeploymentInProgressOrCompleted","getPodsForResource","getReplicationControllersForResource","replicationControllers","mostRecentRC","visibleReplicationControllers","sortedRCs","sortReplicationControllersByRevision","toReplicationControllerItem","toResourceItem","rs","isKnative","podData","AutoScaledTo0","getStatefulSetsResource","ss","statefulSets","ownedRS","getActiveStatefulSets","pss","getReplicaSetsForResource","deployment","replicaSets","sortReplicaSetsByRevision","currentRevision","getActiveReplicaSets","getJobsForCronJob","cronJobUid","jobs","job","getBuildsForResource","getBuildConfigsForResource","cronJob","currentNamespace","jobTemplate","targetImageNamespace","output","targetImageName","endsWith","getBuildConfigsForCronJob","nativeTriggers","triggers","annotatedTriggers","triggersJSON","getAnnotatedTriggers","resourceNameLabel","triggerFrom","imageChangeParams","triggerImageNamespace","triggerImageName","getRoutesForServices","services","routes","getServicesForResource","deploymentconfig","getPodTemplate","service","isStandaloneJob","owner","getOverviewItemForResource","utils","isMonitorable","monitoringAlerts","labelValues","getWorkloadMonitoringAlerts","hpas","overviewItems","util","createOverviewItemForType","owners","validPod","getResourceLimitsData","limitsData","cpu","memory","limits","limitUnit","request","requests","requestUnit","getResourceData","getLimitsDataFromResource","cpuLimit","cpuLimitUnit","memoryLimit","memoryLimitUnit","cpuRequest","cpuRequestUnit","memoryRequest","memoryRequestUnit","defaultRequestUnit","defaultLimitUnit","getVerticalPodAutoscalersForResource","vpas","vpa","targetRef","getReduxIdPayload","reduxId","getK8sDataById","EditorType","EditorToggle","handleChange","currentTarget","spaceItems","isChecked","Form","YAML","Operator","BadgeType","AlertStates","SilenceStates","AlertSeverity","RuleStates","PrometheusEndpoint","tourReducer","stepNumber","initialize","completedTour","completed","startTour","start","back","TourContext","TourContextProvider","Provider","getRequiredFlagsByTour","_","steps","getRequiredFlagsFromTour","requiredFlags","useTourStateForPerspective","tourLocalState","setTourLocalState","useTourValuesForContext","activePerspective","setPerspective","tour","selectorSteps","tourCompletionState","setTourCompletionState","tourState","tourDispatch","intro","unfilteredSteps","end","totalSteps","onComplete","isNumber","isFinite","sortResourceByValue","valueGetter","languages","compareOpts","numeric","ignorePunctuation","aValue","bValue","aName","bName","terminalAvailable","setTerminalAvailable","flagEnabled","setCloudShellCommand","SetCloudShellCommand","setCloudShellExpanded","SetCloudShellExpanded","toggleCloudShellExpanded","expanded","setCloudShellActive","SetCloudShellActive","quickSearch","handleCta","closeModal","fireTelemetryEvent","callbackProps","setUser","SetUser","beginImpersonate","BeginImpersonate","endImpersonate","EndImpersonate","setAdmissionWebhookWarning","SetAdmissionWebhookWarning","removeAdmissionWebhookWarning","RemoveAdmissionWebhookWarning","storeHandler","setStore","storeData","getStore","isTranslatableString","getTranslationKey","translateExtensionDeep","translationStringPredicate","translateExtension","RadioInput","inputProps","inputElement","checked","subTitle","RadioGroup","currentValue","radios","htmlFor","nowStateToProps","Timestamp","mdate","timeDifference","timestampFor","eventIconStyle","eventSourceIconSVG","eventSinkIconSVG","channelIconSVG","serverlessFunctionSVG","gitIconElement","samplesIconElement","EventSinkIcon","alt","EventSourceIcon","ServerlessFunctionIcon","settleAllPromises","promises","results","unwrapPromiseSettledResults","allSettled","FLAG_WEB_TERMINAL","DEFAULT_NS_OPERATORS","FLAG_DEVWORKSPACE","FLAG_V1ALPHA2DEVWORKSPACE","ContainerSecurityFlag","Priority","vulnPriority","Defcon1","score","High","Medium","Low","Negligible","totalFor","defcon1Count","criticalCount","highCount","mediumCount","lowCount","negligibleCount","unknownCount","totalVulnFor","imageVulns","imageVuln","vulnPriorityByTitle","mapEntries","vulnPriorityDescription","priorityFor","severityTitle","AlertErrorState","errorText","full","titleText","headingLevel","AlertEmptyState","drawerToggle","getAlertActions","actionsExtensions","alertActions","Map","pollerTimeouts","pollers","refreshNotificationPollers","ConnectedNotificationDrawer","isDrawerExpanded","notificationStateToProps","toggleNotificationDrawer","connectToNotifications","isDesktop","onDrawerChange","showServiceLevelNotification","poll","dataHandler","notificationPoller","alertsResults","silences","alertIds","alertActionExtensions","alertActionExtensionsMap","updateList","canUpgrade","updateData","newerChannel","newerChannelVersion","failedPlugins","actionPath","actionText","targetPath","getUpdateNotificationEntries","criticalAlerts","nonCriticalAlerts","criticalAlertLabelSelector","criticalAlertAcc","nonCriticalAlertAcc","matchesLabels","hasCriticalAlerts","hasNonCriticalAlerts","isAlertExpanded","toggleAlertExpanded","isNonCriticalAlertExpanded","toggleNonCriticalAlertExpanded","isClusterUpdateExpanded","toggleClusterUpdateExpanded","prevDrawerToggleState","emptyState","criticalAlertCategory","onExpandContents","alertAction","nonCriticalAlertCategory","recommendationsCategory","notificationEntries","GettingStartedShowState","useGettingStartedShowState","SHOW","getItemsAndRowCount","groupedItems","columnCount","accumulatedValues","currentKey","accItems","rowCount","accRowCount","accColumnCount","headerRows","accHeaderRow","currentKeyItems","currentKeyItemCount","ceil","numberOfCell","CellMeasurementContext","ImageManifestVulnModel","QUERY_PROPERTIES","INCONTEXT_ACTIONS_CONNECTS_TO","INCONTEXT_ACTIONS_SERVICE_BINDING","CONNECTOR_INCONTEXT_ACTIONS","SERVICE_BINDING_ENABLED","SAMPLE_APPLICATION_GROUP","PREFERRED_RESOURCE_TYPE_USER_SETTING_KEY","LAST_RESOURCE_TYPE_STORAGE_KEY","LAST_BUILD_PAGE_TAB_STORAGE_KEY","NAME_LABEL","INSTANCE_LABEL","RUNTIME_LABEL","FLAG_DEVELOPER_CATALOG","FLAG_OPERATOR_BACKED_SERVICE_CATALOG_TYPE","FLAG_SAMPLE_CATALOG_TYPE","OPERATOR_BACKED_SERVICE_CATALOG_TYPE_ID","SAMPLE_CATALOG_TYPE_ID","ADD_TO_PROJECT","FLAG_JAVA_IMAGE_STREAM_ENABLED","IMAGESTREAM_NAMESPACE","JAVA_IMAGESTREAM_NAME","FLAG_OPENSHIFT_DEPLOYMENTCONFIG","FLAG_OPENSHIFT_BUILDCONFIG","bestUnit","dataPoints","bestLevel","arr","maxUnit","point","unitIndex","processFrame","typeName","frameLevel","divisor","URL_POLL_DEFAULT_DELAY","useURLPoll","delay","dependencies","setResponse","safeFetch","finally","ErrorComponent","ErrorPage404","ErrorStateMessage","ErrorState","LoginErrorMessage","urlSearchParams","errorType","AuthenticationErrorPage","useDebounceCallback","debounceParams","leading","trailing","memDebounceParams","callbackRef","useK8sWatchResource","initResource","modelsLoaded","reduxID","resourceK8s","ServiceBindingModel","CreateWithPermissions","createAccessReview","ListPageCreateLink","ListPageCreateButton","ListPageCreateDropdown","setOpen","position","toggle","onToggle","toggleIndicator","toggleVariant","dropdownItems","usedNamespace","GreenCheckCircleIcon","RedExclamationCircleIcon","YellowExclamationTriangleIcon","BlueInfoCircleIcon","kubeAdminLogoutURL","loginErrorURL","loginSuccessURL","loginURL","logoutRedirect","logoutURL","LOGIN_ERROR_PATH","isLoginErrorPath","loginStateItem","loginState","clearLocalStorageKeys","authSvc","userID","atob","email","redirect","login","isKubeAdmin","setNext","logoutKubeAdmin","form","createElement","input","appendChild","submit","FLAG_RHOAS","API_GROUP","API_VERSION","AccessTokenSecretName","ServiceAccountSecretName","ServicesRequestCRName","ServiceAccountCRName","cloudServicesIcon","operatorIcon","kafkaIcon","APITokenLengthMinimum","FLAG_MANAGED_SERVICES_CATALOG_TYPE","MANAGED_SERVICES_CATALOG_TYPE_ID","PageTitleContext","LocalVolumeDiscoveryResult","LocalVolumeSetModel","LocalVolumeModel","LocalVolumeDiscovery","isCurrentUser","isSystemNamespace","option","startsWithNamespace","isNamespace","isOtherUser","requesterFilter","ME","USER","SYSTEM","getResources","startAPIDiscovery","_id","crdsOrEvents","useQueryParams","getK8sModels","modelFor","metadataExtensions","modelForGroupKind","groupVersionMap","preferredVersion","sortedVersions","useModelFinder","referenceForGroupVersionPlural","pluralsToModelMap","findModel","refPlural","DefaultFallback","ErrorBoundary","unlisten","defaultState","hasError","errorInfo","componentStack","listen","FallbackComponent","useDeepCompareMemoize","defaultCatalogCategories","ONE_MINUTE","ONE_HOUR","ONE_DAY","supportedLocales","en","es","fr","ko","ja","LAST_LANGUAGE_LOCAL_STORAGE_KEY","USER_PREFERENCES_BASE_URL","componentForFieldType","dropdown","checkbox","custom","DevWorkspaceTemplateModel","WorkspaceModel","v1alpha1WorkspaceModel","eventSourceData","eventSourceModels","eventSourceChannels","getLabelPlural","fetchEventSourcesCrd","resolvedRes","accumulator","singular","crdLatestVersion","sourceModel","sourceIndex","useEventSourceModels","modelsData","setModelsData","getEventSourceModels","getChannelModels","getDynamicEventSourcesResourceList","optional","getDynamicEventSourcesWatchers","getDynamicEventSourceModel","resourceRef","getDynamicEventSourcesModelRefs","isDynamicEventResourceKind","isDynamicEventSourceKind","fetchChannelsCrd","allChannelModels","useChannelModels","getDynamicChannelResourceList","getDynamicEventingChannelWatchers","useChannelResourcesList","modelRefs","setModelRefs","getDynamicChannelModelRefs","getDynamicChannelModel","isEventingChannelResourceKind","Flags","DefaultCatalogSource","PackageSource","DEFAULT_GLOBAL_OPERATOR_INSTALLATION_NAMESPACE","DEFAULT_SOURCE_NAMESPACE","GLOBAL_COPIED_CSV_NAMESPACE","INTERNAL_OBJECTS_ANNOTATION","NON_STANDALONE_ANNOTATION_VALUE","OPERATOR_NAMESPACE_ANNOTATION","OPERATOR_PLUGINS_ANNOTATION","OPERATOR_TYPE_ANNOTATION","OPERATOR_UNINSTALL_MESSAGE_ANNOTATION","GLOBAL_OPERATOR_NAMESPACES","common","factory","tableColumnClasses","columnClass","DetailsForKind","leftDetailsItemExtensions","rightDetailsItemExtensions","leftDetailsItems","rightDetailsItems","podSelector","showNodeSelector","TableRowForKind","getExtensionsActionsForKind","DefaultList","kinds","getAriaLabel","Header","sortField","transforms","virtualize","DefaultPage","ListComponent","canCreate","DefaultDetailsPage","pages","editYaml","containsNonPrintableCharacters","FileInputWithTranslation","onDataChange","onFileUpload","fileData","fileIsBinary","reader","FileReader","onload","readAsDataURL","fileName","readAsText","readFile","files","connectDropTarget","hideContents","isOver","canDrop","inputFileName","inputFieldHelpText","inputFileData","textareaFieldHelpText","boxTarget","monitor","onDrop","FileInput","FileInputComponent","FILE","connect","dropTarget","DroppableFileInputWithTranslation","inputFileIsBinary","handleFileDrop","readAsBinaryString","DroppableFileInput","consoleFetch","fetchPromise","appFetch","timeoutPromise","race","consoleFetchCommon","dataPromise","isPlainText","parseData","warningData","handleAdmissionWebhookWarning","consoleFetchJSON","consoleFetchText","consoleFetchSendJSON","useResolvedExtensions","resolvedExtensions","setResolvedExtensions","resolved","setResolved","errors","setErrors","disposed","fulfilledValues","rejectedReasons","getNodeRoles","getNodeRole","getNodeRoleMatch","getNodeAddresses","addresses","getNodeMachineNameAndNamespace","getNodeMachineName","isNodeUnschedulable","unschedulable","isNodeReady","getNodeCPUCapacity","capacity","getNodeAllocatableMemory","allocatable","isWindowsNode","getNodeUptime","lastTransitionTime","useQuickStartContext","requirementFromString","receiverTypes","pagerduty_configs","webhook_configs","email_configs","slack_configs","getAlertmanagerYAML","alertManagerYaml","yaml","decode","getAlertmanagerConfig","parsedAlertmanagerYAML","config","patchAlertmanagerConfig","yamlString","getImpersonate","sdkCore","impersonateStateToProps","getUser","getAdmissionWebhookWarnings","admissionWebhookWarnings","ADMIN_RESOURCES","abbrBlacklist","kindToAbbr","abbrKind","toUpperCase","cacheResources","versionedResources","getCachedResources","resourcesJSON","cachedVersion","pluralizeKind","pluralized","getModelExtensionMetadata","tcb","translatedExtensions","groupVersionKindMetadata","groupKindMetadata","groupMetadata","groupVersion","pop","resourceSet","namespacedSet","allResources","safeResources","adminResources","groupVersionParts","singularName","verbs","shortNames","configResources","clusterOperatorConfigResources","bindingKind","flatten","ret","subjects","subjectIndex","rowKey","getKindLabel","kindLabel","decodeURIComponent","accessReview","Delete","btnText","executeFn","unshift","RoleBindingsTableHeader","BindingName","BindingKebab","RoleLink","RoleBindingsTableRow","BindingsList","bindingType","RoleBindingsPage","staticFilters","createPath","hideLabelFilter","hideNameLabelFilters","hideColumnManagement","RoleBinding","ClusterRoleBinding","hasCRBindings","filterGroupName","staticData","filteredData","onFilterChange","NsRoleDropdown","openshiftFlag","fixed","selectedKeyKind","placeholder","ClusterRoleDropdown","Section","BaseEditRoleBinding","saveButtonText","setInProgress","existingData","subjectKind","subjectName","subjectRef","getSubject","setSubject","RoleDropdown","titleVerbAndKind","isSubjectDisabled","bindingKinds","subjectKinds","onSubmit","isCreate","kindId","CreateRoleBinding","roleKind","roleName","clusterAllowed","getSubjectIndex","BindingLoadingWrapper","fixedKeys","EditRoleBinding","CopyRoleBinding","getClusterVersionFlag","useClusterVersion","cvData","cvLoaded","cvLoadError","useOpenShiftVersion","openshiftVersion","setOpenShiftVersion","ModelBadge","isModelMetadata","Icon","popoverTitle","restProps","renderIcon","statusBody","ErrorStatus","InfoStatus","ProgressStatus","SuccessStatus","DurationKeys","DURATION_VALUES","OneHour","SixHours","TwentyFourHours","DEFAULT_DURATION_KEY","DEFAULT_DURATION","TOAST_TIMEOUT_LONG","TOAST_TIMEOUT_DEFAULT","NoResults","isProjects","onClear","Filter","filterText","filterRef","isProject","SystemSwitch","hasSystemNamespaces","NamespaceGroup","isFavorites","favorites","canFavorite","isFavorited","isSelected","Footer","canCreateNew","onCreateNew","NamespaceMenu","allNamespacesTitle","menuRef","setFilterText","favoritesUserSettingsKey","systemNamespacesSettingsKey","favoriteStorageKey","systemNamespaceKey","setFavorites","canList","optionsLoaded","optionItems","onSetFavorite","oldFavorites","systemNamespaces","setSystemNamespaces","isFavorite","isOptionShown","checkIsFavorite","containsFilterText","filteredOptions","filteredFavorites","onActionClick","itemID","isCurrentFavorite","activeItemId","isScrollable","maxMenuHeight","focus","shortCut","menuProps","menu","menuState","getBrandingDetails","logoImg","customLogoURL","customProductName","Masthead","isMastheadStacked","isNavOpen","onNavToggle","logoProps","display","onSidebarToggle","isSidebarOpen","riskIcons","low","moderate","important","critical","colorScale","legendColorScale","riskSorting","mapMetrics","metricName","mapConditions","cur","isError","isWaiting","errorUpload","Degraded","UploadDegraded","ResourceUtilizationQuery","podMetricsQueries","MEMORY","CPU","FILESYSTEM","NETWORK_IN","NETWORK_OUT","QUOTA_LIMIT","QUOTA_REQUEST","podControllerMetricsQueries","useResourceMetricsQueries","getPodControllerMetricsQueries","IDEAL_CELL_WIDTH","IDEAL_SPACE_BW_TILES","HEADER_FIXED_HEIGHT","OVERSCAN_ROW_COUNT","DEFAULT_CELL_HEIGHT","ESTIMATED_ROW_SIZE","eventSourceBreadcrumbsProvider","useEventSourceDetailPageBreadcrumbs","eventSourceModelsProviderForBreadcrumbs","getEventSourceModelsForBreadcrumbs","channelBreadcrumbsProvider","useChannelDetailPageBreadcrumbs","channelModelsProviderForBreadcrumbs","brokerBreadcrumbsProvider","useBrokerDetailPageBreadcrumbs","brokerModelProviderForBreadcrumbs","getBrokerModel","allParams","ResourceListPage_","resourceListPageExtensions","dynamicResourceListPageExtensions","missingType","componentLoader","ResourceListPage","ResourceDetailsPage_","detailsPageExtensions","dynamicResourceDetailsPageExtensions","decodedName","titleProviderValues","telemetryPrefix","titlePrefix","ResourceDetailsPage","ConditionTypes","Conditions","K8sResource","ClusterServiceVersion","getStatusLabel","ALLOW_SERVICE_BINDING_FLAG","clone","hidden","titleKey","messageKey","btnTextKey","cancelTextKey","BuildStrategyType","BuildLogLink","isPipeline","JenkinsPipeline","BuildNumberLink","BuildMetrics","podName","completionTimestamp","runTime","startTimestamp","max","areaProps","hasGutter","xl","lg","BinaryBytes","OpenShiftPipelines","pipelines","PipelineBuildStrategyAlert","BuildsDetails","logSnippet","triggeredBy","hasPipeline","buildConfigName","getStrategyType","Docker","Devfile","Custom","Source","getEnvPath","strategyType","EnvironmentPage","BuildEnvironmentComponent","envPath","rawEnvData","BuildsDetailsPage","prometheusIsAvailable","envEditor","logs","BuildsTableRow","columnID","BuildsList","BuildsTableHeader","allPhases","BuildsPage","useActivePerspective","OpenShiftGettingStarted","createNamespaceOrProjectModal","withStartGuide","WrappedComponent","disable","DropdownMixin","_onWindowClick","dropdownElement","dropdownList","nativeEvent","stopImmediatePropagation","actionItems","noSelection","newTitle","actionKey","show","DropDownRowWithTranslation","itemKey","onclick","hover","autocompleteFilter","isBookmarked","onBookmark","favoriteKey","onFavorite","contentString","suffix","favorite","DropDownRow","Dropdown_","onClick_","onKeyDown","onKeyDown_","changeTextFilter","applyTextFilter_","globalKeyDown","nodeName","ctrlKey","altKey","metaKey","shiftKey","componentWillUnmount","nextProps","UNSAFE_componentWillReceiveProps","autocompleteText","prevProps","prevState","keyboardHoverKey","newKey","ai","actionTitle","autocompletePlaceholder","buttonClassName","menuClassName","dropDownClassName","describedBy","bookmarks","spacerBefore","headerBefore","bookMarkRows","maxHeight","autoCapitalize","renderActionItem","Dropdown","userSettingsPrefix","favoriteUserSettingsKey","bookmarkUserSettingsKey","bookmarkStorageKey","setFavoriteKey","setBookmarks","oldBookmarks","enableBookmarks","autoSelect","ActionsMenuDropdown","ActionsMenu","isVisible","setVisible","containerLabel","ContainerDropdown","firstInitContainer","order","firstContainer","getSpacer","initContainer","kebabOptionsToMenu","subs","menuOptions","pathKey","subMenu","KebabItem_","onEscape","isAllowed","keyCode","Escape","labelKind","KebabItemAccessReview","KebabSubMenu","open","nodeRef","subMenuRef","referenceCb","subMenuCbRef","onMouseLeave","relatedTarget","placement","closeOnEsc","closeOnOutsideClick","focusTrapOptions","clickOutsideDeactivates","fallbackFocus","tabIndex","KebabMenuItems","focusItem","KebabItem","tooltip","tooltipKey","KebabItems","kebabFactory","Edit","ModifyLabels","ModifyPodSelector","ModifyAnnotations","ModifyCount","ModifyTaints","ModifyTolerations","AddStorage","ExpandPVC","PVCSnapshot","ClonePVC","RestorePVC","readyToUse","kebabActionExtensions","getExtensionsKebabActionsForKind","actionsForKind","getKebabActionsForKind","kebabAction","ResourceKebab","terminatingTooltip","Kebab","divElement","onHover","onFocus","returnFocusOnDeactivate","validate","TYPES","space","decimalBytes","decimalBytesWithoutB","binaryBytes","binaryBytesWithoutB","SI","decimalBytesPerSec","packetsPerSec","getType","convertBaseValueToUnits","unitArray","initialUnit","preferredUnit","sliceIndex","units_","getDefaultFractionDigits","formatValue","fractionDigits","maximumFractionDigits","locales","round","multiplier","useRound","converted","formattedValue","formatPercentage","humanizeBinaryBytesWithoutB","humanizeBinaryBytes","humanizeDecimalBytes","humanizeDecimalBytesPerSec","humanizePacketsPerSec","humanizeNumber","humanizeNumberSI","humanizeSeconds","humanizeCpuCores","humanizePercentage","dehumanize","defaultReturn","reverse","truncateStringAt","startingUnitIndex","currentUnitValue","substring","convertValueWithUnitsToBaseValue","number","parseFloat","baseUnitedValidation","validateNumber","float","validCPUUnits","validateCPUUnit","validMemUnits","validTimeUnits","time","validateTimeUnit","validateMemUnit","convertToBaseValue","formatToFractionalDigits","digits","minimumFractionDigits","formatBytesAsMiB","bytes","formatBytesAsGiB","formatCores","cores","createHistory","unused","removeBasePath","__replace__","__push__","getQueryArgument","setQueryArgument","setQueryArguments","newParams","removeQueryArgument","setOrRemoveQueryArgument","useCreateNamespaceOrProjectModal","launcher","ModalComponent","addResourcePage","page","modelParser","addDynamicResourcePage","baseDetailsPages","ConfigMapsDetailsPage","ContainersDetailsPage","DaemonSetsDetailsPage","DeploymentConfigsDetailsPage","DeploymentsDetailsPage","BuildConfigsDetailsPage","ImageStreamsDetailsPage","ImageStreamTagsDetailsPage","JobsDetailsPage","CronJobsDetailsPage","ProjectsDetailsPage","NamespacesDetailsPage","MachineAutoscalerDetailsPage","MachineConfigDetailsPage","MachineConfigPoolDetailsPage","MachineDetailsPage","MachineSetDetailsPage","MachineHealthCheckDetailsPage","PodsDetailsPage","ReplicaSetsDetailsPage","ReplicationControllersDetailsPage","SecretsDetailsPage","ServiceAccountsDetailsPage","ClusterRolesDetailsPage","RolesDetailsPage","ClusterRoleBindingsDetailsPage","UserDetailsPage","GroupDetailsPage","AlertManagersDetailsPage","StatefulSetsDetailsPage","ResourceQuotasDetailsPage","AppliedClusterResourceQuotasDetailsPage","LimitRangeDetailsPage","HorizontalPodAutoscalersDetailsPage","PersistentVolumesDetailsPage","PersistentVolumeClaimsDetailsPage","StorageClassDetailsPage","TemplateInstanceDetailsPage","CustomResourceDefinitionsDetailsPage","ClusterOperatorDetailsPage","ClusterVersionDetailsPage","PodDisruptionBudgetDetailsPage","getResourceDetailsPages","pluginPages","dynamicPluginPages","baseListPages","ConfigMapsPage","DaemonSetsPage","DeploymentConfigsPage","DeploymentsPage","BuildConfigsPage","ImageStreamsPage","JobsPage","CronJobsPage","ProjectsPage","NamespacesPage","MachineAutoscalerPage","MachineConfigPage","MachineConfigPoolPage","MachinePage","MachineHealthCheckPage","MachineSetPage","PodsPage","ReplicaSetsPage","ReplicationControllersPage","SecretsPage","ServiceAccountsPage","RolesPage","UserPage","GroupPage","PrometheusInstancesPage","ServiceMonitorsPage","AlertManagersPage","StatefulSetsPage","ResourceQuotasPage","AppliedClusterResourceQuotasPage","LimitRangeListPage","HorizontalPodAutoscalersPage","PersistentVolumesPage","PersistentVolumeClaimsPage","StorageClassPage","TemplateInstancePage","CustomResourceDefinitionsPage","ClusterOperatorPage","PodDisruptionBudgetsPage","getResourceListPages","getLastNamespace","getBreadcrumbPath","customPlural","breadcrumbsForDetailsPage","fromRequirements","undefinedWhenEmpty","basic","selectorFromString","FilterType","filterTypeMap","LABEL","NAME","FilterToolbar","columnLayout","nameFilterPlaceholder","nameFilterTitle","labelFilterPlaceholder","labelFilter","uniqueFilterName","reduxIDs","labelPath","rowSearchFilters","translatedNameFilterTitle","searchFiltersObject","searchFiltersState","changeSearchFiltersState","translateFilterType","filterDropdownItems","nameFilterQueryArgumentKey","labelFilterQueryArgumentKey","nameInputText","setNameInputText","labelInputText","setLabelInputText","setFilterType","generatedRowFilters","rowFilter","filtersNameMap","filterKeys","defaultSelections","filtersAcc","filtersNameMapAcc","filterKeysAcc","defaultSelectedAcc","defaultSelected","itemAcc","selectedRowFilters","onRowFilterSearchParamChange","rowFiltersInitialized","labelSelection","onLabelSelectionChange","labelSelectionInitialized","hideIfEmpty","inputId","isRead","applyFilters","applyTextFilter","filterName","searchRowFilters","searchFilter","deleteChip","chips","applyRowFilter","recognized","updateRowFilterSelected","selectedNew","applyLabelFilters","applyNameFilter","debounceApplyNameFilter","debounceApplyTextFilter","showSearchFilters","showSearchFiltersDropdown","clearAllFilters","clearFiltersButtonText","toggleIcon","breakpoint","_filter","deleteChipGroup","clearAllRowFilter","chipGroupCollapsedText","chipGroupExpandedText","placeholderText","_toggleEvent","selections","isCheckboxSelectionBadgeHidden","isGrouped","onSuggestionSelect","showSuggestions","textValue","setTextValue","breadcrumbsForGlobalConfig","detailsPageKind","detailsPagePath","ItemRow","showAPIGroup","menuItems","GlobalConfigPage_","globalConfigs","setItems","oauthMenuItems","editYAMLMenuItem","resourceLink","viewAPIExplorerMenuItem","apiExplorerLink","responses","flatMap","visibleItems","danger","GlobalConfigPage","adjustedConfigResources","useDynamicPluginInfo","forceRender","isMountedRef","unsubscribeRef","pluginInfoEntriesRef","allPluginsProcessedRef","trySubscribe","pluginInfoEntries","tryUnsubscribe","strinfigy","isSystemRole","roleColumnClasses","RolesTableRow","Details","changeFilter","ruleFilter","ruleObj","searchKeys","DetailsWithTranslation","bindingsColumnClasses","BindingsTableRow","BindingsListComponent","BindingsTableHeader","BindingsForRolePage","createButtonText","createProps","filterLabel","getBreadcrumbs","lastNamespace","nameKey","RolesList","roleType","createNS","PerspectiveContext","usePoll","savedCallback","ErrorMessage","InfoMessage","SuccessMessage","ButtonBar","successMessage","isLiveRegion","injectDisabled","useRefWidth","setWidth","setRef","newWidth","clientWidth","doesHpaMatch","workload","thisHPA","scaleTargetRef","useExtensions","extensionsInUseRef","latestTypeGuardsRef","sanitizeExtension","disallowed","augmentExtension","isExtensionInUse","PluginStore","staticPlugins","allowedDynamicPluginNames","disabledStaticPluginNames","loadedDynamicPlugins","failedDynamicPlugins","listeners","updateExtensions","staticPluginExtensions","dynamicPluginExtensions","manifest","processedExtensions","customProperties","disableStaticPlugins","invokeListeners","dynamicPlugins","errorCause","isDynamicPluginLoaded","isDynamicPluginFailed","isLoadedDynamicPluginInfo","isNotLoadedDynamicPluginInfo","getCSRFToken","cookie","getConsoleRequestHeaders","getInfrastructurePlatform","infrastructure","platform","getInfrastructureAPIURL","apiServerURL","isSingleNode","controlPlaneTopology","useFormikValidationFix","validateForm","memoizedValue","useSafeFetch","AbortController","abort","WebHookSecretKey","addSecretToWorkload","secretName","SecretTableRow","SecretDetails","SecretsList","sortFunc","secretTypeFilterReducer","dockercfg","dockerconfigjson","basicAuth","sshAuth","tls","serviceAccountToken","generic","webhook","createLink","secretTypeFilterValues","OwnerReferences","createMenuOptions","groupExtensions","topGroup","bottomGroup","submenus","part","partGroup","getMenuOptionType","isGroupMenu","submenu","SUB_MENU","GROUP_MENU","ATOMIC_MENU","addPubSubConnectionModal","PubSubModalLauncher","isAlertingRulesSource","isAlertingRuleChart","containerNode","setContainerNode","getContainer","PREFERRED_NAMESPACE_USER_SETTING_KEY","usePreferredNamespace","preferredNamespace","setPreferredNamespace","preferredNamespaceLoaded","formatNumber","decimals","isNaN","ValidationErrorType","ItemTypes","TextColumn","NavItemResource","dataAttributes","navLinkProps","resourceReference","useLocation","PREFERRED_LANGUAGE_USER_SETTING_KEY","usePreferredLanguage","setClusterID","setCreateProjectMessage","getJenkinsLogURL","BuildSummaryStatusIcon","statusClass","BuildPipelineLogLink","StagesNotStarted","BuildSummaryTimestamp","BuildPipelineSummary","BuildAnimation","JenkinsInputUrl","stage","buildUrl","BuildStageTimestamp","BuildStageName","BuildStage","startTimeMillis","BuildPipeline","jenkinsStatus","getJenkinsStatus","stages","getPluginID","devPerspectiveTourText","fullVersion","perspectiveSwitcherTourText","webTerminalGuidedTourText","searchTourText","finishTourText","consoleLinks","openshiftBlogLink","openshiftHelpBase","documentationBaseURL","getOperatorTopologyDataModel","getOperatorsComponentFactory","getDataModelReconciler","operatorsDataModelReconciler","getTopologyFilters","applyDisplayOptions","getClusterServiceVersionPlugins","getInternalObjects","isCatalogSourceTrusted","upgradeRequiresApproval","subscription","SubscriptionStateUpgradePending","usePrometheusPoll","customDataSource","prometheusURLProps","CopyToClipboard","visibleValue","codeClassName","useUtilizationDuration","adjustDuration","endDate","startDate","updateEndDate","updateDuration","newDuration","updateSelectedKey","nameFilter","filterData","filterTypes","useListPageFilter","setFilter","appendActiveNamespace","NamespaceRedirect","GraphEmpty","justifyContent","flexGrow","parseJSONAnnotation","annotationKey","VirtualReference","rect","bottom","top","DEFAULT_POPPER_OPTIONS","popperOptions","popperRef","popperRefIn","zIndex","returnFocus","controlled","openProp","popperRefs","setOpenState","focusRef","onRequestCloseRef","newOpen","activeElement","HTMLElement","ownerDocument","onClickOutside","Node","modifiers","preventOverflow","boundariesElement","nodeRefCallback","textCollapsed","textExpanded","showServiceLevel","TrialDaysLeft","trialDaysLeft","alertText","isPlain","useGetServiceLevel","clusterIDParam","loadingSecret","loadingServiceLevel","loadServiceLevel","setLoadingSecret","setLoadingServiceLevel","auths","auth","Authorization","apiUrl","ocmResponse","levelSetting","support_level","expirationDate","eval_expiration_date","trialEnd","daysLeft","useLoadServiceLevel","ServiceLevelLoading","screenreaderText","ServiceLevel","ServiceLevelText","levelText","levels","Premium","Standard","Eval","useServiceLevelText","useServiceLevelTitle","useShowServiceLevelNotifications","ServiceLevelNotification","notificationStart","actionExternalLinkURL","contextMap","setContextMap","actionsMap","setActionsMap","setLoadError","memoizedContext","onContextChange","newContexId","newScope","prevContext","onActionsLoaded","actionsLoaded","contextId","onLoadError","isHorizontalNavTab","isTab","useSafetyFirst","initialState","newValue","large","InlineTechPreviewBadge","InlineDevPreviewBadge","Requirement","requirementAsString","requirementAsUrlEncodedString","Selector","usePrevious","deps","pfDependentAxisTickLabels","fontFamily","letterSpacing","fill","chart","axis","stroke","grid","tickLabels","independentAxis","ticks","strokeWidth","line","opacity","queryBrowserTheme","multiUnordered","NameValueEditorPair","EnvFromPair","EnvType","inject","safeProps","lastKind","isOwnedByOperator","customresourcedefinitions","owned","ownedGroup","isOwnedByCSV","matchOwnerAndCSV","csvs","findOwner","updateThemeClass","htmlTagElement","systemTheme","matchMedia","ThemeContext","ThemeProvider","documentElement","localTheme","themeLoaded","mqListener","darkThemeMq","useValue","onValueResolved","onValueError","API_SERVERS_UP","CONTROLLER_MANAGERS_UP","SCHEDULERS_UP","API_SERVER_REQUESTS_SUCCESS","Condition","PressureQueries","DISK_PRESSURE","MEM_PRESSURE","PID_PRESSURE","PREFERRED_PERSPECTIVE_USER_SETTING_KEY","usePreferredPerspective","preferredPerspective","setPreferredPerspective","preferredPerspectiveLoaded","deepForOwn","predicate","valueCallback","pathParts","visitValue","newPathParts","$$typeof","isPlainNonReactObject","arrayElement","indexKey","fetchK8sHealth","getK8sHealthState","k8sHealth","getControlPlaneComponentHealth","perc","getControlPlaneHealth","componentsHealth","worstStatus","withPriority","mostImportantState","worstStatuses","getWorstStatus","singleMasterMsg","getClusterOperatorStatusPriority","co","getClusterOperatorHealthStatus","clusterOperators","NamespaceContext","useValuesForNamespaceContext","urlNamespace","setLastNamespace","lastNamespaceLoaded","useProjects","updateNamespace","oldPath","newPath","resourcesLoaded","exports","Label","Labels","numLabels","DRAGGABLE_TYPE","ENV_ROW","ENV_FROM_ROW","getEditDecorator","getUrlDecorator","getBuildDecorator","getAlertsDecorator","edgesFromAnnotations","edges","listInstanceResources","instanceName","lists","instanceLabelSelector","updateItemAppConnectTo","connections","connectValue","oldValueIndex","existingTag","connectionTag","getReplacedTargetIndex","replacedTarget","replaceTargetName","replaceTargetKind","replaceValue","replaceTargetInstanceName","connection","createResourceConnection","connectTargetName","connectTargetKind","replacedTargetIndex","listsValue","removeResourceConnection","getSourceAndTargetForBinding","contextualSource","serviceBindingAvailable","linkingModelRefs","resourceName","fetchResource","doConnectsToBinding","doContextualBinding","logos","getIcons","getIcon","iconName","hasIcon","normalizeIconClass","getImageForIconClass","getImageStreamIcon","getTemplateIcon","ImageStreamIcon","iconSize","iconClassImg","visibilityLabel","filteredAPIs","providedAPIs","internalObjects","filteredAndSorted","api","providedAPIsForCSV","allProvidedAPIs","apiservicedefinitions","providedAPIsForChannel","referenceForProvidedAPI","referenceForStepResource","defaultChannelFor","packageManifest","defaultChannelNameFor","supportedInstallModesFor","installModes","installModesFor","supported","iconFor","catalogSourceNamespace","currentCSV","providedAPIForReference","providedAPIForModel","exampleForModel","useInitializationResource","parseALMExamples","getManualSubscriptionsInNamespace","subscriptions","installPlanApproval","Manual","OperatorsWithManualApproval","NamespaceIncludesManualApproval","InstallPlanCSVNames","installPlan","clusterServiceVersionNames","CSVName","InstallPlanReview","defaultXMutator","defaultYMutator","getRangeVectorStats","xMutator","yMutator","getInstantVectorStats","mapLimitsRequests","utilizationData","limitData","strokeDasharray","fillOpacity","reqData","getMostImportantStatuses","operatorStatuses","mostImportantStatus","getOperatorsStatus","operators","getOperatorStatus","operatorsByStatus","getOperatorsHealthState","healthStatuses","detailMessage","sortedStatuses","groupedStatuses","statusKeys","finalCount","showMetrics","screen","podColumnInfo","restarts","created","ipaddress","traffic","columnManagementID","getColumns","showNodes","additional","PodTableRow","PodStatus","numCores","podIP","ContainerLink","ContainerRunningSince","startedAt","ContainerTerminatedAt","finishedAt","ContainerTerminatedExitCode","ContainerTerminatedReason","ContainerLastState","containerLastState","podContainerClassNames","ContainerRow","cstatus","cstate","lastState","PodContainerTable","heading","getNetworkName","network_name","PodMetrics","PodStatusPopover","unschedulableCondition","containerStatusStateWaiting","cs","footerLinks","headerTitle","PodDetailsList","moreThanOnePodIPs","podIPs","moreThanOneHostIPs","hostIPs","activeDeadlineSeconds","ip","hostIP","imagePullSecrets","imagePullSecret","PodResourceSummary","nodeSelector","showTolerations","sum","PodEnvironmentComponent","PodExecLoader","initialContainer","PodExec","terminal","PodList","showNamespaceOverride","activeColumns","userSettingsLoaded","getFilters","tableColumns","updateMetrics","fetchPodMetrics","selectedColumns","pluralize","includeCount","detailsPage","ResourceSummary","customPathName","showPodSelector","showAnnotations","showLabelEditor","canUpdateResource","tolerationsPath","canUpdate","ResourcePodCount","RuntimeClass","UpstreamConfigDetailsItem","upstream","isKnativeDeployment","getKsResource","ksResource","getKnativeServingRevisions","revisions","revisionResource","ownerUid","getRevisions","getKnativeServingConfigurations","configurations","getKnativeServingRoutes","ksroutes","getKnativeServingDomainMapping","domainMappings","domainmappings","domainMappingResource","domainMapping","getDomainMapping","getKnativeServingServices","ksservices","knativeServingResourcesRevision","knativeServingResourcesConfigurations","k8sServices","knativeServingResourcesServices","knativeKafkaSinks","knativeEventingResourcesBroker","kafkaBootStrapServerResourcesWatcher","kafkaTopicsResourcesWatcher","knativeCamelDomainMappingResourceWatchers","getTrafficByRevision","revName","trafficPercent","revisionName","tr","percent","urls","getSinkableResources","getKnativeServingResources","knativeServingResourcesRevisionWatchers","knativeServingResourcesConfigurationsWatchers","knativeServingResourcesRoutesWatchers","knativeServingResourcesServicesWatchers","getKnativeEventingResources","eventingsubscription","knativeEventingResourcesSubscriptionWatchers","knativeEventingBrokerResourceWatchers","knativeEventingTriggerResourceWatchers","getKnativeEventingKameletsResources","knativeCamelIntegrationsResourceWatchers","knativeCamelKameletBindingResourceWatchers","kameletGlobalNS","knativeCamelKameletResourceWatchers","expand","kindOf","TranslatedLabelList","LabelList","ExpandableAlert","setExpanded","alertContent","createBasicLookup","getKey","lookup","entity","createLookup","loadingList","getRandomChars","len","random","isValidUrl","recursiveGetSchemaAtPath","schema","getSchemaAtPath","toTitleCase","isModifiedEvent","startsWithSome","searchStrings","searchString","alphanumericCompare","sensitivity","translationForResourceKind","HelmRelease","labelForNodeKind","kindString","getTitleForNodeKind","useNotificationAlerts","overrideMatchLabels","hideUserWorkloadNotifications","filteredAlerts","setFilteredAlerts","alertLabelSelector","alertRuleLabelSelector","expectedConditionTypes","getComputedServiceBindingStatus","serviceBinding","CONNECTED","getFirstServiceBindingError","ActionItem","external","handleClick","translate","extraProps","Enter","isExternalLink","AccessReviewActionItem","disabledTooltip","statusProps","processReduxId","stuff","_filters","toJS","ConnectToState","reduxes","redux","worst","worstError","Boolean","k8sResults","Firehose","areStatesEqual","firehoses","discoveryComplete","resourcesChanged","doNotConnectToState","contextTypes","router","MaskedData","DownloadBinaryButton","rawBinary","rawBinaryLength","array","Uint8Array","ArrayBuffer","charCodeAt","blob","Blob","downloadBinary","ConfigMapBinaryData","dl","ConfigMapData","SecretValue","reveal","encoded","decodedValue","SecretData","setReveal","titleI18n","CheckBox","CheckBoxControls","allSelected","itemCount","selectedCount","onSelectAll","flex","align","storagePrefix","PerspectiveVisibilityState","getPerspectiveVisitedKey","hasReviewAccess","hasAccess","requiredAccessReview","missingAccessReview","missing","requiredPromises","missingPromises","usePerspectives","perspectiveExtensions","setResults","perspectives","perspectiveExtension","visibility","ex","handleResults","oldResults","AccessReview","filteredExtensions","usePerspectiveExtension","pendingPhases","CSVPhasePending","CSVPhaseInstalling","CSVPhaseReplacing","CSVPhaseDeleting","subscriptionForCSV","installedCSV","getCSVStatus","statusPhase","CSVPhaseUnknown","CSVPhaseSucceeded","CSVPhaseFailed","getSubscriptionStatus","SubscriptionStateNone","SubscriptionStateUpgradeAvailable","SubscriptionStateAtLatest","useForceRender","badgeAlt","getImpersonateKey","newImpersonate","checkAccessInternal","impersonateKey","ssar","checkAccess","setAllowed","useAccessReviewAllowed","LabelSelector","emptySelectsAll","_conjuncts","_emptySelectsAll","_OPERATOR_MAP","In","NotIn","Exists","DoesNotExist","_REVERSE_OPERATOR_MAP","in","exists","addConjunct","expression","conjunct","_getIdForConjunct","_getStringForConjunct","isEmpty","found","keep","hasConjunct","findConjunctsMatching","inConjuncts","inConjunct","notInConjuncts","notInConjunct","conjunctString","useK8sWatchResources","initResources","allK8sModels","prevK8sModels","prevResources","k8sModelsRef","modelReference","requiredModels","ids","resourceModel","idAndDispatch","noModel","reduxIDKeys","resourceK8sSelectorCreator","oldK8s","newK8s","resourceK8sSelector","ExpandCollapse","toggleExpandCollapse","toggleTextExpanded","toggleTextCollapsed","useResizeObserver","targetElement","element","observer","ResizeObserver","disconnect","ByteDataTypes","ActionMenuVariant","useFlag","NumberSpinner","changeValueBy","min","onMinus","onPlus","minusBtnAriaLabel","minusBtnProps","plusBtnAriaLabel","plusBtnProps","isClusterGlobalConfig","isDetailsItem","isLeftDetailsItem","isRightDetailsItem","isFeatureFlag","isModelFeatureFlag","isFeatureFlagHookProvider","coreReducer","WSFactory","handlers","bulkmessage","flushCanceler","flushMessageBuffer","connectionAttempt","that","messageBuffer","createURL","WebSocket","triggerEvent","onmessage","msg","invokeHandlers","registerHandler","eventData","send","SDKReducers","hideHeader","shouldClose","shouldOpen","onHide","onShow","DASH","isKebabActions","isGuidedTour","isClusterExternallyManaged","useCanClusterUpgrade","hasPermissionsToUpdate","notExternallyManaged","brandingManagedUpdates","LINE_PATTERN","LineBuffer","maxSize","_buffer","_tail","_hasTruncated","_maxSize","lines","lineCount","trimEnd","lineSeparator","withHandlePromise","setErrorMessage","handlePromise","promise","onFulfill","errorMsg","PromiseComponent","useCombineRefs","refs","RulesList","Rule","Groups","apiGroups","Resources","nonResourceURLs","URLs","RuleKebab","ruleNumber","sorts","daemonsetNumScheduled","daemonset","dataSize","ingressValidHosts","instanceType","jobCompletionsSucceeded","succeeded","jobType","numReplicas","namespaceCPU","namespaceMemory","podCPU","podMemory","pvStorage","pv","storage","pvcStorage","getClusterOperatorStatus","getClusterOperatorVersion","getTemplateInstanceStatus","machinePhase","pvcUsed","volumeSnapshotSize","volumeSnapshotSource","snapshotLastRestore","restores","restoreTime","sortPackageManifestByDefaultChannelName","TableRow","trKey","showNamespace","TableWrapper","ariaRowCount","RowMemo","VirtualBody","getRowProps","onRowsRendered","cellMeasurementCache","fixedWidth","minHeight","keyMapper","rowIndex","autoHeight","deferredMeasurementCache","rowHeight","onScroll","overscanRowCount","rowRenderer","parent","rowArgs","rowProps","rowId","getActiveColumns","componentProps","Table","initFilters","initHeader","Rows","selectedResourcesForKind","defaultSortOrder","customSorts","propData","defaultSortFunc","isPinned","defaultSortField","currentSortField","currentSortFunc","currentSortOrder","cProps","getComponentProps","newSortBy","columnTitle","WithScrollContainer","setScrollContainer","getParentScrollableElement","parentNode","nodeType","ELEMENT_NODE","overflow","getComputedStyle","useScrollContainer","BaseLabelsModal","descriptionKey","isPodSelector","messageVariables","setLabels","arrayify","watchedResource","watchedResourceLoaded","stale","setStale","objectify","l","LabelsModal","DOC_URL_OPENSHIFT_WHATS_NEW","DOC_URL_OPERATORFRAMEWORK_SDK","DOC_URL_PODDISRUPTIONBUDGET_POLICY","DOC_URL_PODMAN","DOC_URL_RED_HAT_MARKETPLACE","KUBE_DOCS","documentationURLs","applicationHealth","downstream","configuringMonitoring","networkPolicy","kube","postInstallationMachineConfigurationTasks","understandingUpgradeChannels","updateService","updateUsingCustomMachineConfigPools","usingInsights","usingRBAC","workingWithProjects","deprecatedDeploymentConfig","admissionWebhookWarning","isUpstream","isManaged","getDocumentationURL","docURLs","getNetworkPolicyDocURL","networkLink","keywordFilter","compareFunction","keywords","orderExtensionBasedOnInsertBeforeAndAfter","useServicesWatcher","allServices","usePostFormSubmitAction","actionParams","actionTypes","actionPayload","parsedAction","useRelatedHPA","workloadAPI","workloadKind","workloadName","workloadNamespace","DropdownItem","ResourceDropdown","craftResourceKey","customResourceKey","resourceFilter","dataSelector","customKey","getResourceList","resourceList","getDropdownList","updateSelection","transformLabel","allSelectorItem","noneSelectorItem","showBadge","appendItems","unsortedList","containsMultipleNs","dataValue","sortedList","allSelectorKey","allSelectorTitle","noneSelectorKey","noneSelectorTitle","selectedItem","selectedActionItem","onLoad","WarningStatus","dataStatusID","statusLabel","cssClassName","baseProps","validated","touched","setFieldValue","setFieldTouched","fieldId","labelIcon","activeChild","activeChildren","staticChild","GroupTextType","podStatusIsNumeric","podStatusValue","ScaledTo0","innerRadius","outerRadius","standalone","showTooltip","titleComponent","subTitleComponent","updateOnEnd","setUpdateOnEnd","forceUpdate","prevVData","vData","updateVData","prevDataPoints","nextData","truncTitle","truncSubTitle","chartDonut","animate","onEnd","groupComponent","transform","allowTooltip","padAngle","tipContent","background","triggerRef","getPageY","pageY","touches","defaultHeight","defaultOpen","resizable","header","drawerRef","heightState","setHeightState","openState","lastObservedHeightRef","startRef","headerRef","setHeight","bb","getBoundingClientRect","useSize","minimumHeight","currentOpen","currentHeight","drawerHeight","forceOpen","newHeight","draggable","onDrag","onStart","offsetHeight","onStop","appear","classNames","toasts","setToasts","removeToast","toast","onRemove","addToast","counter","appendTo","isToast","onTimeout","actionClose","dismissible","actionLinks","dismiss","selectedCategory","onSelectCategory","activeTab","renderTabs","selectedCategoryID","toplevelCategory","numItems","tabClasses","shown","CATEGORY","restrictTabs","renderTile","renderCell","renderHeader","isItemsGrouped","CatalogToolbar","totalItems","groupings","activeGrouping","onGroupingChange","onSearchKeywordChange","onSortOrderChange","toolbarRef","inputRef","catalogSortItems","ASC","DESC","showGrouping","catalogGroupItems","typeDescriptions","marginLeft","typeCount","TYPE","filterGroupMap","hideSidebar","activeCategoryId","activeSearchKeyword","KEYWORD","GROUPING","SORT_ORDER","attributeFilterParam","filterGroupsShowAll","setFilterGroupsShowAll","filterGroupCounts","setFilterGroupCounts","setCatalogTypeCounts","catalogToolbarRef","itemsSorter","itemsToSort","clearFilters","preventScroll","handleFilterChange","updatedFilters","handleSearchKeywordChange","handleGroupingChange","grouping","handleSortOrderChange","handleShowAllToggle","showAll","updatedShowAll","catalogCategories","allCategory","otherCategory","filteredItems","filteredByCategoryItems","filteredBySearchItems","filteredByAttributes","filterCounts","typeCounts","showCategories","showFilters","showTypeSelector","showSidebar","onShowAllToggle","provider","vendor","isBindable","modalHeader","q","supportUrl","documentationUrl","notAvailable","providerLabel","createdAtLabel","supportLabel","documentationLabel","descriptions","catalogId","itemTypeExtensions","itemTypesResolved","typeMetadataExtensions","itemTypeMetadataResolved","catalogProviderExtensions","providersResolved","itemFilterExtensions","filtersResolved","metadataProviderExtensions","metadataProvidersResolved","metadataExts","em","typeLabel","typeBadges","isDescriptionReactElement","onShowItem","formattedString","lastIdx","lastLen","currentIdx","scrollIntoView","behavior","useLanguage","preferredLanguage","preferredLanguageLoaded","i18n","setResourceBundle","onLanguageChange","resourceBundle","getResourceBundle","processedBundle","preferredLanguageInStorage","on","changeLanguage","off","getProcessedResourceBundle","consoleBundle","pseudo","process","getInitialState","useValuesForQuickStartContext","activeQuickStartID","setActiveQuickStartID","activeQuickStartId","allQuickStartStates","setAllQuickStartStates","useAllQuickStartStates","inlineExecuteCommandShowdownExtension","multilineExecuteCommandShowdownExtension","startQuickStart","quickStartId","totalTasks","IN_PROGRESS","restartQuickStart","NOT_STARTED","nextStep","quickStart","taskNumber","updatedStatus","updatedTaskNumber","COMPLETE","markInitialStepVisited","INIT","VISITED","useLegacyHeaderColors","footer","markdown","renderExtension","docContext","rootSelector","setUtilsConfig","getUtilsConfig","useModelsLoaded","getContainerState","stateKey","getContainerStatus","initStatuses","identity","getContainerRestartCount","getPullPolicyLabel","IfNotPresent","imagePullPolicy","getPullPolicy","blacklistGroups","blacklistResources","ResourceListDropdown","groupToVersionMap","recentList","clearItems","setClearItems","recentSelected","setRecentSelected","selectedOptions","setSelectedOptions","recentSelectedList","sameGroupKind","preferred","toOrderedMap","groupBy","isDup","recentSearches","renderedOptions","newOpenState","inlineFilterPlaceholderText","onFilter","toLocaleLowerCase","hasInlineFilter","customBadgeText","toggleRef","handleMenuKeys","handleMenuClick","closest","popper","enableFlip","ModalContext","ModalProvider","setComponent","setComponentProps","compProps","defaultDeny","CreateNamespaceModal","setNetworkPolicy","setName","thenPromise","catchError","create","createNamespace","policy","defaultNetworkPolicies","selectOptions","setIsOpen","defaultNetworkPolicy","onToggleClick","small","nameFormat","createNamespaceText","onOpenChange","shouldFocusToggleOnSelect","DefaultCreateProjectModal","setDisplayName","setDescription","hideStartGuide","createProject","projectsURL","CreateProjectModal","createProjectModalExtensions","externalState","externalChangeHandler","localState","setLocalState","onExternalChange","defaultPerPageOptions","LocalizedToggleTemplate","firstIndex","itemsTitle","lastIndex","perPage","perPageOptions","setPage","setPerPage","onPerPageSelect","firstRow","onSetPage","toggleTemplate","titles","itemsPerPage","perPageSuffix","toFirstPageAriaLabel","toPreviousPageAriaLabel","toLastPageAriaLabel","toNextPageAriaLabel","optionsToggleAriaLabel","currPageAriaLabel","paginationAriaLabel","ofWord","formLabel","onBlur","helpTextInvalid","addLabel","disableAddRow","tooltipAddRow","onAdd","button","isAriaDisabled","DEFAULT_CHILDREN","mergeNewValue","otherProps","dndEnabled","idx","isReadOnly","arrayHelpers","rowValues","disableDeleteRow","tooltipDeleteRow","previewDropRef","dragRef","marginBottom","cursor","grow","plain","TooltipPlacement","Tooltip","tippyOptions","arrow","useCloudShellCommandDispatch","GroupMenuContent","ActionMenuContent","SubMenuContent","flyoutMenu","containsFlyout","sortedOptions","KEBAB","toggleTitle","onToggleHover","isKebabVariant","toggleLabel","handleClickOutside","innerRef","firstElement","onMouseOver","pinnedResources","updatePinsFn","updatedPinnedResources","NavLink","linkProps","NavItemHref","prefixNamespaced","useNavExtensionsForPerspective","allPerspectives","allNavExtensions","isDefaultPerspective","isExtensionForCurrentPerspective","terminalTabs","setTerminalTabs","activeTabKey","setActiveTabKey","tickNamespace","setTickNamespace","tickWorkspace","setTickWorkspace","startTime","tickReq","handleTick","requestAnimationFrame","cancelAnimationFrame","getWorkspaceNamespace","getWorkspaceName","activeKey","isBox","terminalNumber","eventKey","tabs","removeCurrentTerminal","setWorkspaceName","setWorkspaceNamespace","newTerminalNumber","handleSubmit","handleReset","isSubmitting","isAdmin","submitError","submitLabel","disableSubmit","resetLabel","sticky","resolveURL","processURL","getDocumentOrigin","origin","baseAbsoluteURL","setClosed","nextButtonText","backButtonText","showClose","showStepBadge","step","onNext","onBack","withoutSensitiveInformations","titleProductNameSuffix","getTelemetryTitle","getAttribute","safeJSToYAML","js","fallback","safeYAMLToJS","asyncYAMLToJS","ModalErrorContent","PrometheusGraphLink","canAccessMonitoring","queries","textDecoration","PrometheusGraph","getModel","NamespaceBarDropdowns","onNamespaceChange","activeNamespaceError","setActiveNamespaceError","newProject","NamespaceBar","hideProjects","editYamlComponent","EditYAML","viewYamlComponent","PodsComponentWithTranslation","PodsComponent","navFactory","machineConfigs","machines","workloads","NavBar","sliced","lastElement","defaultPage","baseURL","activePage","labelId","HorizontalNav","objReference","dynamicResourceNavTabExtensions","dynamicTabExtensions","navTabExtensions","pageProps","pagesFor","pageData","createRedirect","hideNav","noStatusBox","skeletonDetails","renderContent","HorizontalNavFacade","Activity","RecentEventsBodyContent","setPaused","moreLink","eventsData","newExpanded","lastEvents","asDefinitionList","PauseButton","togglePause","RecentEventsBody","OngoingActivityBody","resourceActivities","prometheusActivities","allActivities","NameValueEditor_","_append","_appendConfigMapOrSecret","_change","_move","_remove","updateParentData","nameValuePairs","nameValueId","configMapSecretKeyRef","onLastItemRemoved","Name","Value","dragIndex","hoverIndex","movedPair","addString","allowSorting","configMaps","secrets","addConfigMapSecret","toolTip","nameString","valueString","pairElems","pair","Index","PairElement","onMove","rowSourceId","disableReorder","alwaysAllowRemove","NameValueEditor","EnvFromEditor_","configMapSecretRef","ENV_FROM","Prefix","Resource","serviceAccounts","firstTitle","secondTitle","addButtonDisabled","addButtonLabel","EnvFromPairElement","EnvFromEditor","pairSource","beginDrag","itemTarget","hoverBoundingRect","hoverMiddleY","hoverClientY","getClientOffset","collectSourcePair","connectDragSource","dragSource","connectDragPreview","dragPreview","isDragging","collectTargetPair","PairElement_","_onRemove","_onChangeName","_onChangeValue","deleteIcon","dragButton","EnvFromPairElement_","_onChangePrefix","_onChangeResource","deleteButton","useActiveColumns","ComputedServiceBindingStatus","PodTraffic","tooltipFlag","allEndpoints","endpoints","receivingTraffic","endPoint","quickStarts","quickStartsLoaded","allowedQuickStarts","setAllowedQuickStarts","permissionsLoaded","setPermissionsLoaded","permissionChecks","handlePermissionCheck","hasPermission","filteredQuickStarts","quickstart","onPermissionCheck","LazyMenuRenderer","initActionLoader","setInitActionLoader","hideMenu","handleHover","keyKind","ListDropdownWithTranslation","dataFilter","currentState","keyChanged","keyKindChanged","ListDropdown_","ListDropdown","useProjectOrNamespaceModel","canCreateNs","canCreateProject","NsDropdown","createNamespaceModal","createProjectModal","setSelectedKey","resourceKindLabel","placeholderModel","setActivePerspective","LabelsModalComponent","useLabelsModal","SelectedSilencesContext","selectedSilences","setSelectedSilences","ruleURL","alertingRuleSource","sourceId","alertSource","silenceAlert","MonitoringResourceIcon","AlertStateIcon","getAlertStateKey","AlertState","SilenceState","Active","Expired","stateData","getStateKey","StateTimestamp","AlertStateDescription","silencedBy","SeverityIcon","Info","Severity","severityData","getSeverityKey","SeverityBadge","SeverityCounts","severities","StateCounts","states","PopoverField","AlertStateHelp","SeverityHelp","SourceHelp","isActionWithHref","queryBrowserURL","Graph","filterLabels","formatSeriesTitle","ruleDuration","defaultTimespan","GraphLink","tableSilenceClasses","SilenceMatchersList","SilenceTableRow","showCheckbox","createdBy","endsAt","firingAlerts","startsAt","onCheckboxChange","oldSet","newSet","SilenceDropdownKebab","SilenceTableRowWithCheckbox","alertMessageResources","statefulset","matchCount","haystack","regExpString","AlertMessage","messageParts","labelValue","tagCount","resourceNameCount","splitParts","HeaderAlertMessage","getSourceKey","SilencedByList","AlertsDetailsPage","isDevPerspective","hideGraphs","ruleAlerts","labelsMemoKey","runbookURL","runbook_url","alertsChartExtensions","alertsChart","AlertsChart","alertName","PrometheusTemplate","ActiveAlerts","AlertRulesDetailsPage","alertLabels","nameLabel","__name__","otherLabels","showLegend","ExpireSilenceModal","silenceID","isInProgress","setNotInProgress","SilenceDropdown","Toggle","setModalOpen","setModalClosed","editSilence","ActionsToggle","SilenceDropdownActions","SilencedAlertsList","SilencesDetailsPage","alertsLoaded","updatedAt","comment","tableAlertClasses","AlertTableRow","severityRowFilter","SilencesNotLoadedWarning","silencesLoadError","alertStateOrder","getAdditionalSources","itemSource","additionalSources","AlertsPage","alertAdditionalSources","allFilters","ruleHasAlertState","NotFiring","ruleAlertStateFilter","alertStateFilter","tableRuleClasses","RuleTableRow","RulesPage","ruleAdditionalSources","CreateSilenceButton","ExpireAllSilencesButton","silenceFiringAlertsOrder","silenceStateOrder","SelectAllCheckbox","activeSilences","isAllSelected","SilencesPage","nsMatcher","Tab","AlertingPage","rulesPath","PollerPages","customExtensions","alertsSource","alertsKey","rulesKey","PrometheusUIRedirect","MonitoringUI","AnnotationsModalComponent","useAnnotationsModal","NotificationTypes","NotificationIcon","success","NotificationAction","notificationType","notificationTypeString","cellMargin","cellWidth","celldefaultHeight","headerHeight","estimatedCellHeight","gridProps","securityHealthHandler","quayURLFor","vuln","SecurityBreakdownPopup","vulnsFor","highestSeverity","fixableVulns","fixableCount","getVulnerabilityCountText","totalCount","baseVulnListUrl","vulnDetailsUrl","marginRight","vulnImageCount","imageName","userPreferenceGroupExtensions","sortedUserPreferenceGroups","userPreferenceItemExtensions","userPreferenceItemResolved","sortedUserPreferenceItems","groupIdFromUrl","initialTabId","activeTabId","setActiveTabId","userPreferenceTabs","userPreferenceTabContents","populatedUserPreferenceGroups","tabContents","currGroup","tabContentId","tabContentRef","spotlight","spotlightElement","setSpotlightElement","hint","isVertical","interactive","useLastNamespace","NameValueEditorComponent","TagsModal","setTags","usedTags","AnnotationsModal","displayDurationInWords","stop","stopTime","durationInWords","DeleteModal","setIsChecked","isDeleteOtherResourcesChecked","setIsDeleteOtherResourcesChecked","setOwner","resourceOwner","deleteAllResources","listPath","redirectTo","intervalVariableRegExps","isIntervalVariable","re","evaluateTemplate","range","__range","__range_ms","__range_s","intervalMS","intervalMinutes","interval","replacement","FilterSelect","OptionComponent","onTypeaheadInputChanged","VariableOption","VariableDropdown","variable","setIsError","customDataSourceName","hasExtensions","prometheusProps","ext","getDataSource","dataSource","prometheusQuery","AllVariableDropdowns","keySeq","tagColors","Tag","DashboardDropdown","allTags","uniqueTags","selectItems","PollIntervalDropdown","refreshIntervalFromParams","TimeDropdowns","HeaderTop","QueryBrowserLink","getPanelClassModifier","panel","span","getPanelSpan","Card","wasEverVisible","dataSourceInfoLoading","setDataSourceInfoLoading","setCustomDataSource","targets","legendFormat","handleZoom","timeRange","panels","rawQueries","expr","panelClassModifier","isClickable","isSelectable","hasNoOffset","isStack","legend","yaxes","onZoomHandle","PanelsRow","row","showButton","toggleIsExpanded","collapse","fontSize","Board","board","setBoard","boardItems","changeBoard","newBoard","timeSpan","refreshInterval","boardName","pad","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","DatetimeTextInput","pattern","toISOString","NegativeMatcherHelp","SilenceForm","durations","defaultIsStartNow","defaultDuration","durationFromDefaults","setComment","setCreatedBy","setDuration","setEndsAt","setHours","isStartNow","setIsStartNow","setMatchers","setStartsAt","setMatcherField","newMatchers","displayText","saveStartsAt","saveEndsAt","startsAtDate","getEndsAtValue","matcher","removeMatcher","EditInfo","EditSilence","isExpired","CreateSilence","getKeys","keyMap","itemKeys","NameKeyDropdownPair","pairKey","nameTitle","placeholderString","isKeyRef","refProperty","cmItems","secretItems","saItems","keyTitle","cmRefProperty","secretRefProperty","serviceAccountRefProperty","firstConfigMap","firstSecret","serviceAccount","getHeaders","keyValuePair","ConfigMapSecretKeyRef","ConfigMapSecretRef","keyStringToComponent","fieldRef","fieldPath","secretKeyRef","configMapKeyRef","resourceFieldRef","configMapRef","secretRef","serviceAccountRef","ValueFromPair","onChangeVal","_onChangeVal","valueFromKey","componentInfo","ResourceList","hideTextFilter","SearchPage","selectedItems","setSelectedItems","collapsedKinds","setCollapsedKinds","setLabelFilter","labelFilterInput","setLabelFilterInput","typeaheadNameFilter","setTypeaheadNameFilter","setPinnedResources","pinnedResourcesLoaded","validTags","clearSelectedItems","clearNameFilter","clearLabelFilter","getChipText","light","collapseListedFiltersBreakpoint","newLabels","keepItem","endOfString","updatedLabels","updateLabelFilter","updateNameFilter","nameFilterInput","isCollapsed","kindView","newCollasped","toggleKindExpanded","getToggleText","pinToggle","doc","loc","definitionRefs","findOperation","definitions","oneQuery","operationName","newDoc","opRefs","allRefs","newRefs","refName","prevRefs","childRef","def","collectFragmentReferences","selectionSet","variableDefinitions","isClusterUpdateActivity","getClusterUpdateTimestamp","startedTime","checkNamespaceExists","useDetailsItemExtensionsForResource","typeGuard","columnMatches","modelMatches","aWeight","sortWeight","bWeight","ExtensionDetailsItem","isDataSource","ToggleGraph","isItemString","cellStyle","eventSourceModelrefs","getKebabActionsForWorkload","getOperatorWatchedResources","clusterServiceVersions","getServiceBindingWatchedResources","serviceBindingRequests","searchFilterValues","SearchFilterDropdown","parentClassName","createResourceExtension","CreateYAML","ConsoleNotifier_","notification","ConsoleNotifier","CLOUD_SHELL_NAMESPACE","CLOUD_SHELL_NAMESPACE_CONFIG_STORAGE_KEY","pluginMap","loadDynamicPlugin","existingPluginData","existingPluginID","registrationMethod","entryCallbackFired","loadScripts","scriptName","scriptID","getScriptElementID","scriptURL","script","async","head","registerPluginEntryCallback","loadPluginEntry","initSharedPluginModulesCallback","resolveEncodedCodeRefsCallback","pluginData","addDynamicPlugin","getPluginEntryCallback","loadAndEnablePlugin","adaptPluginManifest","releaseVersion","getAllowedDynamicPluginNames","setDynamicPluginEnabled","TYPE_WORKLOAD","TYPE_CONNECTS_TO","TYPE_AGGREGATE_EDGE","TYPE_SERVICE_BINDING","TYPE_APPLICATION_GROUP","TYPE_TRAFFIC_CONNECTOR","LAST_TOPOLOGY_VIEW_LOCAL_STORAGE_KEY","TOPOLOGY_LAYOUT_LOCAL_STORAGE_KEY","LAST_TOPOLOGY_OVERVIEW_OPEN_STORAGE_KEY","TOPOLOGY_VIEW_CONFIG_STORAGE_KEY","TOPOLOGY_LAYOUT_CONFIG_STORAGE_KEY","TOPOLOGY_SIDE_BAR_WIDTH_STORAGE_KEY","DEFAULT_GROUP_PAD","NODE_WIDTH","NODE_HEIGHT","NODE_PADDING","GROUP_WIDTH","GROUP_HEIGHT","GROUP_PADDING","CREATE_APPLICATION_KEY","UNASSIGNED_KEY","ALLOW_EXPORT_APP","EXPORT_CR_NAME","EXPORT_JOB_PREFIX","ROUTE_URL_ANNOTATION","ROUTE_DISABLED_ANNOTATION","getRouteHost","onlyAdmitted","oldestAdmittedIngress","oldestTransitionTime","ingress","admittedCondition","isWebRoute","getRouteWebURL","getRouteLabel","getSubdomain","RouteLinkAndCopy","RouteLocation","routeStatus","atLeastOneAdmitted","RouteStatus","TLSSettings","showKey","setShowKey","visibleKeyValue","certificate","caCertificate","termination","destinationCACertificate","showCustomRouteHelp","routerCanonicalHostname","RouteTargetRow","weight","alternateBackends","alternate","toFixed","calcTrafficPercentage","CustomRouteHelp","RouteIngressStatus","routerName","wildcardPolicy","RouteDetails","primaryIngressStatus","hostname","ingresses","PodDisruptionBudgetField","pdbResources","pdb","replicas","pdbDescription","anyContainerWithVolumeMounts","volumeRowColumnClasses","VolumesTableRows","mountPath","subPath","volumeDetail","podVolume","volumes","podVolumeIsReadOnly","VolumeKebab","rowVolumeData","VolumesTable","tableProps","volumeMounts","getRowVolumeData","StatusPopupSection","firstColumn","secondColumn","EventSourceConditionTypes","ChannelConditionTypes","TriggerConditionTypes","BrokerConditionTypes","SubscriptionConditionTypes","DomainMappingResponseAction","ServerlessBuildStrategyType","ServiceTypeValue","nodeStatus","usePromiseHandler","targetNamespacesFor","operatorNamespaceFor","operatorGroupFor","NoOperatorGroupMsg","requireOperatorGroup","operatorGroup","supports","namespaces","supportedModes","InstallModeTypeOwnNamespace","InstallModeTypeAllNamespaces","InstallModeTypeSingleNamespace","InstallModeTypeMultiNamespace","isGlobal","subscriptionFor","allSubscriptions","allGroups","packageName","sourceNamespace","og","installedFor","providedAPIsForOperatorGroup","CONSOLE_OPERATOR_CONFIG_NAME","CONTAINER_WAITING_STATE_ERROR_REASONS","DEPLOYMENT_CONFIG_LATEST_VERSION_ANNOTATION","DEPLOYMENT_PHASE_ANNOTATION","DEPLOYMENT_REVISION_ANNOTATION","METRICS_POLL_INTERVAL","TRIGGERS_ANNOTATION","DEPLOYMENT_STRATEGY","DEPLOYMENT_PHASE","SyncMarkdownView","emptyMsg","contextTheme","markDownTheme","volumeSnapshotStatus","snapshotStatusFilters","serviceBindingModal","createServiceBindingModal","enableScaling","clickCount","setClickCount","isAccessScalingAllowed","handleScaling","operation","hpa","hpaControlledScaling","isScalingAllowed","enableAutoscaling","resourceObj","isBlock","useCreateNamespaceModal","useCreateProjectModal","baseTemplates","getYAMLTemplates","extensionTemplates","yt","templateName","ShortcutCommand","isMac","click","ctrl","ctrlCmd","drag","keyName","rightClick","dragNdrop","useMaintenanceCapability","isPVCCreateProp","isPVCAlert","isPVCStatus","isPVCDelete","isYAMLTemplate","getPDBResource","isDisruptionViolated","expectedPods","checkPodDisruptionBudgets","pdbArray","setTrafficDistributionModal","trafficModalLauncher","setSinkSourceModal","sinkModalLauncher","setSinkPubsubModal","sinkPubsubModalLauncher","deleteRevisionModal","deleteRevisionModalLauncher","editSinkUriModal","testServerlessFunctionModal","testFunctionModalLauncher","consolePluginModal","deleteResourceModal","ServiceBindingDeprecationAlertForTopology","productDetails","ServiceBindingWarningForTopology","serviceBindings","serviceBindingsLoaded","triggerAction","ServiceBindingDeprecationAlert","ServiceBindingDeprecationAlertForModals","CloudServicesRequestModel","KafkaConnectionModel","CloudServiceAccountRequest","SWAGGER_LOCAL_STORAGE_KEY","getDefinitionKey","swaggerDefinitions","getSwaggerDefinitions","fetchSwagger","definitionFor","getSwaggerPath","allProperties","currentPath","followRef","nextPath","definition","$ref","getRef","getPropertyDescription","propertyPath","rootPath","nextProperty","findDefinition","getResourceDescription","getOperatorBackedServiceKindMap","installedOperators","kindMap","isOperatorBackedService","operatorBackedServiceKindMap","operatorResource","ExportModel","FieldLevelHelp","popoverHasAutoWidth","hasAutoWidth","AsyncCodeEditor","useSelectList","visibleRows","onRowSelected","selectedRows","setSelectedRows","uniqueUIDs","updateSelectedRows","usePrometheusGate","useEditorType","lastViewUserSettingKey","checkEditorTypeEnabled","lastViewedEditorType","setLastViewedEditorType","lastViewedEditorTypeLoaded","preferredEditorType","preferredEditorTypeLoaded","isEditorTypeEnabled","resourceLoaded","activeEditorType","setActiveEditorType","editorType","viewBox","verticalAlign","cx","cy","fillRule","clipRule","isCSRResource","getNodeCSRs","csrs","csr","usages","isCSRPending","getNodeClientCSRs","nodeCSRs","asn1","commonName","typesAndValues","valueBlock","originalName","grouped","getNodeServerCSR","areaTheme","area","barTheme","bar","textAnchor","suggestionBoxKeyHandler","HIDE","SuggestionLine","suggestion","suggestions","setSuggestions","visible","processed","labelParser","processedText","ManagedByOperatorResourceLink","csvName","ownerGroupVersionKind","ownerIsCSV","ManagedByOperatorLink","DEFAULT_OPTIONS","truncateEnd","omission","minTruncateChars","truncateMiddle","startLength","endLength","shouldTruncate","VirtualizedTable","ListPageHeader","ListPageCreate","ListPageFilter","StatusPopupItem","Overview","OverviewGrid","InventoryItem","YAMLEditor","CodeEditor","ResourceYAMLEditor","AsyncResourceYAMLEditor","ResourceEventStream","ActionServiceProvider","ErrorBoundaryFallbackPage","QueryBrowser","useDeleteModal","AddEventSourceAction","contextSource","pageUrl","CONTEXT_SOURCE","APPLICATION","TRIGGER_ACTION_ID","addTrigger","AddTriggerAction","SUBSCRIPTION_ACTION_ID","addSubscription","AddSubscriptionAction","hideKnatifyAction","isWorkloadReady","cd","setKnatify","MakeServerless","InitialReceivers","AlertRouting","getIntegrationTypes","receiver","getRoutingLabelsByReceivers","parentLabels","parentMatchers","match_re","numberOfIncompleteReceivers","receivers","defaultReceiverName","defaultReceiver","criticalReceiver","numIncompleteReceivers","RoutingLabels","ReceiverTableRow","routingLabelsByReceivers","receiverRoutingLabels","receiverIntegrationTypes","integrationTypesLabel","isDefaultReceiver","receiverHasSimpleRoute","hasSimpleRoute","canUseEditForm","receiverConfig","numConfigs","hasSimpleReceiver","canDelete","Default","rte","receiverName","deleteReceiver","ReceiversTable","ReceiversEmptyState","Receivers","receiverFilter","setReceiverFilter","filterStr","numOfIncompleteReceivers","receiverString","AlertmanagerConfiguration","AlertmanagerConfigWrapper","AlertmanagerConfig","configPath","YAMLPath","CopyCodeModal","snippet","useCopyCodeModal","getMachineRole","getMachineInstanceType","getMachineRegion","getMachineZone","getMachineAWSPlacement","machineSet","providerSpec","getMachineNodeName","getMachineNode","nodes","getMachineAddresses","getMachinePhase","bindableServicesData","bindableServices","fetchBindableServices","bindableService","getBindableServicesList","HOST_STATUS_READY","HOST_STATUS_AVAILABLE","HOST_STATUS_UNMANAGED","HOST_STATUS_ERROR","HOST_STATUS_UNKNOWN","HOST_STATUS_EXTERNALLY_PROVISIONED","HOST_STATUS_PROVISIONED","HOST_STATUS_DEPROVISIONING","HOST_POWER_STATUS_POWERED_ON","HOST_POWER_STATUS_POWERED_OFF","HOST_POWER_STATUS_POWERING_OFF","HOST_POWER_STATUS_POWERING_ON","HOST_STATUS_TITLE_KEYS","HOST_STATUS_DESCRIPTION_KEYS","HOST_REGISTERING_STATES","HOST_PROVISIONING_STATES","HOST_ERROR_STATES","HOST_PROGRESS_STATES","HOST_SUCCESS_STATES","HOST_INFO_STATES","HOST_HARDWARE_ERROR_STATES","isActionProvider","isResourceActionProvider","isActionGroup","isActionFilter","MenuOptionType","isAddAction","isAddActionGroup","isDetailPageBreadCrumbs","isCatalogItemType","isCatalogItemTypeMetadata","isCatalogItemProvider","isCatalogItemFilter","isCatalogItemMetadataProvider","ClusterConfigurationFieldType","isClusterConfigurationGroup","isClusterConfigurationItem","isClusterOverviewInventoryItem","isClusterOverviewUtilizationItem","isClusterOverviewMultilineUtilizationItem","isOverviewDetailItem","isCustomOverviewDetailItem","isContextProvider","isCreateResource","isDashboardsTab","isDashboardsCard","isDashboardsOverviewHealthPrometheusSubsystem","isResolvedDashboardsOverviewHealthPrometheusSubsystem","isDashboardsOverviewHealthURLSubsystem","isResolvedDashboardsOverviewHealthURLSubsystem","isDashboardsOverviewHealthResourceSubsystem","isResolvedDashboardsOverviewHealthResourceSubsystem","isDashboardsOverviewHealthOperator","isResolvedDashboardsOverviewHealthOperator","isDashboardsInventoryItemGroup","isDashboardsOverviewInventoryItem","isDashboardsOverviewInventoryItemReplacement","isDashboardsProjectOverviewInventoryItem","isDashboardsOverviewResourceActivity","isDashboardsOverviewPrometheusActivity","isDashboardsOverviewHealthSubsystem","isFileUpload","isImportEnvironment","isHrefNavItem","isResourceNSNavItem","isResourceClusterNavItem","isResourceNavItem","isSeparator","isNavSection","isNavItem","isNavItemOrSeparator","isNavExtension","isAlertAction","isRoutePage","isStandaloneRoutePage","isResourceListPage","isResourceDetailsPage","isResourceTabPage","isPerspective","isProjectOverviewInventoryItem","isProjectOverviewUtilizationItem","isReduxReducer","ProvisionerType","isStorageClassProvisioner","isStorageProvider","isTelemetryListener","isDetailsTab","isDetailsTabSection","isDetailsResourceLink","isDetailsResourceAlert","isPodAdapter","isBuildAdapter","isNetworkAdapter","isTopologyComponentFactory","isTopologyCreateConnector","isTopologyDataModelFactory","isTopologyDisplayFilters","isTopologyDecoratorProvider","isTopologyRelationshipProvider","UserPreferenceFieldType","isUserPreferenceGroup","isUserPreferenceItem","isNodeStatus","isCreateProjectModal","storeContextPresent","initPlugins","apiDiscovery","AllPodStatus","podColor","Empty","Succeeded","isProjectDashboardInventoryItem","isCustomFeatureFlag","isOverviewTabSection","isPostFormSubmissionAction","getJobTypeAndCompletions","completions","parallelism","k8sPatchByName","k8sKillByName","k8sListPartialMetadata","k8sWaitForUpdate","checkCondition","timeoutInMs","watcher","waitForCondition","waitForTimeout","withExtensions","typeGuardMapper","HOC","extensionProps","propName","combinedProps","OperatorStatus","getStatusAndMessage","cannotUpdate","CannotUpdate","unavailable","Unavailable","degraded","progressing","Available","operatorVersion","ImagePullPolicy","MachineConfigPoolConditionType","ClusterVersionConditionType","wrapper","Wrapper","innerProps","getBadgeFromType","DEV","TECH","lineClamp","isContentClamped","setContentClamped","debouncedSetContentClamped","scroll","scrollHeight","offset","onResize","measureRef","KeyEventModes","textInputKeyHandler","FOCUS","useDocumentListener","keyEventMap","handleEvent","handleKeyEvents","blur","requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror","nativeAPI","useFullscreen","isFullscreen","setIsFullscreen","fullscreenRef","elementRef","ScrollDirection","useScrollDirection","scrollPosition","scrollDirection","setScrollDirection","handleScroll","clientHeight","prevScrollTop","currentScrollTop","scrolledToBottom","scrolledToTop","scrollingUp","scrollingDown","getScrollDirection","Shadows","useScrollShadows","shadows","setShadows","computeShadows","both","HelmChartRepositoryModel","ProjectHelmChartRepositoryModel","cleanSelectorStr","SelectorInput","isBasic","ref_","inputValue","isInputValid","isTagValid","changed","newTag","cleanNewTag","newTags","cleanTags","removeKeys","handleInputChange","spellCheck","addKeys","renderTag","getTagDisplayValue","isTruncated","addOnBlur","STREAM_PAUSED","STREAM_ACTIVE","LOG_SOURCE_RESTARTING","LOG_SOURCE_RUNNING","LOG_SOURCE_TERMINATED","LOG_SOURCE_WAITING","streamStatusMessages","getResourceLogURL","tailLines","follow","logType","HeaderBanner","headerText","FooterButton","setStatus","linesBehind","resumeText","showDebugAction","LogControls","toggleFullscreen","currentLogURL","toggleStreaming","podLogLinks","namespaceUID","toggleWrapLines","isWrapLines","changeLogType","hasPreviousLog","showLogTypeSelect","isShowFullLog","toggleShowFullLog","isLogTypeOpen","setLogTypeOpen","isMobile","isDropdownOpen","setIsDropdownOpen","onDropdownToggleClick","logTypes","renderPodLogLinks","namespaceFilter","namespaceRegExp","hrefTemplate","resourceUID","resourceNamespace","resourceNamespaceUID","podLabels","orientation","fullLog","wrapLines","download","fullscreen","select","single","logOption","logTypeSelect","minSearchChars","popperProps","ResourceLog","bufferSize","showFullLog","setShowFullLog","showFullLogCheckbox","setShowFullLogCheckbox","buffer","resourceLogRef","logViewerRef","externalLogLinkFlag","hasTruncated","setHasTruncated","setLines","setLinesBehind","totalLineCount","setTotalLineCount","setNamespaceUID","setPodLogLinks","setContent","setLogType","hasPreviousLogs","setPreviousLogs","previousResourceStatus","previousTotalLineCount","linkURL","setWrapLines","hasWrapAnnotation","wrapLinesCheckbox","setWrapLinesCheckbox","firstRender","timeoutIdRef","countRef","scrollToBottom","currentLinesBehind","startWebSocket","ingest","currentLineCount","getTail","getLines","getHasTruncated","podLogLinks_","logControls","currentStatus","isTextWrapped","toolbar","scrollOffsetToBottom","scrollUpdateWasRequested","initialIndexWidth","DetailsPage","pluginBreadcrumbs","setPluginBreadcrumbs","resourcePageExtensions","dynamicResourcePageExtensions","renderAsyncComponent","resolvedBreadcrumbExtension","breadCrumbsExtension","breadCrumbsResolved","dynamicBreadCrumbsExtension","dynamicBreadCrumbsResolved","getModels","useBreadCrumbsForDetailPage","onBreadcrumbsResolved","allPages","objResource","useBreadcrumbs","breadcrumbsProvider","urlMatch","customKind","ChartLegendTooltipContent","activePoints","center","dx","dy","flyoutHeight","flyoutWidth","ChartLegendTooltipLabel","legendComponent","themeColor","pointerLength","evaluateProp","legendProps","visibleLegendData","hasMainData","legendOffsetY","getX","_flyoutWidth","flyout","getY","_flyoutHeight","maxLegendDimensions","minLegendDimensions","tooltipLegendData","textAsLegendData","_title","Function","getTitleComponent","styles","applyDefaultStyle","customStyle","getStyle","ChartLegendTooltip","isCursorTooltip","mainDatum","uDatum","legendTooltipProps","getFlyoutHeight","sizeProps","getFlyoutWidth","tooltipComponent","showPointer","getTooltipComponent","toDefaultSecretType","typeAbstraction","opaque","toTypeAbstraction","generateSecret","s4","determineSecretType","stringData","dataKeys","getImageSecretKey","secretType","useSecretTitle","useSecretDescription","SecretTypeAbstraction","AUTHS_KEY","SecretType","SecretFormWrapper","modal","onCancel","existingSecret","defaultSecretType","secretTypeAbstraction","initialSecret","setSecret","setStringData","base64StringData","setBase64StringData","disableForm","setDisableForm","helptext","onDataChanged","secretsData","onNameChanged","newSecret","save","onSave","renderBody","onFormDisable","PullSecretForm","authType","setAuthType","pullSecretData","jsonContent","secretData","newDataKey","onchange","authTypes","onDisable","PullSecretCredentialEntry","address","password","updateEntry","handleBlurEvent","handleChangeEvent","CreateConfigSubformWithTranslation","isDockerconfigjson","secretEntriesArray","imageSecretObjectToArray","hasDuplicate","entry","imageSecretObject","imageSecretArray","newImageSecretEntry","decodedAuth","parsedAuth","imageSecretsObject","imageSecretArrayToObject","updatedEntry","entryIndex","updatedEntryData","propagateEntryChange","secretEntriesList","entryData","removeEntry","addEntry","CreateConfigSubform","UploadConfigSubformWithTranslation","configFile","parseError","changeData","onFileChange","updateState","parsedData","UploadConfigSubform","WebHookSecretFormWithTranslation","changeWebHookSecretkey","generateWebHookSecret","WebHookSecretForm","SourceSecretFormWithTranslation","changeAuthenticationType","SourceSecretForm","BasicAuthSubformWithTranslation","BasicAuthSubform","SSHAuthSubformWithTranslation","SSHAuthSubform","GenericSecretFormWithTranslation","genericSecretObjectToArray","genericSecretObject","newGenericSecretEntry","isBinary","isBase64","genericSecretArray","entryID","updatedSecretEntriesArray","genericSecretArrayToObject","GenericSecretForm","KeyValueEntryFormWithTranslation","onValueChange","onKeyChange","KeyValueEntryForm","SecretLoadingWrapper","EditSecret","CreateSecret","SecretSubForm","useK8sModels","optionsLoadError","dropdownOpen","setDropdownOpen","lowerCaseFilterText","lastViewedOption","onCreateNamespace","loadErrorDescription","loadErrorState","lastNamespaceOption","namespaceMenu","selectedValue","selectedLabel","menuHeight","useExactSearch","exactSearch","exactSearchLoaded","IDP_TYPES","basicauth","github","gitlab","google","htpasswd","keystone","ldap","oidconnect","requestheader","TextFilter","otherInputProps","ListPageWrapper","memoizedIds","FireMan","setReduxIDs","applyFilter","updateURL","runOrNavigate","itemName","ListPage","createHandler","skipAccessReview","_resources","MultiListPage","spans","toExponential","formatPositiveValue","abs","valueFormatter","GraphEmptyState","SpanControls","defaultSpanText","hasReducedResolution","setIsValid","setText","debouncedOnChange","setSpan","newText","isDebounced","newSpan","newIsValid","isFill","truncateTitle","spaceOnLeft","spaceOnRight","isOnLeft","tooltipMaxWidth","largestPoints","_y1","total","TOOLTIP_MAX_ENTRIES","allSeries","allSeriesSorted","TOOLTIP_MAX_HEIGHT","getSeriesName","x1","x2","y1","y2","graphContainer","voronoiPadding","LegendContainer","nullComponent","getXDomain","disabledSeries","fixedXDomain","tooltipSeriesNames","tooltipSeriesLabels","xDomain","setXDomain","findMin","findMax","minY","maxY","xAxisTickCount","xAxisTickShowSeconds","GroupComponent","ChartComponent","colors","crossAxis","tickComponent","gutter","itemsPerRow","symbolSpacer","formatSeriesValues","defaultEmptyValue","newValues","ZoomableGraph","onZoom","isZooming","setIsZooming","setX1","setX2","onMouseMove","clientX","onMouseUp","xMin","xMax","zoomWidth","oldFrom","middle","onMouseDown","getMaxSamplesForSpan","defaultSamples","disableZoom","fixedEndTime","hideControls","showStackedControl","tickInterval","lastRequestTime","maxSamplesForSpan","isDatasetTooBig","setIsDatasetTooBig","graphData","setGraphData","setSamples","updating","setUpdating","isStacked","setIsStacked","canStack","queriesKey","allPromises","newResults","numDataPoints","newSamples","newGraphData","queryIndex","onSpanChange","isRangeVector","isGraphDataEmpty","TogglePlayWithTranslation","TogglePlay","cloudProviderID","providerID","cloudProviderNames","providerNames","usePreventDataLossLock","lock","onBeforeUnload","returnValue","setInFlight","filename","BuildStrategy","dockerfile","devfile","jenkinsfile","buildFromPath","buildFrom","outputTo","commitMessage","commitHash","commitAuthorName","pushSecret","resourceLimits","BuildHooks","postCommitArgs","postCommitCommand","postCommitScript","kubeAPIServerURL","TriggerTypes","webhookTriggerTypes","Bitbucket","Generic","GitHub","GitLab","getTriggerProperty","WebhookTriggers","canGetSecret","getTableColumnClasses","webhookSecrets","setWebhookSecrets","webhookTriggers","setWebhookTriggers","secretNames","setSecretNames","secretErrors","setSecretErrors","isLoaded","previousTriggers","newTriggers","newSecretNames","triggerProperty","webhookName","getWebhookURL","getClipboardButton","plainSecret","secretReference","webhookSecret","clipboard","writeText","webhookSecretValue","copyWebhookToClipboard","webhookURL","getSecretReference","clipboardButton","ScrollToTopOnMount","useScrollToTopOnMount","ports","port","containerPort","ContainerTable","SimpleTab","SimpleTabNav_","onClickTab","selectedTab","tabProps","selectedTabData","SimpleTabNav","RequestSizeInput","defaultRequestSizeUnit","defaultRequestSizeValue","dropdownUnits","inputID","isInputDisabled","minValue","testID","parsedRequestSizeValue","setUnit","inputName","dropdownName","changeBy","newUnit","sizeUnit","togglePaused","newObj","WorkloadPausedAlert","metadataName","ListInput_","helpID","initialValues","missingValues","valueChanged","removeValue","addValue","ListInput","VolumeType","persistentVolumeClaim","claimName","skeletonTiles","skeletonCatalog","HintBlock","OperatorBackedOwnerReferences","ReleaseNotesLink","releaseNotesLink","NotificationDrawer","panelContent","hasNoPadding","useBuildConfigsWatcher","watchedResources","resourceWithLoadError","assureEndsWith","sentence","appendix","podKindString","isPendingPods","currentPodCount","desiredPodCount","getTitleAndSubtitle","isPending","titlePhrase","subTitlePhrase","longTitle","longSubtitle","podSubTitle","reversed","labelClasses","lineHeight","podRingLabel","ownerKind","titleData","podRingLabelData","failedPodCount","currValue","getFailedPods","currentNumberScheduled","desiredNumberScheduled","readyReplicas","usePodRingLabel","desiredPods","desiredReplicas","currentReplicas","hpaPodRingLabel","usePodScalingAccessStatus","isKnativeRevision","isPod","setEditable","setSinkSource","getPodsForDeploymentConfig","getPodsForDeployment","getPodsForStatefulSet","getPodsForDaemonSet","ds","getPodsForCronJob","getPodsDataForResource","getResourcesToWatchForPods","toggleIsOpen","intervalOptions","fetchAlerts","prometheusURL","externalAlertsFetch","resolvedExternalAlertsSources","extensionProperties","getAlertingRules","sourceIds","cephStorageProvisioners","objectStorageProvisioners","isCephProvisioner","scProvisioner","provisioner","isObjectSC","sc","getImageForCSVIcon","mediatype","base64data","getDefaultOperatorIcon","formatNamespacedRouteForResource","formatNamespacedRouteForHref","getLabelsAsString","sortMonitoringAlerts","getSeverityAlertType","getFiringAlerts","shouldHideMonitoringAlertDecorator","severityAlertType","isHelmResource","heritage","getTargetResource","defaultProjectAccessRoles","availableClusterRoles","samplePinnedResources","clusterRoleBindingSamples","targetResource","getResourceSidebarSamples","yamlSamplesList","yamlSamplesData","sample","allSamples","highlightText","img","lazyYaml","dump","unsubscribe","enabledTypes","snippets","MultiSelectDropdown","typeaheadMulti","cSelected","noResultsFoundText","XtermAddonFullscreen","nameRegex","nameValidationSchema","maxLength","excludeEmptyString","characterCount","getPluginPatch","getPatchForRemovingPlugins","isPluginEnabled","useJobsForCronJobWatcher","setJobs","errorKey","resourceJobs","usePodsWatcher","setPodData","watchKind","watchNS","updateResults","updatedResources","updatedPods","debouncedUpdateResources","useReplicationControllersWatcher","useRoutesWatcher","watchedServices","allRoutes","servicesNames","useCsvWatchResource","csvResource","csvData","csvLoaded","csvError","useTabbedTableBreadcrumbsFor","navOption","subTab","customBreadcrumbName","customBreadcrumbURLRequired","customBreadCrumbDetailsPrefix","nsURL","usePinnedResources","getPins","defaultPins","customizedPins","pr","gvk","pins","setPins","newPins","prevPR","useIsMobile","setIsMobile","mobileResolutionMatch","updateIsMobile","addListener","removeListener","useBoundingClientRect","clientRect","setClientRect","observerCallback","useEventListener","isFullScreen","useCopyLoginCommands","requestTokenURL","setRequestTokenURL","externalLoginCommand","setExternalLoginCommand","authEnabled","newRequestTokenURL","newExternalLoginCommand","isFullWidth","dropdownWithSwitchMenuProps","switchMenuProps","getMachineSetInstanceType","vmSize","machineType","flavor","getRequester","getDescription","getRequestedPVCSize","onlyPvcSCs","scObj","scResourceLoadError","scResource","parameters","encrypted","handleDownload","cancelLabel","infoTitle","hideSubmit","showAlert","footerElementRef","shadowPosition","primary","marginTop","marginStyles","flexDirection","disablePaneBody","flexLayout","paddingBottom","fullWidth","envs","environmentVariables","nameValue","setNameValue","setConfigMaps","setSecrets","handleNameValuePairs","updatedNameValuePairs","valueFrom","formReloadCount","nsConfigMaps","nsSecrets","hasSelectedOption","placeholderOption","isPlaceholder","safeValue","emptyValues","emptyMessage","complexFields","fieldValue","totalFieldCount","fieldSpans","render","onDelete","setOutputAsIntegerFlag","unitName","unitOptions","fieldUnit","resize","SampleResource","showSamples","showShortcuts","showMiniMap","editorRef","sidebarOpen","setSidebarOpen","sampleResources","hasSidebarContent","templateExtensions","sanitizeYamlContent","yamlByExtension","toolbarLinks","sidebarLabel","toggleSidebar","itemList","loadingItems","recommended","showIfSingle","showFilter","showCount","emptyStateMessage","selectedError","selectedTouched","filteredList","setFilteredList","handleItemChange","filterSources","debounceFilterText","iconUrl","beforeInput","afterInput","groupTextType","TextArea","getTextColumnProps","colProps","uiSchema","formDescription","formContext","DynamicForm","formData","tagName","customUISchema","noActions","liveValidate","yamlContext","prune","noMargin","yamlData","yamlWarning","setYAMLWarning","sanitizeToCallback","setSanitizeToCallback","disabledFormAlert","setDisabledFormAlert","setEditorType","changeEditorType","newType","onChangeType","newYAML","skipInvalid","sanitizeTo","handleToggleToYAML","margin","editor","PREFERRED_CREATE_EDIT_METHOD_USER_SETTING_VALUE_LATEST","usePreferredCreateEditMethod","preferredCreateEditMethod","preferredCreateEditMethodLoaded","isCreatable","hasOnCreateOption","isInputValuePersisted","toggleOnSelection","hideClearButton","getLabelFromValue","setNewOptions","toggleId","typeAheadAriaLabel","onCreateOption","GettingStartedCard","titleColor","links","telemetryCallback","getLinkTitleClassNames","isControlled","componentClassName","QuickStartGettingStartedCard","featured","setActiveQuickStart","slicedQuickStarts","allQuickStarts","orderedQuickStarts","isFeatured","getStatus","featuredQuickStartsByName","quickStartName","orderQuickStarts","tasks","getQuickStartNameRef","useQuickStarts","filterDisabledQuickStarts","quickStartsError","groupedQuickStarts","groupQuickStartsByName","quickStartsByName","preferredCountry","sameLanguageWithoutCountry","sameLanguageWithAnyCountry","fallbackLanguageSameCountry","fallbackLanguageNoCountry","fallbackLanguageAnyCountry","quickStartLanguage","quickStartCountry","getBestMatch","GettingStartedExpandableGrid","setShowState","titleTooltip","displaySize","toggleContent","HIDE_HEALTH_CHECK_ALERT_FOR","HEALTH_CHECK_CONFIGMAP_KEY","addHealthChecksRefs","hideHealthCheckAlertFor","setHideHealthCheckAlertFor","kindForCRDResource","canAddHealthChecks","containersName","healthCheckAdded","readinessProbe","livenessProbe","startupProbe","addHealthChecksLink","alertMessage","Popover","uniqueId","popover","PopoverPlacement","isDark","autofocus","setEnabled","previouslyEnabled","trusted","setSubmitError","setIsSubmitting","hpaName","hpaLabel","secondaryButtonAction","menuAction","actionName","selectedMenuItem","onSelection","highlightElement","hiddenElement","parentElement","queryArg","rowFilterReducer","textFilterReducer","resourceHeader","ResourceRow","filteredListItems","queryArgument","filteredText","ExecuteSnippet","showRunning","setShowRunning","textToExecute","executeTextId","innerText","setAttribute","removeAttribute","elements","querySelectorAll","showExecuteButton","elm","attributeValue","regex","subGroup","groupType","groupId","subgroup","quickSearchProviders","searchPlaceholder","viewContainer","allItemsLoaded","limitItemCount","disableKeyboardOpen","detailsRenderer","isLimitedList","searchCatalog","searchTerm","quickSearchProvider","viewAllLink","catalogLinkLabel","getCatalogURL","catalogItemTypes","typeDescription","item1","item2","viewAllLinks","allCatalogItemsLoaded","OverviewDetailItem","tableTags","MarkdownView","truncateContent","exactHeight","markup","converter","tables","openLinksInNewWindow","strikethrough","emoji","setOption","addExtension","makeHtml","allowedTags","allowedAttributes","div","pre","allowedSchemes","transformTags","markdownConvert","separator","InlineMarkdownView","IFrameMarkdownView","RenderExtension","markupRef","shouldRenderExtension","dangerouslySetInnerHTML","__html","frame","setFrame","frameHeight","setFrameHeight","contentDocument","updateDimensions","contentWindow","firstElementChild","filteredLinks","getElementsByTagName","contents","sandbox","srcDoc","border","categoriesString","developerCatalogCategories","categoriesArray","showAlreadyLoadedItemsAfter","catalogFilterExtensions","catalogBadgeProviderExtensions","extensionsResolved","extItemsMap","setExtItemsMap","extItemsErrorMap","setItemsErrorMap","setMetadataProviderMap","showAlreadyLoadedItems","timeIsUp","setTimeIsUp","useTimeout","enabledCatalogProviderExtensions","preCatalogItems","itemMap","fe","onMetadataValueResolved","catalogItemsMap","failedExtensions","failedCalls","totalCalls","catalogService","itemsMap","catalogExtensions","enableDetailsPanel","defaultTitle","defaultDescription","typeExtension","attribute","categoryParam","keywordParam","sortParam","crumbs","selectedId","SELECTED_ID","it","availableFilters","openDetailsPanel","closeDetailsPanel","catalogDescription","getCatalogTypeDescription","onVisibleItemChange","validChildren","child","validChild","isNameInVisibleItems","nodeMemory","used","nodeFS","nodeCPU","nodePods","nodeMachine","nodeInstanceType","nodeZone","nodeUptime","nodeReadiness","readiness","nodeRoles","sortWithCSRResource","getter","csrDefaultValue","snapshotSize","restoreSize","snapshotSource","persistentVolumeClaimName","volumeSnapshotContentName","withPostFormSubmissionCallback","postFormSubmissionCallback","withUserSettingsCompatibility","configStorageKey","localStoragekey","defaultvalue","userSettingState","setUserSettingState","withActivePerspective","getBindableServiceResources","BindableServicesModel","GitOpsServiceModel","NODE_STATUS_STARTING_MAINTENANCE","NODE_STATUS_UNDER_MAINTENANCE","NODE_STATUS_STOPPING_MAINTENANCE","NODE_STATUS_TITLE_KEYS","getNodeMaintenanceNodeName","nodeMaintenance","getNodeMaintenanceReason","getNodeMaintenancePhase","getNodeMaintenanceLastError","getNodeMaintenancePendingPods","getNodeMaintenanceProgressPercent","pendingPods","evictionPods","getNodeMaintenanceCreationTimestamp","findNodeMaintenance","nodeMaintenances","getHostOperationalStatus","getHostErrorType","getHostProvisioningState","getHostMachineName","getHostBMCAddress","getHostDisableCertificateVerification","getHostBootMACAddress","bootMACAddress","isHostOnline","getHostNICs","getHostStorage","getHostCPU","getHostRAMMiB","getHostErrorMessage","getHostDescription","isHostPoweredOn","getPoweroffAnnotation","isHostScheduledForRestart","hasRebootAnnotation","getHostPowerStatus","isOnline","isPoweredOn","poweroffAnnotation","getHostVendorInfo","getHostTotalStorageCapacity","disk","sizeBytes","getHostBios","getHostMachine","hasPowerManagement","ApplicationModel","useCreateResourceExtension","createResourceTypeGuard","extensionPage","GuidedTourMastheadTrigger","TabsComponent","variantStyle","light300","colorSchemeLight_300","Tabs","tabList","scrollTimeout","handleScrollButtons","disableLeftScrollButton","disableRightScrollButton","showScrollButtons","overflowOnLeft","firstChild","overflowOnRight","lastChild","scrollLeft","childrenArr","firstElementInView","lastElementOutOfView","scrollWidth","scrollRight","lastElementInView","firstElementOutOfView","shownKeys","defaultActiveKey","uncontrolledActiveKey","uncontrolledIsExpandedLocal","defaultIsExpanded","ouiaStateId","expandable","toggleAriaLabel","toggleText","mountOnEnter","isSecondary","leftScrollAriaLabel","rightScrollAriaLabel","ouiaId","ouiaSafe","unmountOnExit","usePageInsets","inset","filteredChildren","nav","localActiveKey","isExpandedLocal","toggleTabs","handleTabClick","vertical","box","scrollable","pageInsets","randomId","tabsToggle","tabsToggleButton","tabsToggleIcon","tabsScrollButton","tabsList","terminalNamespace","setTerminalNamespace","fetchError","setFetchError","namespaceRequest","useValuesForPerspectiveContext","lastPerspective","setLastPerspective","lastPerspectiveLoaded","existingPerspective","newPerspective","lastViewedLabel","currPerspective","nextPerspective","currPerspectiveName","nextPerspectiveName","setPreferredLanguage","isUsingDefault","setIsUsingDefault","checkboxLabel","useHideLightspeed","hideLightspeed","hideLightspeedLoaded","ActivityItem","ActivityBody","AlertsBody","AlertItem","HealthItem","HealthBody","ResourceInventoryItem","DetailsBody","UtilizationItem","UtilizationBody","UtilizationDurationDropdown","VirtualizedGrid","LazyActionMenu","QuickStartsLoader","ServicesList","useDashboardResources","lightspeedOperatorURL","setIsReady","lightspeedIsInstalled","setLightspeedIsInstalled","canListPackageManifest","canListOperatorGroup","canInstallLightspeed","isBordered","translationKeyMap","UID","translatableString","defineModels","updateResources","apiResourceData","coreResources","initApiDiscovery","storeInstance","useReduxStore","storeContext","setStoreContextPresent","moreRecent","metaA","metaB","removeFromList","qualifiedName","nextJS","deleteIn","equals","RESOURCES","newList","existingModel","newModel","findEntry","staticModel","updateIn","mergeDeep","currentJS","oldList","existingKeys","loadList","userSettingsKey","trueValue","falseValue","currentUserPreferenceValue","setCurrentUserPreferenceValue","currentUserPreferenceValueLoaded","checkedValue","useUserSettingsLocalStorage","session","valueInStorage","dataRef","storageUpdated","storageArea","configMapData","newData","previousData","dataToUpdate","StorageEvent","oldValue","dispatchEvent","CustomComponent","customComponentProps","dropdownOption","isCurrentUserPreferenceValuePresentInOptions","searchValue","searchLabel","namespaceProptype","componentName","RouteMetrics","namespaceRouteQuery","OverviewSpecialGroup","workloadResourceModels","getContainers","configureAddSecretToWorkloadModal","workloadOptions","setWorkloadOptions","workloadsByUID","setWorkloadsByUID","selectedWorkloadUID","setSelectedWorkloadUID","addAs","setAddAs","setPrefix","setMountPath","workloadsByUid","onAddAsChange","getPatches","envFrom","getEnvPatches","mount","existingVolumes","getVolumePatches","addAsEnvironment","addAsVolume","selectWorkloadPlaceholder","getValueForNamespace","syncRowFilterParams","syncSearchParams","labelFilters","searchFilters","searchFiltersValues","queryValue","setSearchFiltersState","flushSearchFiltersState","resourcesToOmit","toMatchWith","useTableData","initStaticFilters","initRowFilters","initCustomData","initCustomSorts","initSorts","tableSelectorCreator","oldSortState","newSortState","sortSelector","sortsState","objects","allTableFilters","filteredObjects","getFilteredRows","getSortValue","aPinned","seen","enter","measurementCache","SysEvent","shouldAnimate","exit","EventStreamList","setList","clearAll","measure","onEntered","print","containersToStatuses","PodLogs","_selectContainer","currentContainer","currentContainerStatus","containerToLogSourceStatus","containerDropdown","getRowId","getRowTitle","getRowClassName","minAvailable","maxUnavailable","ResourceMetricsDashboardCard","ResourceMetricsDashboard","PipelineLogMessage","BuildLogs","prevStatus","New","Cancelled","Complete","buildPhaseToLogSourceStatus","onProviderValueResolved","providerGuard","filterGuard","resourceProviderGuard","providerExtensions","providerExtensionsResolved","filterExtensions","filterExtensionsResolved","resourceProviderExtensions","resourceProviderExtensionsResolved","allProviderExtensions","allProviderExtensionsResolved","flattenedActions","SYSTEM_ALERT_RULE_LABEL","barSpacing","barWidth","LabelComponent","noLink","colorMap","green","orange","purple","red","yellow","Body","postfix","postfixFontSize","prefixFontSize","valueFontSize","valueMaps","setIsLoading","filteredVMs","vm","valueMap","thresholds","fieldOptions","thresholdIndex","colorName","refId","xs","labelColumns","valueColumns","alias","sortedData","MIN_VALUE","num","compact","timeSpanFromParams","endTimeFromParams","zeroPad","toISODateString","toISOTimeString","hourCycle","defaultFrom","fromDate","setFromDate","fromTime","setFromTime","toDate","setToDate","toTime","setToTime","hasNoBodyWrapper","spacer","is24Hour","useIsVisible","setIsVisible","setWasEverVisible","IntersectionObserver","isIntersecting","useFetchDashboards","setBoards","newBoards","dashboard","MonitorType","ServiceMonitorsWatchContext","ServicesWatchContext","PodMonitorsWatchContext","PodsWatchContext","PodMonitor","podMonitors","podMonitorsLoaded","podMonitorsLoadError","podsLoaded","podMonitor","scrapePool","namespaceSelector","matchNames","ServiceMonitor","monitors","monitorsLoaded","monitorsLoadError","servicesLoaded","Health","WatchErrorAlert","showError","hideError","scrapeUrl","isServiceMonitor","isPodMonitor","serviceMonitorsLoadError","lastScrape","lastError","tableClasses","lastScrapeDuration","btoa","List","TargetsUI","setTargets","servicesWatch","monitorsWatch","podsWatch","podMonitorsWatch","TARGETS","activeTargets","EditAlertmanagerYAML","genericYAML","AlertmanagerYAMLEditor","setErrorMsg","successMsg","setSuccessMsg","alertmanagerYAML","loadErrorMsg","AlertmanagerYAMLEditorWrapper","switchIsChecked","switchIsDisabled","switchLabel","switchLabelClassName","switchLabelIsReversed","switchLabelOff","switchOnChange","isReversed","labelOff","iKey","getSpans","trunc","remainder","DEFAULT_ROW_RENDERER","newProps","namePrefix","preview","drop","accept","collect","swap","accessReviewResources","accessReviews","accessReviewsLoading","descriptor","review","useForceUpdate","setTick","other","idealItemWidth","containerRole","columnWidth","cellRenderer","estimatedRowSize","columnCountEstimate","getRowHeight","flip","clicked","setClicked","elementToCheck","innerHeight","isInViewport","block","Tippy","popperInstance","medium","positionOffset","maxDimension","setCatalogItems","setCatalogTypes","isRndActive","setIsRndActive","setMaxHeight","setMinHeight","minWidth","setMinWidth","setSearchTerm","selectedItemId","setSelectedItemId","setSelectedItem","viewAll","setViewAll","modalSize","setModalSize","draggableBoundary","setDraggableBoundary","listCatalogItems","handleResizeStop","onSearch","searchInput","getIndexOfSelectedItem","onEnter","activeViewAllLink","selectPrevious","selectNext","onOutsideClick","modalBody","onDragStop","offsetWidth","bounds","onResizeStop","dragHandleClassName","enableResizing","bottomLeft","bottomRight","topLeft","topRight","getModalHeight","showNoResults","itemsLoaded","onListChange","spanRef","listItems","onSelectListItem","detailsContentRenderer","sortedActiveFilters","renderFilterGroup","filterGroupKeys","sortedFilterGroup","whiteSpace","renderFilterItem","itemsCount","setItemsCount","listHeight","selectedDataListItemId","onSelectDataListItem","isCompact","itemType","onDoubleClick","dataListCells","isIcon","paddingTop","wrapModifier","secondaryLabel","catalogLink","getSelector","getGuidedTour","FLAG_OPENSHIFT_GITOPS","getClusterInsightsStatus","cluster","metricsResponse","metricsError","operatorStatusResponse","operatorStatusError","operatorDisabled","issuesNumber","issueStr","getClusterInsightsComponentStatus","getIsKnativeResource","isKnativeResource","topologyPlugin","workloadKeys","getDataModel","getKnativeServingTopologyDataModel","isResourceDepicted","getKnativeEventingTopologyDataModel","getKnativeKameletsTopologyDataModel","getCSVPriorityStatus","subscriptionStatus","csvStatus","operatorHealth","getClusterServiceVersionsWithStatuses","grouppedOperators","defaultDecoratorsPlugin","quadrant","lowerRight","decorator","upperRight","lowerLeft","upperLeft","operatorsTopologyPlugin","getFactory","getCreateConnector","newQueryBrowserQuery","isEnabled","silenceFiringAlerts","ruleAlert","dev","admin","queryBrowser","queryBrowserPatchQueryHelper","notificationAlerts","silencesKey","isAlertFiring","QueryBrowserAddQuery","QueryBrowserDuplicateQuery","originQueryText","duplicate","QueryBrowserDeleteQuery","QueryBrowserDismissNamespaceAlert","QueryBrowserRunQueries","QueryBrowserSetAllExpanded","QueryBrowserSetMetrics","QueryBrowserSetPollInterval","isDisabledSeriesEmpty","QueryBrowserToggleIsEnabled","RedirectComponent","Memoized","NamespaceFromURL","C","namespacedRoutes","DefaultPageRedirect","firstVisit","resolvedUrl","setResolvedUrl","visited","setVisited","visitedLoaded","landingPageURL","StatusProjectsRedirect","OverviewProjectsRedirect","AlertManagerRedirect","CronJobRedirect","HorizontalPodRedirect","allPluginsProcessed","pluginPageRoutes","inactivePluginPageRoutes","contentRouter","DashboardsPage","APIExplorerPage","APIResourcePage","CommandLineToolsPage","InstantiateTemplatePage","ImportYamlPage","EditYAMLPage","CreateNetworkPolicy","RoutePage","CreatePVC","VolumeSnapshot","CreateReceiver","EditReceiver","AddGitHubPage","AddGitLabPage","AddGooglePage","AddHTPasswdPage","AddKeystonePage","AddLDAPPage","AddOpenIDIDPPage","AddBasicAuthPage","AddRequestHeaderPage","ClusterSettingsPage","StorageClassForm","PDBFormPage","DebugTerminalPage","GlobalNotifications","ImpersonateNotifier","kindTranslated","oAuthResourcePath","KubeAdminNotifier","isRoutePageExtensionActive","LazyDynamicRoutePage","LazyComponent","LazyRoutePage","InactiveRoutePage","usePluginRoutes","staticExtensions","dynamicExtensions","getRoutesForExtension","exact","activeAcc","inactiveAcc","TelemetryNotifier","setCurrentUserPreferenceTelemetryValue","userResponse","defaultHelpLinks","externalLink","MultiClusterToolbarGroup","FeedbackModalLocalized","reportBugLink","feedbackLocales","onShareFeedback","onOpenSupportCase","feedbackLocale","onJoinMailingList","feedbackImg","SystemStatusButton","statuspageData","MastheadToolbarContents","authEnabledFlag","consoleCLIDownloadFlag","quickstartFlag","CONSOLE_QUICKSTART","launchCopyLoginCommandModal","canAccessNS","isAppLauncherDropdownOpen","setIsAppLauncherDropdownOpen","isUserDropdownOpen","setIsUserDropdownOpen","isKebabDropdownOpen","setIsKebabDropdownOpen","isHelpDropdownOpen","setIsHelpDropdownOpen","statusPageData","setStatusPageData","showAboutModal","setshowAboutModal","isFeedbackModalOpen","setIsFeedbackModalOpen","userInactivityTimeout","getImportYAMLPath","onUserDropdownToggle","onUserDropdownSelect","onKebabDropdownToggle","onKebabDropdownSelect","onAboutModal","getAdditionalLinks","sectionSort","getLaunchActions","isTroubleshootingPanelEnabled","launcherItems","sections","isSection","sectionName","sortedSections","sectionItems","getSectionLauncherItems","getHelpActions","additionalHelpActions","helpActions","tourRef","helpLink","getAdditionalActions","externalProps","isExternal","renderApplicationItems","groupIndex","sectionAction","itemIndex","renderMenu","mobile","additionalUserActions","launchActions","userActions","userToggle","statuspageID","newStatusPageData","setLastConsoleActivityTimestamp","resetInactivityTimeout","logoutOpenShift","inactivityTimeout","onStorageChange","alertAccess","isFullHeight","isStatic","closeAboutModal","MastheadToolbar","clusterVersionFlag","consoleLinkFlag","paddingLeft","DynamicPlugins","sortedLoadedPlugins","AboutModalItems","kubernetesVersion","setKubernetesVersion","serviceLevelTitle","customIcon","AboutModal","customBranding","brandImageSrc","brandImageAlt","hasNoContentContainer","k8sVersion","filterTourBasedonPermissionAndFlag","stepFlags","access","primaryButton","secondaryButton","stepContent","primaryButtonCallback","secondaryButtonCallback","ClusterGroup","clusters","acmPerspectiveExtension","setSelection","onLocalClusterClick","onAllClustersClick","clusterMenu","menuToggle","useFeedbackLocal","reportBug","getSupport","bugReported","describeBug","describeBugUrgentCases","describeReportBug","directInfluence","enterFeedback","feedback","feedbackSent","helpUsImproveHCC","howIsConsoleExperience","joinMailingList","informDirectionDescription","informDirection","learnAboutResearchOpportunities","openSupportCase","problemProcessingRequest","redHatSupport","reportABug","responseSent","researchOpportunities","shareFeedback","shareYourFeedback","somethingWentWrong","submitFeedback","teamWillReviewBug","tellAboutExperience","thankYouForFeedback","thankYouForInterest","userResearchTeam","weNeverSharePersonalInformation","Navigation","onNavSelect","onPerspectiveSelected","PerspectiveDropdownItem","LazyIcon","isPerspectiveDropdownOpen","setPerspectiveDropdownOpen","togglePerspectiveOpen","acmLink","onPerspectiveSelect","perspectiveItems","perspectiveDropdownItems","validPinnedResources","setValidPinnedResources","isDragged","setIsDragged","validResources","orderedNavExtensions","topLevelNavExtensions","NavGroupWithDnd","onReorder","navResources","hasListItem","DraggableButton","RemoveButton","navItem","unPin","didDrop","startIndex","destIndex","reorder","getLabelForResourceRef","duplicates","previewRef","PluginNavItem","NavSection","navExtensions","getK8sModelForExtension","navExtensionIsActive","onExpand","expandedState","buttonProps","useNavExtensionsForSection","isExtensionForSection","getMastheadHeight","masthead","minimize","minimizeText","restoreText","minimized","CloudShellTerminal","namespaceLoadError","initData","setInitData","initError","setInitError","isAdminCheckLoading","workspacePhase","workspaceId","unrecoverableErrorFound","unmounted","defaultError","RUNNING","FAILED","STARTING","podname","shcommand","cmd","CloudShellExec","onActivate","wsOpen","setWsOpen","wsError","setWsError","wsReopening","setWsReopening","customResource","setCustomResource","onData","sessionId","cols","Height","Width","onCommand","usedClient","urlOpts","stdout","stdin","stderr","tty","wsOpts","websocket","currentTerminal","errMsg","onConnectionClosed","onDataReceived","stoppedByError","cr","stopReason","terminalOptions","cursorBlink","Terminal","terminalRef","term","fitAddon","loadAddon","resizeObserver","fit","dispose","write","loadAttachAddon","addOn","protectedNamespaceExists","namespaceExists","csTimeout","onReset","validationSchema","formikProps","setVisibleItems","TimeoutUnits","NamespaceSection","onDropdownChange","projectList","findWorkspace","isClusterAdmin","defaultNamespace","searching","setSearching","noNamespaceFound","setNoNamespaceFound","canListWorkspaces","loadingAccessReview","searchNamespaces","projects","projectName","workspaceList","TICK_INTERVAL","perspectiveParam","perspectiveIDs","getPerspectiveURLParam","Detector","detectors","detectedPerspective","defaultPerspective","detectionComplete","enablePerspective","setDetectors","resolveCount","resolvedDetectors","usePerspectiveDetection","FieldComponent","getUserPreferenceGroups","userPreferenceGroups","userPreferenceItems","initialUserPreferenceGroup","userPreferenceGroup","currUserPreferenceItem","userPreferenceGroupForCurrentItem","useLastPerspective","DetectLanguage","flagProvider","flagProviderResolved","nf","initConsolePlugins","registerFailedDynamicPlugin","isStandardPluginManifest","sharedScope","addModule","getModule","versionRange","eager","initSharedScope","initSharedPluginModules","EventItem","UnmetPluginDependenciesError","unmetDependencies","unsubListenerMap","cleanupListener","formatPluginNames","formatUnmetDependency","depName","requiredRange","resolvePluginDependencies","consolePluginAPIVersion","allowedPluginNames","semverOptions","includePrerelease","requiredPluginNames","unavailablePluginNames","promiseSettled","rejectPromise","unsubListener","loadedPlugins","failedPluginNames","fetchPluginManifest","manifestURL","validator","SchemaValidator","assertions","validDNSSubdomainName","validSemverString","validSemverRangeString","validatePluginManifestSchema","report","AdmissionWebhookWarningNotifications","toastContext","docURL","usePackageManifestCheck","operatorName","pmExists","setPMExists","UtilizationAxis","fixLabelOverlap","newSelected","mapCardsToGrid","cards","keyPrefix","ignoreCardSpan","mainCards","leftCards","rightCards","smallGrid","mainGridCards","leftGridCards","rightGridCards","CriticalIcon","WarningIcon","getSeverityIcon","StatusItem","documentationLink","actionExtensions","actionObj","HealthItemIcon","popupTitle","popupClassname","popupBodyContent","popupKeepOnOutsideClick","noIcon","hideOnOutsideClick","defaultStatusGroupIcons","WARN","getStatusGroupIcons","groupStatusIcons","titlePlural","TitleComponent","ExpandedComponent","titleMessage","Status","groupID","dynamicGroupExtensions","statusGroupIcons","mergedExtensions","NOT_MAPPED","groupIcon","StatusLink","statusIDs","statusItems","ResourceTitleComponent","additionalResources","mapper","showLink","Title","top3Groups","groupIDs","groupStatuses","getTop3Groups","titleLabel","titlePluralLabel","lastTimeInSeries","getMaxDate","MultilineUtilizationItem","dataUnits","humanizeValue","TopConsumerPopovers","originalData","dataUnitsValue","latestData","amount","getCurrentData","maxDate","translatedData","currData","mapTranslatedData","TopConsumerPopover","trimSecondsXMutator","setSeconds","setLimitReqState","requestedData","humanMax","humanAvailable","currentUtilization","percentage","LimitIcon","humanLimit","limitState","requestedState","latestLimit","latestRequested","limitPercentage","reqPercentage","currentHumanized","ActivityProgress","progress","DeleteModalComponent","fuzzyLink","EnhancedProvider","ContextProvider","useValueHook","App","contextProviderExtensions","isLargeLayout","prevLocation","setPrevLocation","prevParams","setPrevParams","setIsMastheadStacked","setIsNavOpen","isDrawerInline","setIsDrawerInline","previousDesktopState","previousMobileState","previousDrawerInlineState","desktop","drawerInline","oldLocation","newLocation","lightspeedButtonCapability","capabilities","capability","CONSOLE_CAPABILITY_LIGHTSPEEDBUTTON_IS_ENABLED","LIGHTSPEED_IS_AVAILABLE_TO_INSTALL","consoleCapabilityLightspeedButtonIsEnabled","lightspeedIsAvailableToInstall","titleTemplate","mainTabIndex","Event","sidebar","skipToContent","CaptureTelemetry","AppWithExtensions","reduxReducerExtensions","reducersResolved","AppRouter","standaloneRouteExtensions","debounceTime","setDebounceTime","titleOnLoad","setTitleOnLoad","telemetryTitle","fireUrlChangeEvent","nextPathname","nextSearch","PollConsoleUpdates","isToastOpen","setToastOpen","pluginsChanged","setPluginsChanged","pluginVersionsChanged","setPluginVersionsChanged","consoleChanged","setConsoleChanged","isFetchingPluginEndpoints","setIsFetchingPluginEndpoints","allPluginEndpointsReady","setAllPluginEndpointsReady","setUpdateData","updateError","setUpdateError","newPlugins","setNewPlugins","pluginManifestsData","setPluginManifestsData","pluginManifests","prevUpdateDataRef","prevPluginManifestsDataRef","prevUpdateData","prevPluginManifestsData","stateInitialized","pluginsAddedList","pluginsRemovedList","pluginsAdded","pluginsRemoved","pluginEndpointsReady","pluginManifestsVersionsChanged","previousManifest","consoleCommitChanged","consoleCommit","toastCallback","updateSwaggerInterval","onReady","lineno","colno","formattedMessage","onunhandledrejection","promiseRejectionEvent","loadTestFactor","serviceWorker","register","postMessage","topic","getRegistrations","registrations","reg","unregister","k8sResource","isActivity","getTimestamp","healthHandler","additionalResource","popupComponent","disallowedControlPlaneTopology","getNodeStatusGroups","getPodStatusGroups","getPVCStatusGroups","getOperatorsWithStatuses","operatorRowLoader","VolumeSnapshotPVCPage","ConsoleOperatorConfigDetailsPage","ImageManifestVulnPage","ImageManifestVulnDetailsPage","getBindableServicesTopologyDataModel","isServiceBindable","InsightsPopup","LSO_DEVICE_DISCOVERY","NodesDisksListPage","CreateLocalVolumeDiscovery","kvAlphaMaintenances","kvBetaMaintenances","maintenances","getBMNStatusGroups","getBMHStatusGroups","OPERATOR_LIFECYCLE_MANAGER","OperandDetailsPage","SubscriptionsPage","SubscriptionDetailsPage","ClusterServiceVersionsPage","PackageManifestsPage","ClusterServiceVersionDetailsPage","CreateSubscriptionYAML","OperatorHubPage","OperatorHubSubscribePage","OperatorHubDetailsPage","CatalogSourceDetailsPage","CreateCatalogSource","InstallPlanDetailsPage","InstallPlansPage","ServiceLocation","clusterIP","portObj","nodePort","loadBalancer","externalName","ServiceTableRow","ServiceAddress","ServiceIPsRow","ips","note","ServiceType","externalIPs","ServicePortMapping","targetPort","ServicesDetailsPage","ServicesPage","prometheusQueries","notificationAlertLabelSelectors","alertsLoadError","urlResults"],"mappings":"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AAO0xH,QAAU,IAA0B,oC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,wC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,uC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,uC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,wC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,oC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,uC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,uC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,sC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,0C,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,uC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,uC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,wC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,2C,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,sC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,wC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,sC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,uC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,sC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,mC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,wC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,yC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,wC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,8C,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,wC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,0C,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,0C,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,wC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,sC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,+C,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,sC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,uC,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,4C,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,0C,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,4C,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,8C,gBCA3C1xH,EAAO0xH,QAAU,IAA0B,qC,gBCA3C1xH,EAAO0xH,QAAU,IAA0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","file":"main-chunk-da4ab88a497f59e46004.min.js","sourcesContent":["export * from './line-buffer';\nexport * from './promise-component';\nexport * from './kebab';\nexport * from './selector';\nexport * from './selector-input';\nexport * from './label-list';\nexport * from './resource-icon';\nexport * from './resource-link';\nexport * from './resource-log';\nexport * from './timestamp';\nexport * from './horizontal-nav';\nexport * from './details-page';\nexport * from './inject';\nexport * from './disabled';\nexport * from './firehose';\nexport * from './dropdown';\nexport * from './status-box';\nexport * from './headings';\nexport * from './units';\nexport * from './toggle-play';\nexport * from './button-bar';\nexport * from './number-spinner';\nexport * from './cloud-provider';\nexport * from './documentation';\nexport * from './router';\nexport * from './router-hooks';\nexport * from './link';\nexport * from './alerts';\nexport * from './async';\nexport * from './download-button';\nexport * from './entitlements';\nexport * from './build-strategy';\nexport * from './copy-to-clipboard';\nexport * from './build-hooks';\nexport * from './webhooks';\nexport * from './scroll-to-top-on-mount';\nexport * from './container-table';\nexport * from './simple-tab-nav';\nexport * from './request-size-input';\nexport * from './k8s-watcher';\nexport * from './workload-pause';\nexport * from './list-dropdown';\nexport * from './list-input';\nexport * from './rbac';\nexport * from './poll-hook';\nexport * from './ref-width-hook';\nexport * from './safe-fetch-hook';\nexport * from './truncate-middle';\nexport * from './expand-collapse';\nexport * from './volume-type';\nexport * from './skeleton-catalog';\nexport * from './dom-utils';\nexport * from './hint-block';\nexport * from './owner-references';\nexport { default } from './operator-backed-owner-references';\nexport * from './field-level-help';\nexport * from './details-item';\nexport * from './types';\nexport * from './release-notes-link';\nexport * from './service-level';\n","export * from './job';\nexport * from './k8s';\nexport * from './pods';\nexport * from './resource';\nexport * from './get-resources';\nexport * from './k8s-models';\nexport * from './label-selector';\nexport * from './cluster-operator';\nexport * from './cluster-settings';\nexport * from './template';\nexport * from './swagger';\nexport * from './event';\nexport * from './types';\nexport * from './k8s-ref';\nexport {\n k8sGet,\n k8sCreate,\n k8sUpdate,\n k8sPatch,\n k8sKill,\n k8sList,\n getK8sResourcePath,\n resourceURL,\n} from '@console/dynamic-plugin-sdk/src/utils/k8s';\n","/* eslint-disable no-console */\n\nimport * as _ from 'lodash';\nimport {\n Extension,\n RemoteEntryModule,\n EncodedCodeRef,\n CodeRef,\n ResolvedCodeRefProperties,\n ExtensionProperties,\n UpdateExtensionProperties,\n} from '../types';\nimport { deepForOwn } from '../utils/object';\nimport { settleAllPromises } from '../utils/promise';\n\nconst codeRefSymbol = Symbol('CodeRef');\n\nexport const applyCodeRefSymbol = <T = any>(ref: CodeRef<T>) => {\n ref[codeRefSymbol] = true;\n return ref;\n};\n\nexport const isEncodedCodeRef = (obj): obj is EncodedCodeRef =>\n _.isPlainObject(obj) &&\n _.isEqual(Object.getOwnPropertyNames(obj), ['$codeRef']) &&\n typeof (obj as EncodedCodeRef).$codeRef === 'string';\n\nexport const isExecutableCodeRef = (obj): obj is CodeRef =>\n _.isFunction(obj) &&\n _.isEqual(Object.getOwnPropertySymbols(obj), [codeRefSymbol]) &&\n obj[codeRefSymbol] === true;\n\nconst codeRefErrorSymbol = Symbol('error');\nexport const isCodeRefError = (ref: CodeRef) => !!ref[codeRefErrorSymbol];\nexport const getCodeRefError = (ref: CodeRef) => ref[codeRefErrorSymbol];\nexport const setCodeRefError = (ref: CodeRef, e: any) => {\n ref[codeRefErrorSymbol] = e;\n return ref;\n};\n\n/**\n * Parse the `EncodedCodeRef` value into `[moduleName, exportName]` tuple.\n *\n * Returns an empty array if the value doesn't match the expected format.\n */\nexport const parseEncodedCodeRefValue = (value: string): [string, string] | [] => {\n const match = value.match(/^([^.]+)(?:\\.(.+)){0,1}$/);\n return match ? [match[1], match[2] || 'default'] : [];\n};\n\n/**\n * Returns the object referenced by the `EncodedCodeRef`.\n *\n * If an error occurs, calls `errorCallback` and returns `null`.\n *\n * _Does not throw errors by design._\n */\nexport const loadReferencedObject = async <TExport = any>(\n ref: EncodedCodeRef,\n entryModule: RemoteEntryModule,\n pluginID: string,\n errorCallback: VoidFunction,\n): Promise<TExport> => {\n const [moduleName, exportName] = parseEncodedCodeRefValue(ref.$codeRef);\n let requestedModule: {};\n\n if (!moduleName) {\n console.error(`Malformed code reference '${ref.$codeRef}' of plugin ${pluginID}`);\n errorCallback();\n return null;\n }\n\n try {\n const moduleFactory = await entryModule.get(moduleName);\n requestedModule = moduleFactory();\n } catch (error) {\n console.error(`Failed to load module '${moduleName}' of plugin ${pluginID}`, error);\n errorCallback();\n return null;\n }\n\n if (!requestedModule[exportName]) {\n console.error(`Missing module export '${moduleName}.${exportName}' of plugin ${pluginID}`);\n errorCallback();\n return null;\n }\n\n return requestedModule[exportName];\n};\n\n/**\n * Returns new `extensions` array, resolving `EncodedCodeRef` values into `CodeRef` functions.\n *\n * _Does not execute `CodeRef` functions to load the referenced objects._\n */\nexport const resolveEncodedCodeRefs = (\n extensions: Extension[],\n entryModule: RemoteEntryModule,\n pluginID: string,\n errorCallback: VoidFunction,\n): Extension[] =>\n _.cloneDeep(extensions).map((e) => {\n deepForOwn<EncodedCodeRef>(e.properties, isEncodedCodeRef, (ref, key, obj) => {\n const loader = applyCodeRefSymbol(async () =>\n loadReferencedObject(ref, entryModule, pluginID, errorCallback),\n );\n obj[key] = Object.defineProperty(loader, 'name', { value: `${pluginID}-${ref.$codeRef}` });\n });\n\n return e;\n });\n\n/**\n * Returns an extension with its `CodeRef` properties replaced with referenced objects.\n */\nexport const resolveExtension = async <\n E extends Extension<P>,\n P = ExtensionProperties<E>,\n R = UpdateExtensionProperties<E, ResolvedCodeRefProperties<P>, P>\n>(\n extension: E,\n): Promise<R> => {\n const valueResolutions: Promise<void>[] = [];\n\n deepForOwn<CodeRef>(extension.properties, isExecutableCodeRef, (ref, key, obj) => {\n if (isCodeRefError(ref)) {\n throw getCodeRefError(ref);\n }\n valueResolutions.push(\n ref()\n .then((resolvedValue) => {\n obj[key] = resolvedValue;\n\n if (_.isNil(resolvedValue)) {\n console.warn(`Code reference property '${key}' resolved to null or undefined`);\n }\n })\n .catch((e) => {\n setCodeRefError(ref, e ?? true);\n return e;\n }),\n );\n });\n\n await settleAllPromises(valueResolutions);\n\n return (extension as unknown) as R;\n};\n","import { K8sModel as K8sKind } from '@console/dynamic-plugin-sdk/src/api/common-types';\n\nexport const PrometheusModel: K8sKind = {\n kind: 'Prometheus',\n label: 'Prometheus',\n // t('public~Prometheus')\n labelKey: 'public~Prometheus',\n labelPlural: 'Prometheuses',\n // t('public~Prometheuses')\n labelPluralKey: 'public~Prometheuses',\n apiGroup: 'monitoring.coreos.com',\n apiVersion: 'v1',\n abbr: 'PI',\n namespaced: true,\n crd: true,\n plural: 'prometheuses',\n propagationPolicy: 'Foreground',\n};\n\nexport const ServiceMonitorModel: K8sKind = {\n kind: 'ServiceMonitor',\n label: 'ServiceMonitor',\n // t('public~ServiceMonitor')\n labelKey: 'public~ServiceMonitor',\n labelPlural: 'ServiceMonitors',\n // t('public~ServiceMonitors')\n labelPluralKey: 'public~ServiceMonitors',\n apiGroup: 'monitoring.coreos.com',\n apiVersion: 'v1',\n abbr: 'SM',\n namespaced: true,\n crd: true,\n plural: 'servicemonitors',\n propagationPolicy: 'Foreground',\n};\n\nexport const PodMonitorModel: K8sKind = {\n kind: 'PodMonitor',\n label: 'PodMonitor',\n // t('public~PodMonitor')\n labelKey: 'public~PodMonitor',\n labelPlural: 'PodMonitors',\n // t('public~PodMonitors')\n labelPluralKey: 'public~PodMonitors',\n apiGroup: 'monitoring.coreos.com',\n apiVersion: 'v1',\n abbr: 'PM',\n namespaced: true,\n crd: true,\n plural: 'podmonitors',\n propagationPolicy: 'Foreground',\n};\n\nexport const AlertmanagerModel: K8sKind = {\n kind: 'Alertmanager',\n label: 'Alertmanager',\n // t('public~Alertmanager')\n labelKey: 'public~Alertmanager',\n labelPlural: 'Alertmanagers',\n // t('public~Alertmanagers')\n labelPluralKey: 'public~Alertmanagers',\n apiGroup: 'monitoring.coreos.com',\n apiVersion: 'v1',\n abbr: 'AM',\n namespaced: true,\n crd: true,\n plural: 'alertmanagers',\n propagationPolicy: 'Foreground',\n};\n\nexport const ServiceModel: K8sKind = {\n apiVersion: 'v1',\n label: 'Service',\n // t('public~Service')\n labelKey: 'public~Service',\n plural: 'services',\n abbr: 'S',\n namespaced: true,\n kind: 'Service',\n id: 'service',\n labelPlural: 'Services',\n // t('public~Services')\n labelPluralKey: 'public~Services',\n};\n\nexport const PodModel: K8sKind = {\n apiVersion: 'v1',\n label: 'Pod',\n // t('public~Pod')\n labelKey: 'public~Pod',\n plural: 'pods',\n abbr: 'P',\n namespaced: true,\n kind: 'Pod',\n id: 'pod',\n labelPlural: 'Pods',\n // t('public~Pods')\n labelPluralKey: 'public~Pods',\n};\n\nexport const ContainerModel: K8sKind = {\n apiVersion: 'v1',\n label: 'Container',\n // t('public~Container')\n labelKey: 'public~Container',\n plural: 'containers',\n abbr: 'C',\n kind: 'Container',\n id: 'container',\n labelPlural: 'Containers',\n // t('public~Containers')\n labelPluralKey: 'public~Containers',\n};\n\nexport const DaemonSetModel: K8sKind = {\n label: 'DaemonSet',\n // t('public~DaemonSet')\n labelKey: 'public~DaemonSet',\n apiGroup: 'apps',\n plural: 'daemonsets',\n apiVersion: 'v1',\n abbr: 'DS',\n namespaced: true,\n propagationPolicy: 'Foreground',\n kind: 'DaemonSet',\n id: 'daemonset',\n labelPlural: 'DaemonSets',\n // t('public~DaemonSets')\n labelPluralKey: 'public~DaemonSets',\n};\n\nexport const ReplicationControllerModel: K8sKind = {\n apiVersion: 'v1',\n label: 'ReplicationController',\n // t('public~ReplicationController')\n labelKey: 'public~ReplicationController',\n plural: 'replicationcontrollers',\n abbr: 'RC',\n namespaced: true,\n propagationPolicy: 'Foreground',\n kind: 'ReplicationController',\n id: 'replicationcontroller',\n labelPlural: 'ReplicationControllers',\n // t('public~ReplicationControllers')\n labelPluralKey: 'public~ReplicationControllers',\n};\n\nexport const HorizontalPodAutoscalerModel: K8sKind = {\n label: 'HorizontalPodAutoscaler',\n // t('public~HorizontalPodAutoscaler')\n labelKey: 'public~HorizontalPodAutoscaler',\n plural: 'horizontalpodautoscalers',\n apiVersion: 'v2',\n apiGroup: 'autoscaling',\n abbr: 'HPA',\n namespaced: true,\n kind: 'HorizontalPodAutoscaler',\n id: 'horizontalpodautoscaler',\n labelPlural: 'HorizontalPodAutoscalers',\n // t('public~HorizontalPodAutoscalers')\n labelPluralKey: 'public~HorizontalPodAutoscalers',\n};\n\nexport const ServiceAccountModel: K8sKind = {\n apiVersion: 'v1',\n label: 'ServiceAccount',\n // t('public~ServiceAccount')\n labelKey: 'public~ServiceAccount',\n plural: 'serviceaccounts',\n abbr: 'SA',\n namespaced: true,\n kind: 'ServiceAccount',\n id: 'serviceaccount',\n labelPlural: 'ServiceAccounts',\n // t('public~ServiceAccounts')\n labelPluralKey: 'public~ServiceAccounts',\n};\n\nexport const ReplicaSetModel: K8sKind = {\n label: 'ReplicaSet',\n // t('public~ReplicaSet')\n labelKey: 'public~ReplicaSet',\n apiVersion: 'v1',\n apiGroup: 'apps',\n plural: 'replicasets',\n abbr: 'RS',\n namespaced: true,\n propagationPolicy: 'Foreground',\n kind: 'ReplicaSet',\n id: 'replicaset',\n labelPlural: 'ReplicaSets',\n // t('public~ReplicaSets')\n labelPluralKey: 'public~ReplicaSets',\n};\n\nexport const DeploymentModel: K8sKind = {\n label: 'Deployment',\n // t('public~Deployment')\n labelKey: 'public~Deployment',\n apiVersion: 'v1',\n apiGroup: 'apps',\n plural: 'deployments',\n abbr: 'D',\n namespaced: true,\n propagationPolicy: 'Foreground',\n kind: 'Deployment',\n id: 'deployment',\n labelPlural: 'Deployments',\n // t('public~Deployments')\n labelPluralKey: 'public~Deployments',\n};\n\nexport const DeploymentConfigModel: K8sKind = {\n label: 'DeploymentConfig',\n // t('public~DeploymentConfig')\n labelKey: 'public~DeploymentConfig',\n apiVersion: 'v1',\n apiGroup: 'apps.openshift.io',\n plural: 'deploymentconfigs',\n abbr: 'DC',\n namespaced: true,\n propagationPolicy: 'Foreground',\n kind: 'DeploymentConfig',\n id: 'deploymentconfig',\n labelPlural: 'DeploymentConfigs',\n // t('public~DeploymentConfigs')\n labelPluralKey: 'public~DeploymentConfigs',\n};\n\nexport const BuildConfigModel: K8sKind = {\n label: 'BuildConfig',\n // t('public~BuildConfig')\n labelKey: 'public~BuildConfig',\n apiVersion: 'v1',\n apiGroup: 'build.openshift.io',\n plural: 'buildconfigs',\n abbr: 'BC',\n namespaced: true,\n propagationPolicy: 'Foreground',\n kind: 'BuildConfig',\n id: 'buildconfig',\n labelPlural: 'BuildConfigs',\n // t('public~BuildConfigs')\n labelPluralKey: 'public~BuildConfigs',\n};\n\nexport const BuildModel: K8sKind = {\n label: 'Build',\n // t('public~Build')\n labelKey: 'public~Build',\n apiVersion: 'v1',\n apiGroup: 'build.openshift.io',\n plural: 'builds',\n abbr: 'B',\n namespaced: true,\n propagationPolicy: 'Foreground',\n kind: 'Build',\n id: 'build',\n labelPlural: 'Builds',\n // t('public~Builds')\n labelPluralKey: 'public~Builds',\n};\n\nexport const TemplateModel: K8sKind = {\n label: 'Template',\n // t('public~Template')\n labelKey: 'public~Template',\n apiVersion: 'v1',\n apiGroup: 'template.openshift.io',\n plural: 'templates',\n abbr: 'T',\n namespaced: true,\n propagationPolicy: 'Foreground',\n kind: 'Template',\n id: 'template',\n labelPlural: 'Templates',\n // t('public~Templates')\n labelPluralKey: 'public~Templates',\n};\n\nexport const TemplateInstanceModel: K8sKind = {\n label: 'Template Instance',\n apiVersion: 'v1',\n apiGroup: 'template.openshift.io',\n plural: 'templateinstances',\n abbr: 'TI',\n namespaced: true,\n kind: 'TemplateInstance',\n id: 'templateinstance',\n labelPlural: 'Template Instances',\n};\n\nexport const ImageStreamModel: K8sKind = {\n label: 'ImageStream',\n // t('public~ImageStream')\n labelKey: 'public~ImageStream',\n apiVersion: 'v1',\n apiGroup: 'image.openshift.io',\n plural: 'imagestreams',\n abbr: 'IS',\n namespaced: true,\n propagationPolicy: 'Foreground',\n kind: 'ImageStream',\n id: 'imagestream',\n labelPlural: 'ImageStreams',\n // t('public~ImageStreams')\n labelPluralKey: 'public~ImageStreams',\n};\n\nexport const ImageStreamTagModel: K8sKind = {\n label: 'ImageStreamTag',\n // t('public~ImageStreamTag')\n labelKey: 'public~ImageStreamTag',\n apiVersion: 'v1',\n apiGroup: 'image.openshift.io',\n plural: 'imagestreamtags',\n abbr: 'IST',\n namespaced: true,\n propagationPolicy: 'Foreground',\n kind: 'ImageStreamTag',\n id: 'imagestreamtag',\n labelPlural: 'ImageStreamTags',\n // t('public~ImageStreamTags')\n labelPluralKey: 'public~ImageStreamTags',\n};\n\nexport const ImageStreamImportsModel: K8sKind = {\n label: 'ImageStreamImport',\n // t('public~ImageStreamImport')\n labelKey: 'public~ImageStreamImport',\n apiVersion: 'v1',\n apiGroup: 'image.openshift.io',\n plural: 'imagestreamimports',\n abbr: 'ISI',\n namespaced: true,\n kind: 'ImageStreamImport',\n id: 'imagestreamimport',\n labelPlural: 'ImageStreamImports',\n // t('public~ImageStreamImports')\n labelPluralKey: 'ImageStreamImports',\n};\n\nexport const JobModel: K8sKind = {\n label: 'Job',\n // t('public~Job')\n labelKey: 'public~Job',\n apiVersion: 'v1',\n apiGroup: 'batch',\n plural: 'jobs',\n abbr: 'J',\n namespaced: true,\n propagationPolicy: 'Foreground',\n kind: 'Job',\n id: 'job',\n labelPlural: 'Jobs',\n // t('public~Jobs')\n labelPluralKey: 'public~Jobs',\n};\n\nexport const NodeModel: K8sKind = {\n apiVersion: 'v1',\n label: 'Node',\n // t('public~Node')\n labelKey: 'public~Node',\n plural: 'nodes',\n abbr: 'N',\n kind: 'Node',\n id: 'node',\n labelPlural: 'Nodes',\n // t('public~Nodes')\n labelPluralKey: 'public~Nodes',\n};\n\nexport const CertificateSigningRequestModel: K8sKind = {\n apiVersion: 'v1',\n apiGroup: 'certificates.k8s.io',\n label: 'CertificateSigningRequest',\n // t('public~CertificateSigningRequest')\n labelKey: 'public~CertificateSigningRequest',\n plural: 'certificatesigningrequests',\n abbr: 'CSR',\n kind: 'CertificateSigningRequest',\n id: 'certificateigningrequests',\n labelPlural: 'CertificateSigningRequests',\n // t('public~CertificateSigningRequests')\n labelPluralKey: 'public~CertificateSigningRequests',\n};\n\nexport const EventModel: K8sKind = {\n apiVersion: 'v1',\n label: 'Event',\n // t('public~Event')\n labelKey: 'public~Event',\n plural: 'events',\n abbr: 'E',\n namespaced: true,\n kind: 'Event',\n id: 'event',\n labelPlural: 'Events',\n // t('public~Events')\n labelPluralKey: 'public~Events',\n};\n\nexport const ComponentStatusModel: K8sKind = {\n apiVersion: 'v1',\n label: 'ComponentStatus',\n // t('public~ComponentStatus')\n labelKey: 'public~ComponentStatus',\n labelPlural: 'ComponentStatuses',\n // t('public~ComponentStatuses')\n labelPluralKey: 'public~ComponentStatuses',\n plural: 'componentstatuses',\n abbr: 'CS',\n kind: 'ComponentStatus',\n id: 'componentstatus',\n};\n\nexport const NamespaceModel: K8sKind = {\n apiVersion: 'v1',\n label: 'Namespace',\n // t('public~Namespace')\n labelKey: 'public~Namespace',\n plural: 'namespaces',\n abbr: 'NS',\n kind: 'Namespace',\n id: 'namespace',\n labelPlural: 'Namespaces',\n // t('public~Namespaces')\n labelPluralKey: 'public~Namespaces',\n};\n\nexport const ProjectModel: K8sKind = {\n apiVersion: 'v1',\n apiGroup: 'project.openshift.io',\n label: 'Project',\n // t('public~Project')\n labelKey: 'public~Project',\n plural: 'projects',\n abbr: 'PR',\n kind: 'Project',\n id: 'project',\n labelPlural: 'Projects',\n // t('public~Projects')\n labelPluralKey: 'public~Projects',\n};\n\nexport const ProjectRequestModel: K8sKind = {\n apiVersion: 'v1',\n apiGroup: 'project.openshift.io',\n label: 'ProjectRequest',\n // t('public~ProjectRequest')\n labelKey: 'public~ProjectRequest',\n plural: 'projectrequests',\n abbr: '',\n kind: 'ProjectRequest',\n id: 'projectrequest',\n labelPlural: 'ProjectRequests',\n // t('public~ProjectRequests')\n labelPluralKey: 'public~ProjectRequests',\n};\n\nexport const IngressModel: K8sKind = {\n label: 'Ingress',\n // t('public~Ingress')\n labelKey: 'public~Ingress',\n labelPlural: 'Ingresses',\n // t('public~Ingresses')\n labelPluralKey: 'public~Ingresses',\n apiGroup: 'networking.k8s.io',\n apiVersion: 'v1',\n plural: 'ingresses',\n abbr: 'I',\n namespaced: true,\n kind: 'Ingress',\n id: 'ingress',\n};\n\nexport const RouteModel: K8sKind = {\n label: 'Route',\n // t('public~Route')\n labelKey: 'public~Route',\n labelPlural: 'Routes',\n // t('public~Routes')\n labelPluralKey: 'public~Routes',\n apiGroup: 'route.openshift.io',\n apiVersion: 'v1',\n plural: 'routes',\n abbr: 'RT',\n namespaced: true,\n kind: 'Route',\n id: 'route',\n};\n\nexport const ConfigMapModel: K8sKind = {\n apiVersion: 'v1',\n label: 'ConfigMap',\n // t('public~ConfigMap')\n labelKey: 'public~ConfigMap',\n plural: 'configmaps',\n abbr: 'CM',\n namespaced: true,\n kind: 'ConfigMap',\n id: 'configmap',\n labelPlural: 'ConfigMaps',\n // t('public~ConfigMaps')\n labelPluralKey: 'public~ConfigMaps',\n};\n\nexport const SecretModel: K8sKind = {\n apiVersion: 'v1',\n label: 'Secret',\n // t('public~Secret')\n labelKey: 'public~Secret',\n plural: 'secrets',\n abbr: 'S',\n namespaced: true,\n kind: 'Secret',\n id: 'secret',\n labelPlural: 'Secrets',\n // t('public~Secrets')\n labelPluralKey: 'public~Secrets',\n};\n\nexport const ClusterRoleBindingModel: K8sKind = {\n label: 'ClusterRoleBinding',\n // t('public~ClusterRoleBinding')\n labelKey: 'public~ClusterRoleBinding',\n apiGroup: 'rbac.authorization.k8s.io',\n apiVersion: 'v1',\n plural: 'clusterrolebindings',\n abbr: 'CRB',\n kind: 'ClusterRoleBinding',\n id: 'clusterrolebinding',\n labelPlural: 'ClusterRoleBindings',\n // t('public~ClusterRoleBindings')\n labelPluralKey: 'public~ClusterRoleBindings',\n};\n\nexport const ClusterRoleModel: K8sKind = {\n label: 'ClusterRole',\n // t('public~ClusterRole')\n labelKey: 'public~ClusterRole',\n apiGroup: 'rbac.authorization.k8s.io',\n apiVersion: 'v1',\n plural: 'clusterroles',\n abbr: 'CR',\n kind: 'ClusterRole',\n id: 'clusterrole',\n labelPlural: 'ClusterRoles',\n // t('public~ClusterRoles')\n labelPluralKey: 'public~ClusterRoles',\n};\n\nexport const RoleBindingModel: K8sKind = {\n label: 'RoleBinding',\n // t('public~RoleBinding')\n labelKey: 'public~RoleBinding',\n apiGroup: 'rbac.authorization.k8s.io',\n apiVersion: 'v1',\n plural: 'rolebindings',\n abbr: 'RB',\n namespaced: true,\n kind: 'RoleBinding',\n id: 'rolebinding',\n labelPlural: 'RoleBindings',\n // t('public~RoleBindings')\n labelPluralKey: 'public~RoleBindings',\n};\n\nexport const RoleModel: K8sKind = {\n label: 'Role',\n // t('public~Role')\n labelKey: 'public~Role',\n apiGroup: 'rbac.authorization.k8s.io',\n apiVersion: 'v1',\n plural: 'roles',\n abbr: 'R',\n namespaced: true,\n kind: 'Role',\n id: 'role',\n labelPlural: 'Roles',\n // t('public~Roles')\n labelPluralKey: 'public~Roles',\n};\n\nexport const SelfSubjectAccessReviewModel: K8sKind = {\n label: 'SelfSubjectAccessReview',\n // t('public~SelfSubjectAccessReview')\n labelKey: 'public~SelfSubjectAccessReview',\n apiGroup: 'authorization.k8s.io',\n apiVersion: 'v1',\n plural: 'selfsubjectaccessreviews',\n abbr: 'SSAR',\n namespaced: true,\n kind: 'SelfSubjectAccessReview',\n id: 'selfsubjectaccessreview',\n labelPlural: 'SelfSubjectAccessReviews',\n // t('public~SelfSubjectAccessReviews')\n labelPluralKey: 'public~SelfSubjectAccessReviews',\n};\n\nexport const SelfSubjectReviewModel: K8sKind = {\n label: 'SelfSubjectReview',\n // t('public~SelfSubjectReview')\n labelKey: 'public~SelfSubjectReview',\n apiGroup: 'authorization.k8s.io',\n apiVersion: 'v1',\n plural: 'selfsubjectreviews',\n abbr: 'SSR',\n namespaced: true,\n kind: 'SelfSubjectReview',\n id: 'selfsubjectreview',\n labelPlural: 'SelfSubjectReviews',\n // t('public~SelfSubjectReviews')\n labelPluralKey: 'public~SelfSubjectReviews',\n};\n\nexport const ResourceAccessReviewsModel: K8sKind = {\n label: 'ResourceAccessReview',\n // t('public~ResourceAccessReview')\n labelKey: 'public~ResourceAccessReview',\n apiGroup: 'authorization.openshift.io',\n apiVersion: 'v1',\n plural: 'resourceaccessreviews',\n abbr: 'LRAR',\n namespaced: false,\n kind: 'ResourceAccessReview',\n id: 'resourceaccessreview',\n labelPlural: 'ResourceAccessReviews',\n // t('public~ResourceAccessReviews')\n labelPluralKey: 'public~ResourceAccessReviews',\n};\n\nexport const LocalResourceAccessReviewsModel: K8sKind = {\n label: 'LocalResourceAccessReview',\n // t('public~LocalResourceAccessReview')\n labelKey: 'public~LocalResourceAccessReview',\n apiGroup: 'authorization.openshift.io',\n apiVersion: 'v1',\n plural: 'localresourceaccessreviews',\n abbr: 'LRAR',\n namespaced: true,\n kind: 'LocalResourceAccessReview',\n id: 'localresourceaccessreview',\n labelPlural: 'LocalResourceAccessReviews',\n // t('public~LocalResourceAccessReviews')\n labelPluralKey: 'public~LocalResourceAccessReviews',\n};\n\nexport const PersistentVolumeModel: K8sKind = {\n label: 'PersistentVolume',\n // t('public~PersistentVolume')\n labelKey: 'public~PersistentVolume',\n apiVersion: 'v1',\n plural: 'persistentvolumes',\n abbr: 'PV',\n kind: 'PersistentVolume',\n id: 'persistentvolume',\n labelPlural: 'PersistentVolumes',\n // t('public~PersistentVolumes')\n labelPluralKey: 'public~PersistentVolumes',\n};\n\nexport const PersistentVolumeClaimModel: K8sKind = {\n label: 'PersistentVolumeClaim',\n // t('public~PersistentVolumeClaim')\n labelKey: 'public~PersistentVolumeClaim',\n apiVersion: 'v1',\n plural: 'persistentvolumeclaims',\n abbr: 'PVC',\n namespaced: true,\n kind: 'PersistentVolumeClaim',\n id: 'persistentvolumeclaim',\n labelPlural: 'PersistentVolumeClaims',\n // t('public~PersistentVolumeClaims')\n labelPluralKey: 'public~PersistentVolumeClaims',\n};\n\nexport const StatefulSetModel: K8sKind = {\n label: 'StatefulSet',\n // t('public~StatefulSet')\n labelKey: 'public~StatefulSet',\n apiGroup: 'apps',\n apiVersion: 'v1',\n plural: 'statefulsets',\n abbr: 'SS',\n namespaced: true,\n propagationPolicy: 'Foreground',\n kind: 'StatefulSet',\n id: 'statefulset',\n labelPlural: 'StatefulSets',\n // t('public~StatefulSets')\n labelPluralKey: 'public~StatefulSets',\n};\n\nexport const ResourceQuotaModel: K8sKind = {\n label: 'ResourceQuota',\n // t('public~ResourceQuota')\n labelKey: 'public~ResourceQuota',\n apiVersion: 'v1',\n plural: 'resourcequotas',\n abbr: 'RQ',\n namespaced: true,\n kind: 'ResourceQuota',\n id: 'resourcequota',\n labelPlural: 'ResourceQuotas',\n // t('public~ResourceQuotas')\n labelPluralKey: 'public~ResourceQuotas',\n};\n\nexport const ClusterResourceQuotaModel: K8sKind = {\n label: 'ClusterResourceQuota',\n // t('public~ClusterResourceQuota')\n labelKey: 'public~ClusterResourceQuota',\n apiGroup: 'quota.openshift.io',\n apiVersion: 'v1',\n plural: 'clusterresourcequotas',\n abbr: 'CRQ',\n namespaced: false,\n kind: 'ClusterResourceQuota',\n id: 'clusterresourcequota',\n labelPlural: 'ClusterResourceQuotas',\n // t('public~ClusterResourceQuotas')\n labelPluralKey: 'public~ClusterResourceQuotas',\n crd: true,\n};\n\nexport const AppliedClusterResourceQuotaModel: K8sKind = {\n label: 'AppliedClusterResourceQuota',\n // t('public~AppliedClusterResourceQuota')\n labelKey: 'public~AppliedClusterResourceQuota',\n apiGroup: 'quota.openshift.io',\n apiVersion: 'v1',\n plural: 'appliedclusterresourcequotas',\n abbr: 'ACRQ',\n namespaced: true,\n kind: 'AppliedClusterResourceQuota',\n id: 'appliedclusterresourcequota',\n labelPlural: 'AppliedClusterResourceQuotas',\n // t('public~AppliedClusterResourceQuotas')\n labelPluralKey: 'public~AppliedClusterResourceQuotas',\n crd: true,\n};\n\nexport const NetworkPolicyModel: K8sKind = {\n label: 'NetworkPolicy',\n // t('public~NetworkPolicy')\n labelKey: 'public~NetworkPolicy',\n labelPlural: 'NetworkPolicies',\n // t('public~NetworkPolicies')\n labelPluralKey: 'public~NetworkPolicies',\n apiVersion: 'v1',\n apiGroup: 'networking.k8s.io',\n plural: 'networkpolicies',\n abbr: 'NP',\n namespaced: true,\n kind: 'NetworkPolicy',\n id: 'networkpolicy',\n};\n\nexport const CustomResourceDefinitionModel: K8sKind = {\n label: 'CustomResourceDefinition',\n // t('public~CustomResourceDefinition')\n labelKey: 'public~CustomResourceDefinition',\n apiGroup: 'apiextensions.k8s.io',\n apiVersion: 'v1',\n abbr: 'CRD',\n namespaced: false,\n plural: 'customresourcedefinitions',\n kind: 'CustomResourceDefinition',\n id: 'customresourcedefinition',\n labelPlural: 'CustomResourceDefinitions',\n // t('public~CustomResourceDefinitions')\n labelPluralKey: 'public~CustomResourceDefinitions',\n};\n\nexport const CronJobModel: K8sKind = {\n label: 'CronJob',\n // t('public~CronJob')\n labelKey: 'public~CronJob',\n apiVersion: 'v1',\n apiGroup: 'batch',\n plural: 'cronjobs',\n abbr: 'CJ',\n namespaced: true,\n kind: 'CronJob',\n id: 'cronjob',\n labelPlural: 'CronJobs',\n // t('public~CronJobs')\n labelPluralKey: 'public~CronJobs',\n propagationPolicy: 'Foreground',\n};\n\nexport const StorageClassModel: K8sKind = {\n label: 'StorageClass',\n // t('public~StorageClass')\n labelKey: 'public~StorageClass',\n labelPlural: 'StorageClasses',\n // t('public~StorageClasses')\n labelPluralKey: 'public~StorageClasses',\n apiVersion: 'v1',\n apiGroup: 'storage.k8s.io',\n plural: 'storageclasses',\n abbr: 'SC',\n namespaced: false,\n kind: 'StorageClass',\n id: 'storageclass',\n};\n\nexport const LimitRangeModel: K8sKind = {\n label: 'LimitRange',\n // t('public~LimitRange')\n labelKey: 'public~LimitRange',\n apiVersion: 'v1',\n plural: 'limitranges',\n abbr: 'LR',\n namespaced: true,\n kind: 'LimitRange',\n id: 'limitrange',\n labelPlural: 'LimitRanges',\n // t('public~LimitRanges')\n labelPluralKey: 'public~LimitRanges',\n};\n\nexport const APIServiceModel: K8sKind = {\n label: 'APIService',\n // t('public~APIService')\n labelKey: 'public~APIService',\n labelPlural: 'APIServices',\n // t('public~APIServices')\n labelPluralKey: 'APIServices',\n apiVersion: 'v1',\n apiGroup: 'apiregistration.k8s.io',\n plural: 'apiservices',\n abbr: 'APIS',\n namespaced: false,\n kind: 'APIService',\n id: 'apiservice',\n crd: true,\n};\n\nexport const UserModel: K8sKind = {\n label: 'User',\n // t('public~User')\n labelKey: 'public~User',\n labelPlural: 'Users',\n // t('public~Users')\n labelPluralKey: 'public~Users',\n apiVersion: 'v1',\n apiGroup: 'user.openshift.io',\n plural: 'users',\n abbr: 'U',\n namespaced: false,\n kind: 'User',\n id: 'user',\n crd: true,\n};\n\nexport const GroupModel: K8sKind = {\n label: 'Group',\n // t('public~Group')\n labelKey: 'public~Group',\n labelPlural: 'Groups',\n // t('public~Groups')\n labelPluralKey: 'public~Groups',\n apiVersion: 'v1',\n apiGroup: 'user.openshift.io',\n plural: 'groups',\n abbr: 'G',\n namespaced: false,\n kind: 'Group',\n id: 'group',\n crd: true,\n};\n\n// Cluster API resources\n// https://github.com/openshift/cluster-api\nexport const MachineModel: K8sKind = {\n label: 'Machine',\n // t('public~Machine')\n labelKey: 'public~Machine',\n labelPlural: 'Machines',\n // t('public~Machines')\n labelPluralKey: 'public~Machines',\n apiVersion: 'v1beta1',\n apiGroup: 'machine.openshift.io',\n plural: 'machines',\n abbr: 'M',\n namespaced: true,\n kind: 'Machine',\n id: 'machine',\n crd: true,\n};\n\nexport const MachineSetModel: K8sKind = {\n label: 'MachineSet',\n // t('public~MachineSet')\n labelKey: 'public~MachineSet',\n labelPlural: 'MachineSets',\n // t('public~MachineSet')\n labelPluralKey: 'public~MachineSet',\n apiVersion: 'v1beta1',\n apiGroup: 'machine.openshift.io',\n plural: 'machinesets',\n abbr: 'MS',\n namespaced: true,\n kind: 'MachineSet',\n id: 'machineset',\n crd: true,\n};\n\nexport const MachineDeploymentModel: K8sKind = {\n label: 'MachineDeployment',\n // t('public~MachineDeployment')\n labelKey: 'public~MachineDeployment',\n labelPlural: 'MachineDeployments',\n // t('public~MachineDeployments')\n labelPluralKey: 'public~MachineDeployments',\n apiVersion: 'v1beta1',\n apiGroup: 'machine.openshift.io',\n plural: 'machinedeployments',\n abbr: 'MD',\n namespaced: true,\n kind: 'MachineDeployment',\n id: 'machinedeployment',\n crd: true,\n};\n\nexport const MachineConfigPoolModel: K8sKind = {\n label: 'MachineConfigPool',\n // t('public~MachineConfigPool')\n labelKey: 'public~MachineConfigPool',\n labelPlural: 'MachineConfigPools',\n // t('public~MachineConfigPools')\n labelPluralKey: 'public~MachineConfigPools',\n apiVersion: 'v1',\n apiGroup: 'machineconfiguration.openshift.io',\n plural: 'machineconfigpools',\n abbr: 'MCP',\n namespaced: false,\n kind: 'MachineConfigPool',\n id: 'machineconfigpool',\n crd: true,\n};\n\nexport const MachineConfigModel: K8sKind = {\n label: 'MachineConfig',\n // t('public~MachineConfig')\n labelKey: 'public~MachineConfig',\n labelPlural: 'MachineConfigs',\n // t('public~MachineConfigs')\n labelPluralKey: 'public~MachineConfigs',\n apiVersion: 'v1',\n apiGroup: 'machineconfiguration.openshift.io',\n plural: 'machineconfigs',\n abbr: 'MC',\n namespaced: false,\n kind: 'MachineConfig',\n id: 'machineconfigpool',\n crd: true,\n};\n\nexport const MachineAutoscalerModel: K8sKind = {\n label: 'MachineAutoscaler',\n // t('public~MachineAutoscaler')\n labelKey: 'public~MachineAutoscaler',\n labelPlural: 'MachineAutoscalers',\n // t('public~MachineAutoscalers')\n labelPluralKey: 'public~MachineAutoscalers',\n apiVersion: 'v1beta1',\n apiGroup: 'autoscaling.openshift.io',\n plural: 'machineautoscalers',\n abbr: 'MA',\n namespaced: true,\n kind: 'MachineAutoscaler',\n id: 'machineautoscaler',\n crd: true,\n};\n\nexport const MachineHealthCheckModel: K8sKind = {\n label: 'MachineHealthCheck',\n // t('public~MachineHealthCheck')\n labelKey: 'public~MachineHealthCheck',\n labelPlural: 'MachineHealthChecks',\n // t('public~MachineHealthChecks')\n labelPluralKey: 'public~MachineHealthChecks',\n apiVersion: 'v1beta1',\n apiGroup: 'machine.openshift.io',\n plural: 'machinehealthchecks',\n abbr: 'MHC',\n namespaced: true,\n kind: 'MachineHealthCheck',\n id: 'machinehealthcheck',\n crd: true,\n};\n\n// Openshift cluster resources\nexport const ClusterOperatorModel: K8sKind = {\n label: 'ClusterOperator',\n // t('public~ClusterOperator')\n labelKey: 'public~ClusterOperator',\n labelPlural: 'ClusterOperators',\n // t('public~ClusterOperators')\n labelPluralKey: 'public~ClusterOperators',\n apiVersion: 'v1',\n apiGroup: 'config.openshift.io',\n plural: 'clusteroperators',\n abbr: 'CO',\n namespaced: false,\n kind: 'ClusterOperator',\n id: 'clusteroperator',\n crd: true,\n};\n\nexport const ClusterVersionModel: K8sKind = {\n label: 'ClusterVersion',\n // t('public~ClusterVersion')\n labelKey: 'public~ClusterVersion',\n labelPlural: 'ClusterVersions',\n // t('public~ClusterVersions')\n labelPluralKey: 'public~ClusterVersions',\n apiVersion: 'v1',\n apiGroup: 'config.openshift.io',\n plural: 'clusterversions',\n abbr: 'CV',\n namespaced: false,\n kind: 'ClusterVersion',\n id: 'clusterversion',\n crd: true,\n};\n\nexport const CSIDriverModel: K8sKind = {\n label: 'CSIDriver',\n // t('public~CSIDriver')\n labelKey: 'public~CSIDriver',\n labelPlural: 'CSIDrivers',\n // t('public~CSIDrivers')\n labelPluralKey: 'public~CSIDrivers',\n apiVersion: 'v1',\n apiGroup: 'storage.k8s.io',\n plural: 'csidrivers',\n abbr: 'CSI',\n namespaced: false,\n kind: 'CSIDriver',\n id: 'csidriver',\n crd: true,\n};\n\nexport const ClusterAutoscalerModel: K8sKind = {\n label: 'ClusterAutoscaler',\n // t('public~ClusterAutoscaler')\n labelKey: 'public~ClusterAutoscaler',\n labelPlural: 'ClusterAutoscalers',\n // t('public~ClusterAutoscalers')\n labelPluralKey: 'public~ClusterAutoscalers',\n apiVersion: 'v1',\n apiGroup: 'autoscaling.openshift.io',\n plural: 'clusterautoscalers',\n abbr: 'CA',\n namespaced: false,\n kind: 'ClusterAutoscaler',\n id: 'clusterautoscaler',\n crd: true,\n};\n\n// OpenShift global configuration\nexport const OAuthModel: K8sKind = {\n label: 'OAuth',\n // t('public~OAuth')\n labelKey: 'public~OAuth',\n labelPlural: 'OAuths',\n // t('public~OAuths')\n labelPluralKey: 'public~OAuths',\n apiVersion: 'v1',\n apiGroup: 'config.openshift.io',\n plural: 'oauths',\n abbr: 'OA',\n namespaced: false,\n kind: 'OAuth',\n id: 'oauth',\n crd: true,\n};\n\nexport const InfrastructureModel: K8sKind = {\n label: 'Infrastructure',\n // t('public~Infrastructure')\n labelKey: 'public~Infrastructure',\n labelPlural: 'Infrastructures',\n // t('public~Infrastructures')\n labelPluralKey: 'public~Infrastructures',\n apiVersion: 'v1',\n apiGroup: 'config.openshift.io',\n plural: 'infrastructures',\n abbr: 'INF',\n namespaced: false,\n kind: 'Infrastructure',\n id: 'infrastructure',\n crd: true,\n};\n\nexport const NetworkOperatorConfigModel: K8sKind = {\n label: 'Network',\n labelPlural: 'Networks',\n apiVersion: 'v1',\n apiGroup: 'config.openshift.io',\n plural: 'networks',\n abbr: 'NO',\n namespaced: false,\n kind: 'Network',\n id: 'network',\n crd: true,\n};\n\nexport const ConsoleOperatorConfigModel: K8sKind = {\n label: 'Console',\n labelPlural: 'Consoles',\n apiVersion: 'v1',\n apiGroup: 'operator.openshift.io',\n plural: 'consoles',\n abbr: 'C',\n namespaced: false,\n kind: 'Console',\n id: 'console',\n crd: true,\n};\n\nexport const ConsoleLinkModel: K8sKind = {\n label: 'ConsoleLink',\n // t('public~ConsoleLink')\n labelKey: 'public~ConsoleLink',\n labelPlural: 'ConsoleLinks',\n // t('public~ConsoleLinks')\n labelPluralKey: 'public~ConsoleLinks',\n apiVersion: 'v1',\n apiGroup: 'console.openshift.io',\n plural: 'consolelinks',\n abbr: 'CL',\n namespaced: false,\n kind: 'ConsoleLink',\n id: 'consolelink',\n crd: true,\n};\n\nexport const ConsoleCLIDownloadModel: K8sKind = {\n label: 'ConsoleCLIDownload',\n // t('public~ConsoleCLIDownload')\n labelKey: 'public~ConsoleCLIDownload',\n labelPlural: 'ConsoleCLIDownloads',\n // t('public~ConsoleCLIDownloads')\n labelPluralKey: 'public~ConsoleCLIDownloads',\n apiVersion: 'v1',\n apiGroup: 'console.openshift.io',\n plural: 'consoleclidownloads',\n abbr: 'CCD',\n namespaced: false,\n kind: 'ConsoleCLIDownload',\n id: 'consoleclidownload',\n crd: true,\n};\n\nexport const ConsoleNotificationModel: K8sKind = {\n label: 'ConsoleNotification',\n // t('public~ConsoleNotification')\n labelKey: 'public~ConsoleNotification',\n labelPlural: 'ConsoleNotifications',\n // t('public~ConsoleNotifications')\n labelPluralKey: 'public~ConsoleNotifications',\n apiVersion: 'v1',\n apiGroup: 'console.openshift.io',\n plural: 'consolenotifications',\n abbr: 'CN',\n namespaced: false,\n kind: 'ConsoleNotification',\n id: 'consolenotification',\n crd: true,\n};\n\nexport const ConsoleExternalLogLinkModel: K8sKind = {\n label: 'ConsoleExternalLogLink',\n // t('public~ConsoleExternalLogLink')\n labelKey: 'public~ConsoleExternalLogLink',\n labelPlural: 'ConsoleExternalLogLinks',\n // t('public~ConsoleExternalLogLinks')\n labelPluralKey: 'public~ConsoleExternalLogLinks',\n apiVersion: 'v1',\n apiGroup: 'console.openshift.io',\n plural: 'consoleexternalloglinks',\n abbr: 'CELL',\n namespaced: false,\n kind: 'ConsoleExternalLogLink',\n id: 'consoleexternalloglink',\n crd: true,\n};\n\nexport const ConsoleYAMLSampleModel: K8sKind = {\n label: 'ConsoleYAMLSample',\n // t('public~ConsoleYAMLSample')\n labelKey: 'public~ConsoleYAMLSample',\n labelPlural: 'ConsoleYAMLSamples',\n // t('public~ConsoleYAMLSamples')\n labelPluralKey: 'public~ConsoleYAMLSamples',\n apiVersion: 'v1',\n apiGroup: 'console.openshift.io',\n plural: 'consoleyamlsamples',\n abbr: 'CYS',\n namespaced: false,\n kind: 'ConsoleYAMLSample',\n id: 'consoleyamlsample',\n crd: true,\n};\n\nexport const VolumeSnapshotModel: K8sKind = {\n label: 'VolumeSnapshot',\n // t('public~VolumeSnapshot')\n labelKey: 'public~VolumeSnapshot',\n apiVersion: 'v1',\n apiGroup: 'snapshot.storage.k8s.io',\n plural: 'volumesnapshots',\n abbr: 'VS',\n namespaced: true,\n kind: 'VolumeSnapshot',\n id: 'volumesnapshot',\n labelPlural: 'VolumeSnapshots',\n // t('public~VolumeSnapshots')\n labelPluralKey: 'public~VolumeSnapshots',\n crd: true,\n};\n\nexport const VolumeSnapshotClassModel: K8sKind = {\n label: 'VolumeSnapshotClass',\n // t('public~VolumeSnapshotClass')\n labelKey: 'public~VolumeSnapshotClass',\n apiVersion: 'v1',\n apiGroup: 'snapshot.storage.k8s.io',\n plural: 'volumesnapshotclasses',\n abbr: 'VSC',\n namespaced: false,\n kind: 'VolumeSnapshotClass',\n id: 'volumesnapshotclass',\n labelPlural: 'VolumeSnapshotClasses',\n // t('public~VolumeSnapshotClasses')\n labelPluralKey: 'public~VolumeSnapshotClasses',\n crd: true,\n};\n\nexport const VolumeSnapshotContentModel: K8sKind = {\n label: 'VolumeSnapshotContent',\n // t('public~VolumeSnapshotContent')\n labelKey: 'public~VolumeSnapshotContent',\n apiVersion: 'v1',\n apiGroup: 'snapshot.storage.k8s.io',\n plural: 'volumesnapshotcontents',\n abbr: 'VSC',\n namespaced: false,\n kind: 'VolumeSnapshotContent',\n id: 'volumesnapshotcontent',\n labelPlural: 'VolumeSnapshotContents',\n // t('public~VolumeSnapshotContents')\n labelPluralKey: 'public~VolumeSnapshotContents',\n crd: true,\n};\n\nexport const ConsolePluginModel: K8sKind = {\n label: 'ConsolePlugin',\n // t('public~ConsolePlugin')\n labelKey: 'public~ConsolePlugin',\n apiVersion: 'v1',\n apiGroup: 'console.openshift.io',\n plural: 'consoleplugins',\n abbr: 'CP',\n namespaced: false,\n kind: 'ConsolePlugin',\n id: 'consoleplugin',\n labelPlural: 'ConsolePlugins',\n // t('public~ConsolePlugins')\n labelPluralKey: 'public~ConsolePlugins',\n crd: true,\n};\n\nexport const CloudCredentialModel: K8sKind = {\n kind: 'CloudCredential',\n label: 'CloudCredential',\n labelPlural: 'CloudCredentials',\n apiGroup: 'operator.openshift.io',\n apiVersion: 'v1',\n abbr: 'CO',\n plural: 'cloudcredentials',\n};\n\nexport const AuthenticationModel: K8sKind = {\n kind: 'Authentication',\n label: 'Authentication',\n labelPlural: 'Authentications',\n apiGroup: 'config.openshift.io',\n apiVersion: 'v1',\n plural: 'authentications',\n abbr: 'AU',\n};\n\nexport const MultiNetworkPolicyModel: K8sKind = {\n abbr: 'MNP',\n apiGroup: 'k8s.cni.cncf.io',\n apiVersion: 'v1beta1',\n id: 'multinetworkpolicy',\n kind: 'MultiNetworkPolicy',\n label: 'multi-networkpolicy',\n // t('public~MultiNetworkPolicy')\n labelKey: 'public~MultiNetworkPolicy',\n labelPlural: 'MultiNetworkPolicies',\n // t('MultiNetworkPolicies')\n labelPluralKey: 'public~MultiNetworkPolicies',\n namespaced: true,\n plural: 'multi-networkpolicies',\n crd: true,\n};\n","/**\n * @file Entrypoint for the Console dynamic plugin SDK monorepo package.\n *\n * Not published to npmjs; all Console monorepo packages are marked as private.\n */\n\n// Plugin APIs and types\nexport * from './api/useResolvedExtensions';\nexport * from './api/common-types';\n\n// Extension types\nexport * from './extensions';\n\nexport * from './perspective';\n\n// App init context\nexport * from './app';\n","import '@console/internal/i18n.js';\n\nexport * from './components';\nexport * from './constants';\nexport * from './selectors';\nexport * from './types';\nexport * from './utils';\nexport * from './hooks';\nexport * from './sorts';\nexport * from './hoc';\n","export * from './pod';\nexport * from './resource';\nexport * from './common';\nexport * from './ui';\nexport * from './time';\nexport * from './duration';\n","export * from './details';\nexport * from './list-page';\nexport * from './modal';\nexport * from './table';\n","export * from './utils';\nexport * from './const';\nexport * from './SecretFormWrapper';\nexport * from './PullSecretForm';\nexport * from './PullSecretCredentialEntry';\nexport * from './CreateConfigSubform';\nexport * from './UploadConfigSubform';\nexport * from './WebHookSecretForm';\nexport * from './SourceSecretForm';\nexport * from './BasicAuthSubform';\nexport * from './SSHAuthSubform';\nexport * from './GenericSecretForm';\nexport * from './KeyValueEntryForm';\nexport * from './EditSecret';\nexport * from './CreateSecret';\nexport * from './DropableFileInput';\nexport * from './SecretSubForm';\n","import * as React from 'react';\nimport { InProgressIcon } from '@patternfly/react-icons/dist/esm/icons/in-progress-icon';\nimport { TFunction } from 'i18next';\nimport { HealthState } from '@console/dynamic-plugin-sdk/src/extensions/console-types';\nimport {\n GreenCheckCircleIcon,\n RedExclamationCircleIcon,\n YellowExclamationTriangleIcon,\n BlueSyncIcon,\n GrayUnknownIcon,\n BlueArrowCircleUpIcon,\n} from '../../status/icons';\n\nexport { HealthState };\n\nexport const healthStateMessage = (state: keyof typeof HealthState, t: TFunction): string => {\n switch (state) {\n case HealthState.OK:\n return '';\n case HealthState.UNKNOWN:\n return t('console-shared~Unknown');\n case HealthState.PROGRESS:\n return t('console-shared~Pending');\n case HealthState.UPDATING:\n return t('console-shared~Updating');\n case HealthState.WARNING:\n return t('console-shared~Degraded');\n case HealthState.ERROR:\n return t('console-shared~Degraded');\n case HealthState.LOADING:\n return t('console-shared~Loading');\n case HealthState.UPGRADABLE:\n return t('console-shared~Upgrade available');\n case HealthState.NOT_AVAILABLE:\n return t('console-shared~Not available');\n default:\n return t('console-shared~Unknown');\n }\n};\n\nexport const healthStateMapping: { [key in HealthState]: HealthStateMappingValues } = {\n [HealthState.OK]: {\n priority: 0,\n health: HealthState.OK,\n icon: <GreenCheckCircleIcon title=\"Healthy\" />,\n },\n [HealthState.UNKNOWN]: {\n priority: 1,\n health: HealthState.UNKNOWN,\n icon: <GrayUnknownIcon title=\"Unknown\" />,\n },\n [HealthState.PROGRESS]: {\n priority: 2,\n health: HealthState.PROGRESS,\n icon: <InProgressIcon title=\"In progress\" />,\n },\n [HealthState.UPDATING]: {\n priority: 3,\n health: HealthState.UPDATING,\n icon: <BlueSyncIcon title=\"Updating\" />,\n },\n [HealthState.UPGRADABLE]: {\n priority: 4,\n health: HealthState.UPGRADABLE,\n icon: <BlueArrowCircleUpIcon title=\"Upgrade available\" />,\n },\n [HealthState.WARNING]: {\n priority: 5,\n health: HealthState.WARNING,\n icon: <YellowExclamationTriangleIcon title=\"Warning\" />,\n },\n [HealthState.ERROR]: {\n priority: 6,\n health: HealthState.ERROR,\n icon: <RedExclamationCircleIcon title=\"Error\" />,\n },\n [HealthState.LOADING]: {\n priority: 7,\n health: HealthState.LOADING,\n icon: <div className=\"skeleton-health\" />,\n },\n [HealthState.NOT_AVAILABLE]: {\n priority: 8,\n health: HealthState.NOT_AVAILABLE,\n icon: <GrayUnknownIcon title=\"Not available\" />,\n },\n};\n\nexport type HealthStateMappingValues = {\n icon: React.ReactNode;\n priority: number;\n health: HealthState;\n};\n","import { Base64 } from 'js-base64';\nimport { action, ActionType as Action } from 'typesafe-actions';\nimport * as _ from 'lodash-es';\n\n// FIXME(alecmerdler): Do not `import store`\nimport store from '../redux';\nimport { OverviewItem } from '@console/shared';\nimport {\n ALL_NAMESPACES_KEY,\n LAST_NAMESPACE_NAME_LOCAL_STORAGE_KEY,\n} from '@console/shared/src/constants';\nimport { K8sResourceKind, PodKind, NodeKind } from '../module/k8s';\nimport { allModels } from '../module/k8s/k8s-models';\nimport { detectFeatures, clearSSARFlags } from './features';\nimport { OverviewSpecialGroup } from '../components/overview/constants';\nimport { setClusterID, setCreateProjectMessage } from './common';\nimport { subsClient } from '../graphql/client';\nimport {\n beginImpersonate,\n endImpersonate,\n getUser,\n getImpersonate,\n} from '@console/dynamic-plugin-sdk';\nimport { DeprecatedOperatorWarning } from '@console/operator-lifecycle-manager/src/types';\n\nexport enum ActionType {\n DismissOverviewDetails = 'dismissOverviewDetails',\n SelectOverviewDetailsTab = 'selectOverviewDetailsTab',\n SelectOverviewItem = 'selectOverviewItem',\n SetActiveApplication = 'setActiveApplication',\n SetActiveNamespace = 'setActiveNamespace',\n SetCreateProjectMessage = 'setCreateProjectMessage',\n SetCurrentLocation = 'setCurrentLocation',\n SetServiceLevel = 'setServiceLevel',\n NotificationDrawerToggleExpanded = 'notificationDrawerExpanded',\n SetClusterID = 'setClusterID',\n SortList = 'sortList',\n UpdateOverviewMetrics = 'updateOverviewMetrics',\n UpdateOverviewResources = 'updateOverviewResources',\n UpdateOverviewSelectedGroup = 'updateOverviewSelectedGroup',\n UpdateOverviewLabels = 'updateOverviewLabels',\n UpdateOverviewFilterValue = 'updateOverviewFilterValue',\n UpdateTimestamps = 'updateTimestamps',\n SetPodMetrics = 'setPodMetrics',\n SetNamespaceMetrics = 'setNamespaceMetrics',\n SetNodeMetrics = 'setNodeMetrics',\n SetPVCMetrics = 'setPVCMetrics',\n SetUtilizationDuration = 'SetUtilizationDuration',\n SetUtilizationDurationSelectedKey = 'SetUtilizationDurationSelectedKey',\n SetUtilizationDurationEndTime = 'SetUtilizationDurationEndTime',\n SetShowOperandsInAllNamespaces = 'setShowOperandsInAllNamespaces',\n SetDeprecatedPackage = 'setDeprecatedPackage',\n SetDeprecatedChannel = 'setDeprecatedChannel',\n SetDeprecatedVersion = 'setDeprecatedVersion',\n}\n\ntype MetricValuesByName = {\n [name: string]: number;\n};\n\nexport type NamespaceMetrics = {\n cpu: MetricValuesByName;\n memory: MetricValuesByName;\n};\n\ntype MetricValuesByNamespace = {\n [namespace: string]: MetricValuesByName;\n};\n\nexport type PodMetrics = {\n cpu: MetricValuesByNamespace;\n memory: MetricValuesByNamespace;\n};\n\nexport type NodeMetrics = {\n cpu: MetricValuesByName;\n totalCPU: MetricValuesByName;\n pods: MetricValuesByName;\n usedMemory: MetricValuesByName;\n totalMemory: MetricValuesByName;\n usedStorage: MetricValuesByName;\n totalStorage: MetricValuesByName;\n};\n\nexport type PVCMetrics = {\n usedCapacity: MetricValuesByName;\n};\n\n// URL routes that can be namespaced\nlet namespacedResources;\n\nexport const getNamespacedResources = () => {\n if (!namespacedResources) {\n namespacedResources = new Set();\n allModels().forEach((v, k) => {\n if (!v.namespaced) {\n return;\n }\n if (v.crd) {\n namespacedResources.add(k);\n }\n if (!v.crd || v.legacyPluralURL) {\n namespacedResources.add(v.plural);\n }\n });\n }\n return namespacedResources;\n};\n\nexport const getActiveNamespace = (): string => store.getState().UI.get('activeNamespace');\nexport const getActiveUserName = (): string => getUser(store.getState())?.username;\n\nexport const getNamespaceMetric = (ns: K8sResourceKind, metric: string): number => {\n const metrics = store.getState().UI.getIn(['metrics', 'namespace']);\n return _.get(metrics, [metric, ns.metadata.name], 0);\n};\n\nexport const getPodMetric = (pod: PodKind, metric: string): number => {\n const metrics = store.getState().UI.getIn(['metrics', 'pod']);\n return metrics?.[metric]?.[pod.metadata.namespace]?.[pod.metadata.name] ?? 0;\n};\n\nexport const getNodeMetric = (node: NodeKind, metric: string): number => {\n const metrics = store.getState().UI.getIn(['metrics', 'node']);\n return metrics?.[metric]?.[node.metadata.name] ?? 0;\n};\n\nexport const getPVCMetric = (pvc: K8sResourceKind, metric: string): number => {\n const metrics = store.getState().UI.getIn(['metrics', 'pvc']);\n return metrics?.[metric]?.[pvc.metadata.namespace]?.[pvc.metadata.name] ?? 0;\n};\n\nexport const formatNamespaceRoute = (\n activeNamespace,\n originalPath,\n location?,\n forceList?: boolean,\n) => {\n let path = originalPath.substr(window.SERVER_FLAGS.basePath.length);\n\n let parts = path.split('/').filter((p) => p);\n const prefix = parts.shift();\n\n let previousNS;\n if (parts[0] === 'all-namespaces') {\n parts.shift();\n previousNS = ALL_NAMESPACES_KEY;\n } else if (parts[0] === 'ns') {\n parts.shift();\n previousNS = parts.shift();\n }\n\n if (!previousNS) {\n return originalPath;\n }\n\n if (\n (previousNS !== activeNamespace &&\n (parts[1] !== 'new' || activeNamespace !== ALL_NAMESPACES_KEY)) ||\n (activeNamespace === ALL_NAMESPACES_KEY && parts[1] === 'new') ||\n forceList\n ) {\n // a given resource will not exist when we switch namespaces, so pop off the tail end\n parts = parts.slice(0, 1);\n }\n\n const namespacePrefix =\n activeNamespace === ALL_NAMESPACES_KEY ? 'all-namespaces' : `ns/${activeNamespace}`;\n\n path = `/${prefix}/${namespacePrefix}`;\n if (parts.length) {\n path += `/${parts.join('/')}`;\n }\n\n if (location) {\n path += `${location.search}${location.hash}`;\n }\n\n return path;\n};\n\nexport const setCurrentLocation = (location: string) =>\n action(ActionType.SetCurrentLocation, { location });\n\nexport const setServiceLevel = (\n serviceLevel: string,\n daysRemaining: number = null,\n clusterID: string = '',\n trialDateEnd: string = null,\n hasSecretAccess: boolean = false,\n) =>\n action(ActionType.SetServiceLevel, {\n serviceLevel,\n daysRemaining,\n clusterID,\n trialDateEnd,\n hasSecretAccess,\n });\n\nexport const setActiveApplication = (application: string) => {\n return action(ActionType.SetActiveApplication, { application });\n};\n\nexport const setActiveNamespace = (namespace: string = '') => {\n namespace = namespace.trim();\n // make it noop when new active namespace is the same\n // otherwise users will get page refresh and cry about\n // broken direct links and bookmarks\n if (namespace !== getActiveNamespace()) {\n // save last namespace in session storage (persisted only for current browser tab). Used to remember/restore if\n // \"All Projects\" was selected when returning to the list view (typically from details view) via breadcrumb or\n // sidebar navigation\n sessionStorage.setItem(LAST_NAMESPACE_NAME_LOCAL_STORAGE_KEY, namespace);\n }\n\n return action(ActionType.SetActiveNamespace, { namespace });\n};\n\nexport const startImpersonate = (kind: string, name: string) => async (dispatch, getState) => {\n let textEncoder;\n try {\n textEncoder = new TextEncoder();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.info('Browser lacks TextEncoder. Falling back to polyfill.', e);\n }\n\n if (!textEncoder) {\n textEncoder = await import('text-encoding').then((module) => new module.TextEncoder('utf-8'));\n }\n\n const imp = getImpersonate(getState());\n if ((imp?.name && imp.name !== name) || (imp?.kind && imp.kind !== kind)) {\n // eslint-disable-next-line no-console\n console.warn(`Impersonate race detected: ${name} vs ${imp.name} / ${kind} ${imp.kind}`);\n return;\n }\n\n /**\n * Subprotocols are comma-separated, so commas aren't allowed. Also \"=\"\n * and \"/\" aren't allowed, so base64 but replace illegal chars.\n */\n let encodedName = textEncoder.encode(name);\n encodedName = Base64.encode(String.fromCharCode.apply(String, encodedName));\n encodedName = encodedName.replace(/=/g, '_').replace(/\\//g, '-');\n\n let subprotocols;\n if (kind === 'User') {\n subprotocols = [`Impersonate-User.${encodedName}`];\n }\n if (kind === 'Group') {\n subprotocols = [`Impersonate-Group.${encodedName}`];\n }\n\n dispatch(beginImpersonate(kind, name, subprotocols));\n subsClient.close(false, true);\n dispatch(clearSSARFlags());\n dispatch(detectFeatures());\n};\nexport const stopImpersonate = () => (dispatch) => {\n dispatch(endImpersonate());\n subsClient.close(false, true);\n dispatch(clearSSARFlags());\n dispatch(detectFeatures());\n};\nexport const sortList = (listId: string, field: string, func: string, orderBy: string) => {\n // const url = new URL(window.location.href);\n // const sp = new URLSearchParams(window.location.search);\n // sp.set('orderBy', orderBy);\n // sp.set('sortBy', column);\n // history.replace(`${url.pathname}?${sp.toString()}${url.hash}`);\n\n return action(ActionType.SortList, { listId, field, func, orderBy });\n};\nexport const selectOverviewItem = (uid: string) => action(ActionType.SelectOverviewItem, { uid });\nexport const selectOverviewDetailsTab = (tab: string) =>\n action(ActionType.SelectOverviewDetailsTab, { tab });\nexport const updateOverviewMetrics = (metrics: any) =>\n action(ActionType.UpdateOverviewMetrics, { metrics });\nexport const updateOverviewResources = (resources: OverviewItem[]) =>\n action(ActionType.UpdateOverviewResources, { resources });\nexport const updateTimestamps = (lastTick: number) =>\n action(ActionType.UpdateTimestamps, { lastTick });\nexport const dismissOverviewDetails = () => action(ActionType.DismissOverviewDetails);\nexport const updateOverviewSelectedGroup = (group: OverviewSpecialGroup | string) =>\n action(ActionType.UpdateOverviewSelectedGroup, { group });\nexport const updateOverviewLabels = (labels: string[]) =>\n action(ActionType.UpdateOverviewLabels, { labels });\nexport const updateOverviewFilterValue = (value: string) =>\n action(ActionType.UpdateOverviewFilterValue, { value });\nexport const notificationDrawerToggleExpanded = () =>\n action(ActionType.NotificationDrawerToggleExpanded);\nexport const setPodMetrics = (podMetrics: PodMetrics) =>\n action(ActionType.SetPodMetrics, { podMetrics });\nexport const setNamespaceMetrics = (namespaceMetrics: NamespaceMetrics) =>\n action(ActionType.SetNamespaceMetrics, { namespaceMetrics });\nexport const setNodeMetrics = (nodeMetrics: NodeMetrics) =>\n action(ActionType.SetNodeMetrics, { nodeMetrics });\nexport const setPVCMetrics = (pvcMetrics: PVCMetrics) =>\n action(ActionType.SetPVCMetrics, { pvcMetrics });\nexport const setUtilizationDuration = (duration) =>\n action(ActionType.SetUtilizationDuration, { duration });\nexport const setUtilizationDurationSelectedKey = (key) =>\n action(ActionType.SetUtilizationDurationSelectedKey, { key });\nexport const setUtilizationDurationEndTime = (endTime) =>\n action(ActionType.SetUtilizationDurationEndTime, { endTime });\n\nexport const setShowOperandsInAllNamespaces = (value: boolean) => {\n return action(ActionType.SetShowOperandsInAllNamespaces, { value });\n};\nexport const setDeprecatedPackage = (value: DeprecatedOperatorWarning) => {\n return action(ActionType.SetDeprecatedPackage, { value });\n};\nexport const setDeprecatedChannel = (value: DeprecatedOperatorWarning) => {\n return action(ActionType.SetDeprecatedChannel, { value });\n};\nexport const setDeprecatedVersion = (value: DeprecatedOperatorWarning) => {\n return action(ActionType.SetDeprecatedVersion, { value });\n};\n\n// TODO(alecmerdler): Implement all actions using `typesafe-actions` and add them to this export\nconst uiActions = {\n setCurrentLocation,\n setShowOperandsInAllNamespaces,\n setActiveApplication,\n setActiveNamespace,\n sortList,\n setCreateProjectMessage,\n setClusterID,\n selectOverviewItem,\n selectOverviewDetailsTab,\n setServiceLevel,\n updateOverviewMetrics,\n updateOverviewResources,\n updateTimestamps,\n dismissOverviewDetails,\n updateOverviewSelectedGroup,\n updateOverviewLabels,\n updateOverviewFilterValue,\n setPodMetrics,\n setNamespaceMetrics,\n setNodeMetrics,\n setPVCMetrics,\n notificationDrawerToggleExpanded,\n setUtilizationDuration,\n setUtilizationDurationSelectedKey,\n setUtilizationDurationEndTime,\n setDeprecatedPackage,\n setDeprecatedChannel,\n setDeprecatedVersion,\n};\n\nexport type UIAction = Action<typeof uiActions>;\n","import fuzzy from 'fuzzysearch';\nimport * as _ from 'lodash-es';\nimport { murmur3 } from 'murmurhash-js';\nimport {\n Alert,\n AlertSeverity,\n AlertStates,\n PrometheusLabels,\n PrometheusRule,\n Rule,\n Silence,\n SilenceStates,\n PrometheusRulesResponse,\n PerspectiveType,\n} from '@console/dynamic-plugin-sdk';\n\nimport { AlertSource, MonitoringResource, Target } from './types';\n\nexport const PROMETHEUS_BASE_PATH = window.SERVER_FLAGS.prometheusBaseURL;\n\nexport const AlertResource: MonitoringResource = {\n kind: 'Alert',\n label: 'Alert',\n plural: '/monitoring/alerts',\n abbr: 'AL',\n};\n\nexport const RuleResource: MonitoringResource = {\n kind: 'AlertRule',\n label: 'Alerting Rule',\n plural: '/monitoring/alertrules',\n abbr: 'AR',\n};\n\nexport const SilenceResource: MonitoringResource = {\n kind: 'Silence',\n label: 'Silence',\n plural: '/monitoring/silences',\n abbr: 'SL',\n};\n\nexport const fuzzyCaseInsensitive = (a: string, b: string): boolean =>\n fuzzy(_.toLower(a), _.toLower(b));\n\nexport const labelsToParams = (labels: PrometheusLabels) =>\n _.map(labels, (v, k) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join('&');\n\nexport const alertURL = (alert: Alert, ruleID: string) =>\n `${AlertResource.plural}/${ruleID}?${labelsToParams(alert.labels)}`;\n\nexport const getAlertsAndRules = (\n data: PrometheusRulesResponse['data'],\n perspective: PerspectiveType = 'admin',\n): { alerts: Alert[]; rules: Rule[] } => {\n // Flatten the rules data to make it easier to work with, discard non-alerting rules since those\n // are the only ones we will be using and add a unique ID to each rule.\n const groups = _.get(data, 'groups') as PrometheusRulesResponse['data']['groups'];\n const rules = _.flatMap(groups, (g) => {\n const addID = (r: PrometheusRule): Rule => {\n const key = [\n g.file,\n g.name,\n r.name,\n r.duration,\n r.query,\n ..._.map(r.labels, (k, v) => `${k}=${v}`),\n ].join(',');\n return { ...r, id: String(murmur3(key, 'monitoring-salt')) };\n };\n\n return _.filter(g.rules, { type: 'alerting' }).map(addID);\n });\n\n // The console codebase and developer perspective actions don't expect the external labels to be\n // included on the alerts\n if (perspective !== 'dev') {\n // Add external labels to all `rules[].alerts[].labels`\n rules.forEach((rule) => {\n rule.alerts.forEach((alert) => (alert.labels = { ...rule.labels, ...alert.labels }));\n });\n }\n\n // Add `rule` object to each alert\n const alerts = _.flatMap(rules, (rule) => rule.alerts.map((a) => ({ rule, ...a })));\n\n return { alerts, rules };\n};\n\nexport const alertState = (a: Alert): AlertStates => a?.state;\n\nexport const silenceState = (s: Silence): SilenceStates => s?.status?.state;\n\nexport const silenceMatcherEqualitySymbol = (isEqual: boolean, isRegex: boolean): string => {\n if (isRegex) {\n return isEqual ? '=~' : '!~';\n }\n return isEqual ? '=' : '!=';\n};\n\nexport const alertDescription = (alert: Alert | Rule): string =>\n alert.annotations?.description || alert.annotations?.message || alert.labels?.alertname;\n\n// Determine if an Alert is silenced by a Silence (if all of the Silence's matchers match one of the\n// Alert's labels)\nexport const isSilenced = (alert: Alert, silence: Silence): boolean =>\n [AlertStates.Firing, AlertStates.Silenced].includes(alert.state) &&\n _.every(silence.matchers, (m) => {\n const alertValue = _.get(alert.labels, m.name, '');\n const isMatch = m.isRegex\n ? new RegExp(`^${m.value}$`).test(alertValue)\n : alertValue === m.value;\n return m.isEqual === false && alertValue ? !isMatch : isMatch;\n });\n\ntype ListOrder = (number | string)[];\n\n// Severity sort order is \"critical\" > \"warning\" > (anything else in A-Z order) > \"none\"\nexport const alertSeverityOrder = (alert: Alert | Rule): ListOrder => {\n const { severity } = alert.labels;\n const order: number =\n {\n [AlertSeverity.Critical]: 1,\n [AlertSeverity.Warning]: 2,\n [AlertSeverity.None]: 4,\n }[severity] ?? 3;\n return [order, severity];\n};\n\nexport const alertingRuleStateOrder = (rule: Rule): ListOrder => {\n const counts = _.countBy(rule.alerts, 'state');\n return [AlertStates.Firing, AlertStates.Pending, AlertStates.Silenced].map(\n (state) => Number.MAX_SAFE_INTEGER - (counts[state] ?? 0),\n );\n};\n\nexport const targetSource = (target: Target): AlertSource =>\n target.labels?.prometheus === 'openshift-monitoring/k8s'\n ? AlertSource.Platform\n : AlertSource.User;\n","import { action, ActionType as Action } from 'typesafe-actions';\n\nimport { Rule } from '@console/dynamic-plugin-sdk';\n\nexport enum ActionType {\n AlertingSetData = 'alertingSetData',\n AlertingSetRules = 'alertingSetRules',\n DashboardsPatchAllVariables = 'dashboardsPatchAllVariables',\n DashboardsPatchVariable = 'dashboardsPatchVariable',\n DashboardsClearVariables = 'dashboardsClearVariables',\n DashboardsSetEndTime = 'dashboardsSetEndTime',\n DashboardsSetPollInterval = 'dashboardsSetPollInterval',\n DashboardsSetTimespan = 'dashboardsSetTimespan',\n DashboardsVariableOptionsLoaded = 'dashboardsVariableOptionsLoaded',\n QueryBrowserAddQuery = 'queryBrowserAddQuery',\n QueryBrowserDuplicateQuery = 'queryBrowserDuplicateQuery',\n QueryBrowserDeleteAllQueries = 'queryBrowserDeleteAllQueries',\n QueryBrowserDeleteAllSeries = 'queryBrowserDeleteAllSeries',\n QueryBrowserDeleteQuery = 'queryBrowserDeleteQuery',\n QueryBrowserDismissNamespaceAlert = 'queryBrowserDismissNamespaceAlert',\n QueryBrowserPatchQuery = 'queryBrowserPatchQuery',\n QueryBrowserRunQueries = 'queryBrowserRunQueries',\n QueryBrowserSetAllExpanded = 'queryBrowserSetAllExpanded',\n QueryBrowserSetMetrics = 'queryBrowserSetMetrics',\n QueryBrowserSetPollInterval = 'queryBrowserSetPollInterval',\n QueryBrowserSetTimespan = 'queryBrowserSetTimespan',\n QueryBrowserToggleIsEnabled = 'queryBrowserToggleIsEnabled',\n QueryBrowserToggleSeries = 'queryBrowserToggleSeries',\n QueryBrowserToggleAllSeries = 'queryBrowserToggleAllSeries',\n SetAlertCount = 'SetAlertCount',\n ToggleGraphs = 'toggleGraphs',\n}\n\nexport const dashboardsPatchVariable = (key: string, patch: any, perspective: string) =>\n action(ActionType.DashboardsPatchVariable, { key, patch, perspective });\n\nexport const dashboardsPatchAllVariables = (variables: any, perspective: string) =>\n action(ActionType.DashboardsPatchAllVariables, { variables, perspective });\n\nexport const DashboardsClearVariables = (perspective: string) =>\n action(ActionType.DashboardsClearVariables, { perspective });\n\nexport const dashboardsSetEndTime = (endTime: number, perspective: string) =>\n action(ActionType.DashboardsSetEndTime, { endTime, perspective });\n\nexport const dashboardsSetPollInterval = (pollInterval: number, perspective: string) =>\n action(ActionType.DashboardsSetPollInterval, { pollInterval, perspective });\n\nexport const dashboardsSetTimespan = (timespan: number, perspective: string) =>\n action(ActionType.DashboardsSetTimespan, { timespan, perspective });\n\nexport const dashboardsVariableOptionsLoaded = (\n key: string,\n newOptions: string[],\n perspective: string,\n) => action(ActionType.DashboardsVariableOptionsLoaded, { key, newOptions, perspective });\n\nexport const alertingLoading = (\n key: 'alerts' | 'silences' | 'notificationAlerts' | 'devSilences',\n perspective = 'admin',\n) =>\n action(ActionType.AlertingSetData, {\n key,\n data: { loaded: false, loadError: null, data: null, perspective },\n });\n\nexport const alertingLoaded = (\n key: 'alerts' | 'silences' | 'notificationAlerts' | 'devAlerts' | 'devSilences',\n alerts: any,\n perspective = 'admin',\n) =>\n action(ActionType.AlertingSetData, {\n key,\n data: { loaded: true, loadError: null, data: alerts, perspective },\n });\n\nexport const alertingErrored = (\n key: 'alerts' | 'silences' | 'notificationAlerts' | 'devAlerts' | 'devSilences',\n loadError: Error,\n perspective = 'admin',\n) =>\n action(ActionType.AlertingSetData, {\n key,\n data: { loaded: true, loadError, data: null, perspective },\n });\n\nexport const alertingSetRules = (key: 'rules' | 'devRules', rules: Rule[], perspective = 'admin') =>\n action(ActionType.AlertingSetRules, { key, data: rules, perspective });\n\nexport const toggleGraphs = () => action(ActionType.ToggleGraphs);\n\nexport const queryBrowserAddQuery = () => action(ActionType.QueryBrowserAddQuery);\n\nexport const queryBrowserDuplicateQuery = (index: number) =>\n action(ActionType.QueryBrowserDuplicateQuery, { index });\n\nexport const queryBrowserDeleteAllQueries = () => action(ActionType.QueryBrowserDeleteAllQueries);\n\nexport const queryBrowserDeleteAllSeries = () => action(ActionType.QueryBrowserDeleteAllSeries);\n\nexport const queryBrowserDismissNamespaceAlert = () =>\n action(ActionType.QueryBrowserDismissNamespaceAlert);\n\nexport const queryBrowserDeleteQuery = (index: number) =>\n action(ActionType.QueryBrowserDeleteQuery, { index });\n\nexport const queryBrowserPatchQuery = (index: number, patch: { [key: string]: unknown }) =>\n action(ActionType.QueryBrowserPatchQuery, { index, patch });\n\nexport const queryBrowserRunQueries = () => action(ActionType.QueryBrowserRunQueries);\n\nexport const queryBrowserSetAllExpanded = (isExpanded: boolean) =>\n action(ActionType.QueryBrowserSetAllExpanded, { isExpanded });\n\nexport const queryBrowserSetMetrics = (metrics: string[]) =>\n action(ActionType.QueryBrowserSetMetrics, { metrics });\n\nexport const queryBrowserSetPollInterval = (pollInterval: number) =>\n action(ActionType.QueryBrowserSetPollInterval, { pollInterval });\n\nexport const queryBrowserSetTimespan = (timespan: number) =>\n action(ActionType.QueryBrowserSetTimespan, { timespan });\n\nexport const queryBrowserToggleAllSeries = (index: number) =>\n action(ActionType.QueryBrowserToggleAllSeries, { index });\n\nexport const queryBrowserToggleIsEnabled = (index: number) =>\n action(ActionType.QueryBrowserToggleIsEnabled, { index });\n\nexport const queryBrowserToggleSeries = (index: number, labels: { [key: string]: unknown }) =>\n action(ActionType.QueryBrowserToggleSeries, { index, labels });\n\nexport const setAlertCount = (alertCount) => action(ActionType.SetAlertCount, { alertCount });\n\nconst actions = {\n alertingErrored,\n alertingLoaded,\n alertingLoading,\n alertingSetRules,\n dashboardsPatchAllVariables,\n dashboardsPatchVariable,\n DashboardsClearVariables,\n dashboardsSetEndTime,\n dashboardsSetPollInterval,\n dashboardsSetTimespan,\n dashboardsVariableOptionsLoaded,\n queryBrowserAddQuery,\n queryBrowserDuplicateQuery,\n queryBrowserDeleteAllQueries,\n queryBrowserDeleteAllSeries,\n queryBrowserDeleteQuery,\n queryBrowserDismissNamespaceAlert,\n queryBrowserPatchQuery,\n queryBrowserRunQueries,\n queryBrowserSetAllExpanded,\n queryBrowserSetMetrics,\n queryBrowserSetPollInterval,\n queryBrowserSetTimespan,\n queryBrowserToggleAllSeries,\n queryBrowserToggleIsEnabled,\n queryBrowserToggleSeries,\n setAlertCount,\n toggleGraphs,\n};\n\nexport type ObserveAction = Action<typeof actions>;\n","export * from './useCanClusterUpgrade';\nexport * from './formik-validation-fix';\nexport * from './deep-compare-memoize';\nexport * from './document-listener';\nexport * from './fullscreen';\nexport * from './scroll';\nexport * from './useScrollShadows';\nexport * from './plugins-overview-tab-section';\nexport * from './debounce';\nexport * from './select-list';\nexport * from './useBuildConfigsWatcher';\nexport * from './useJobsForCronJobWatcher';\nexport * from './usePodsWatcher';\nexport * from './useReplicationControllersWatcher';\nexport * from './useRoutesWatcher';\nexport * from './useServicesWatcher';\nexport * from './useQueryParams';\nexport * from './version';\nexport * from './csv-watch-hook';\nexport * from './useTabbedTableBreadcrumb';\nexport * from './post-form-submit-action';\nexport * from './flag';\nexport * from './useUserSettings';\nexport * from './useUserSettingsCompatibility';\nexport * from './hpa-hooks';\nexport * from './usePinnedResources';\nexport * from './perspective-utils';\nexport * from './useActiveNamespace';\nexport * from './useIsMobile';\nexport * from './useResizeObserver';\nexport * from './useBoundingClientRect';\nexport * from './useScrollContainer';\nexport * from './useEventListener';\nexport * from './useTelemetry';\nexport * from './useForceRender';\nexport * from './useUtilizationDuration';\nexport * from './usePrometheusGate';\nexport * from './useCopyCodeModal';\nexport * from './useCopyLoginCommands';\nexport * from './useQuickStartContext';\n","// TODO(vojtech): this index file can cause a lot of cycles, it's best to remove it\nexport * from './typings';\nexport * from './store';\n\n// React integrations\nexport * from './api/useExtensions';\nexport * from './api/withExtensions';\nexport * from './api/useDynamicPluginInfo';\n","import { chart_color_cyan_400 as knativeServingColor } from '@patternfly/react-tokens/dist/js/chart_color_cyan_400';\nimport { chart_color_red_300 as knativeEventingColor } from '@patternfly/react-tokens/dist/js/chart_color_red_300';\nimport { K8sKind } from '@console/internal/module/k8s';\nimport {\n KNATIVE_SERVING_APIGROUP,\n KNATIVE_EVENT_MESSAGE_APIGROUP,\n KNATIVE_EVENTING_APIGROUP,\n CAMEL_APIGROUP,\n STRIMZI_KAFKA_APIGROUP,\n} from './const';\n\nconst apiVersion = 'v1';\n\nexport const ConfigurationModel: K8sKind = {\n apiGroup: KNATIVE_SERVING_APIGROUP,\n apiVersion,\n kind: 'Configuration',\n plural: 'configurations',\n label: 'Configuration',\n // t('knative-plugin~Configuration')\n labelKey: 'knative-plugin~Configuration',\n labelPlural: 'Configurations',\n // t('knative-plugin~Configurations')\n labelPluralKey: 'knative-plugin~Configurations',\n id: 'configuration',\n abbr: 'CFG',\n namespaced: true,\n crd: true,\n color: knativeServingColor.value,\n};\n\nexport const KnativeServingModel: K8sKind = {\n apiGroup: 'operator.knative.dev',\n apiVersion: 'v1alpha1',\n kind: 'KnativeServing',\n label: 'KnativeServing',\n // t('knative-plugin~KnativeServing')\n labelKey: 'knative-plugin~KnativeServing',\n labelPlural: 'KnativeServings',\n // t('knative-plugin~KnativeServings')\n labelPluralKey: 'knative-plugin~KnativeServings',\n plural: 'knativeservings',\n id: 'knativeserving',\n abbr: 'KS',\n namespaced: true,\n crd: true,\n color: knativeServingColor.value,\n};\n\nexport const RevisionModel: K8sKind = {\n apiGroup: KNATIVE_SERVING_APIGROUP,\n apiVersion,\n kind: 'Revision',\n label: 'Revision',\n // t('knative-plugin~Revision')\n labelKey: 'knative-plugin~Revision',\n // t('knative-plugin~Revisions')\n labelPluralKey: 'knative-plugin~Revisions',\n labelPlural: 'Revisions',\n plural: 'revisions',\n id: 'revision',\n abbr: 'REV',\n namespaced: true,\n crd: true,\n color: knativeServingColor.value,\n};\n\nexport const RouteModel: K8sKind = {\n apiGroup: KNATIVE_SERVING_APIGROUP,\n apiVersion,\n kind: 'Route',\n label: 'Route',\n // t('knative-plugin~Route')\n labelKey: 'knative-plugin~Route',\n labelPlural: 'Routes',\n // t('knative-plugin~Routes')\n labelPluralKey: 'knative-plugin~Routes',\n plural: 'routes',\n id: 'route',\n abbr: 'RT',\n namespaced: true,\n crd: true,\n color: knativeServingColor.value,\n};\n\nexport const ServiceModel: K8sKind = {\n apiGroup: KNATIVE_SERVING_APIGROUP,\n apiVersion,\n kind: 'Service',\n label: 'Service',\n // t('knative-plugin~Service')\n labelKey: 'knative-plugin~Service',\n // t('knative-plugin~Services')\n labelPluralKey: 'knative-plugin~Services',\n labelPlural: 'Services',\n plural: 'services',\n id: 'service',\n abbr: 'KSVC',\n namespaced: true,\n crd: true,\n color: knativeServingColor.value,\n};\n\nexport const DomainMappingModel: K8sKind = {\n apiGroup: KNATIVE_SERVING_APIGROUP,\n apiVersion: 'v1beta1',\n kind: 'DomainMapping',\n label: 'DomainMapping',\n // t('knative-plugin~DomainMapping')\n labelKey: 'knative-plugin~DomainMapping',\n labelPlural: 'DomainMappings',\n // t('knative-plugin~DomainMappings')\n labelPluralKey: 'knative-plugin~DomainMappings',\n plural: 'domainmappings',\n id: 'DomainMapping',\n abbr: 'DM',\n namespaced: true,\n crd: true,\n color: knativeServingColor.value,\n};\n\nexport const EventingSubscriptionModel: K8sKind = {\n apiGroup: KNATIVE_EVENT_MESSAGE_APIGROUP,\n apiVersion,\n kind: 'Subscription',\n label: 'Subscription',\n // t('knative-plugin~Subscription')\n labelKey: 'knative-plugin~Subscription',\n labelPlural: 'Subscriptions',\n // t('knative-plugin~Subscriptions')\n labelPluralKey: 'knative-plugin~Subscriptions',\n plural: 'subscriptions',\n id: 'subscriptioneventing',\n abbr: 'S',\n namespaced: true,\n crd: true,\n color: knativeEventingColor.value,\n};\n\nexport const EventingBrokerModel: K8sKind = {\n apiGroup: KNATIVE_EVENTING_APIGROUP,\n apiVersion,\n kind: 'Broker',\n label: 'Broker',\n // t('knative-plugin~Broker')\n labelKey: 'knative-plugin~Broker',\n labelPlural: 'Brokers',\n // t('knative-plugin~Brokers')\n labelPluralKey: 'knative-plugin~Brokers',\n plural: 'brokers',\n id: 'broker',\n abbr: 'B',\n namespaced: true,\n crd: true,\n color: knativeEventingColor.value,\n};\n\nexport const EventingTriggerModel: K8sKind = {\n apiGroup: KNATIVE_EVENTING_APIGROUP,\n apiVersion,\n kind: 'Trigger',\n label: 'Trigger',\n // t('knative-plugin~Trigger')\n labelKey: 'knative-plugin~Trigger',\n labelPlural: 'Triggers',\n // t('knative-plugin~Triggers')\n labelPluralKey: 'knative-plugin~Triggers',\n plural: 'triggers',\n id: 'trigger',\n abbr: 'T',\n namespaced: true,\n crd: true,\n color: knativeEventingColor.value,\n};\n\nexport const CamelIntegrationModel: K8sKind = {\n apiGroup: CAMEL_APIGROUP,\n apiVersion,\n kind: 'Integration',\n label: 'Integration',\n // t('knative-plugin~Integration')\n labelKey: 'knative-plugin~Integration',\n labelPlural: 'Integrations',\n // t('knative-plugin~Integration')\n labelPluralKey: 'knative-plugin~Integrations',\n plural: 'integrations',\n id: 'integration',\n abbr: 'I',\n namespaced: true,\n crd: true,\n color: knativeEventingColor.value,\n};\n\nexport const KafkaModel: K8sKind = {\n apiGroup: STRIMZI_KAFKA_APIGROUP,\n apiVersion: 'v1beta2',\n kind: 'Kafka',\n label: 'Kafka',\n // t('knative-plugin~Kafka')\n labelKey: 'knative-plugin~Kafka',\n labelPlural: 'Kafkas',\n // t('knative-plugin~Kafkas')\n labelPluralKey: 'knative-plugin~Kafkas',\n plural: 'kafkas',\n id: 'kafka',\n abbr: 'K',\n namespaced: true,\n crd: true,\n color: knativeEventingColor.value,\n};\n\nexport const KafkaTopicModel: K8sKind = {\n apiGroup: STRIMZI_KAFKA_APIGROUP,\n apiVersion: 'v1beta2',\n kind: 'KafkaTopic',\n label: 'KafkaTopic',\n // t('knative-plugin~KafkaTopic')\n labelKey: 'knative-plugin~KafkaTopic',\n labelPlural: 'KafkaTopics',\n // t('knative-plugin~KafkaTopics')\n labelPluralKey: 'knative-plugin~KafkaTopics',\n plural: 'kafkatopics',\n id: 'kafkatopic',\n abbr: 'KT',\n namespaced: true,\n crd: true,\n color: knativeEventingColor.value,\n};\n\nexport const CamelKameletBindingModel: K8sKind = {\n apiGroup: CAMEL_APIGROUP,\n apiVersion: 'v1alpha1',\n kind: 'KameletBinding',\n label: 'KameletBinding',\n // t('knative-plugin~KameletBinding')\n labelKey: 'knative-plugin~KameletBinding',\n labelPlural: 'KameletBindings',\n // t('knative-plugin~KameletBindings')\n labelPluralKey: 'knative-plugin~KameletBindings',\n plural: 'kameletbindings',\n id: 'kameletbinding',\n abbr: 'KB',\n namespaced: true,\n crd: true,\n color: knativeEventingColor.value,\n};\n\nexport const CamelKameletModel: K8sKind = {\n apiGroup: CAMEL_APIGROUP,\n apiVersion: 'v1alpha1',\n kind: 'Kamelet',\n label: 'Kamelet',\n // t('knative-plugin~Kamelet')\n labelKey: 'knative-plugin~Kamelet',\n labelPlural: 'Kamelets',\n // t('knative-plugin~Kamelets')\n labelPluralKey: 'knative-plugin~Kamelets',\n plural: 'kamelets',\n id: 'kamelet',\n abbr: 'K',\n namespaced: true,\n crd: true,\n color: knativeEventingColor.value,\n};\n\nexport const KafkaSinkModel: K8sKind = {\n apiGroup: 'eventing.knative.dev',\n apiVersion: 'v1alpha1',\n kind: 'KafkaSink',\n label: 'KafkaSink',\n // t('knative-plugin~KafkaSink')\n labelKey: 'knative-plugin~KafkaSink',\n labelPlural: 'KafkaSinks',\n // t('knative-plugin~KafkaSinks')\n labelPluralKey: 'knative-plugin~KafkaSinks',\n plural: 'kafkasinks',\n id: 'kafkasink',\n abbr: 'KS',\n namespaced: true,\n crd: true,\n color: knativeEventingColor.value,\n};\n","export * from './k8s-resource';\nexport * from './k8s-utils';\nexport * from './k8s-ref';\n","/**\n * @file Entrypoint for the `@openshift-console/dynamic-plugin-sdk` package published to npmjs.\n *\n * Provides core APIs, types and utilities used by dynamic plugins at runtime.\n */\n\nexport * from './extensions';\nexport * from './api/core-api';\n","/* eslint-disable @typescript-eslint/naming-convention */\n\nexport const CONST = Object.freeze({\n // http://kubernetes.io/docs/user-guide/images/#bypassing-kubectl-create-secrets\n PULL_SECRET_TYPE: 'kubernetes.io/dockerconfigjson',\n PULL_SECRET_DATA: '.dockerconfigjson',\n});\n\nexport const ANNOTATIONS = Object.freeze({\n displayName: 'openshift.io/display-name',\n providerDisplayName: 'openshift.io/provider-display-name',\n documentationURL: 'openshift.io/documentation-url',\n supportURL: 'openshift.io/support-url',\n});\n\n// Common shortcuts than span pages.\nexport const KEYBOARD_SHORTCUTS = Object.freeze({\n focusFilterInput: '/',\n blurFilterInput: 'Escape',\n focusNamespaceDropdown: 'n',\n});\n\nexport const RESOURCE_NAME_TRUNCATE_LENGTH = 13;\n\n// Use a key for the \"all\" namespaces option that would be an invalid namespace name to avoid a potential clash\nexport const ALL_NAMESPACES_KEY = '#ALL_NS#';\n\n// Use a key for the \"all\" applications option that would be an invalid application name to avoid a potential clash\nexport const ALL_APPLICATIONS_KEY = '#ALL_APPS#';\nexport const UNASSIGNED_APPLICATIONS_KEY = '#UNASSIGNED_APP#';\n\n// Prefix our localStorage items to avoid conflicts if another app ever runs on the same domain.\nexport const STORAGE_PREFIX = 'bridge';\n\nexport const USERSETTINGS_PREFIX = 'console';\n\n// This localStorage key predates the storage prefix.\nexport const NAMESPACE_USERSETTINGS_PREFIX = `${USERSETTINGS_PREFIX}.namespace`;\nexport const NAMESPACE_LOCAL_STORAGE_KEY = 'dropdown-storage-namespaces';\nexport const APPLICATION_USERSETTINGS_PREFIX = `${USERSETTINGS_PREFIX}.applications`;\nexport const APPLICATION_LOCAL_STORAGE_KEY = 'dropdown-storage-applications';\nexport const LAST_NAMESPACE_NAME_USER_SETTINGS_KEY = `${USERSETTINGS_PREFIX}.lastNamespace`;\nexport const LAST_NAMESPACE_NAME_LOCAL_STORAGE_KEY = `${STORAGE_PREFIX}/last-namespace-name`;\nexport const API_DISCOVERY_RESOURCES_LOCAL_STORAGE_KEY = `${STORAGE_PREFIX}/api-discovery-resources`;\nexport const COMMUNITY_PROVIDERS_WARNING_LOCAL_STORAGE_KEY = `${STORAGE_PREFIX}/community-providers-warning`;\nexport const COMMUNITY_PROVIDERS_WARNING_USERSETTINGS_KEY = `${USERSETTINGS_PREFIX}.communityProvidersWarning`;\nexport const PINNED_RESOURCES_LOCAL_STORAGE_KEY = `${STORAGE_PREFIX}/pinned-resources`;\nexport const COLUMN_MANAGEMENT_LOCAL_STORAGE_KEY = `${STORAGE_PREFIX}/table-columns`;\nexport const LOG_WRAP_LINES_USERSETTINGS_KEY = `${USERSETTINGS_PREFIX}.log.wrapLines`;\nexport const SHOW_YAML_EDITOR_TOOLTIPS_USER_SETTING_KEY = `${USERSETTINGS_PREFIX}.showYAMLEditorTooltips`;\nexport const SHOW_YAML_EDITOR_TOOLTIPS_LOCAL_STORAGE_KEY = `${STORAGE_PREFIX}/showYAMLEditorTooltips`;\nexport const SHOW_FULL_LOG_USERSETTINGS_KEY = `${USERSETTINGS_PREFIX}.show.full.log`;\n// Bootstrap user for OpenShift 4.0 clusters (kube:admin)\nexport const KUBE_ADMIN_USERNAMES = ['kube:admin'];\n\nexport const RH_OPERATOR_SUPPORT_POLICY_LINK =\n 'https://access.redhat.com/third-party-software-support';\n\n// Package manifests for the OperatorHub use this label.\nexport const OPERATOR_HUB_LABEL = 'openshift-marketplace';\n\nexport enum FLAGS {\n AUTH_ENABLED = 'AUTH_ENABLED',\n PROMETHEUS = 'PROMETHEUS',\n OPENSHIFT = 'OPENSHIFT',\n MONITORING = 'MONITORING',\n CAN_CREATE_NS = 'CAN_CREATE_NS',\n CAN_GET_NS = 'CAN_GET_NS',\n CAN_LIST_NS = 'CAN_LIST_NS',\n CAN_LIST_NODE = 'CAN_LIST_NODE',\n CAN_LIST_PV = 'CAN_LIST_PV',\n CAN_LIST_CRD = 'CAN_LIST_CRD',\n CAN_LIST_USERS = 'CAN_LIST_USERS',\n CAN_LIST_GROUPS = 'CAN_LIST_GROUPS',\n CAN_LIST_OPERATOR_GROUP = 'CAN_LIST_OPERATOR_GROUP',\n CAN_LIST_PACKAGE_MANIFEST = 'CAN_LIST_PACKAGE_MANIFEST',\n CAN_CREATE_PROJECT = 'CAN_CREATE_PROJECT',\n CAN_LIST_VSC = 'CAN_LIST_VSC',\n CLUSTER_AUTOSCALER = 'CLUSTER_AUTOSCALER',\n SHOW_OPENSHIFT_START_GUIDE = 'SHOW_OPENSHIFT_START_GUIDE',\n CLUSTER_API = 'CLUSTER_API',\n CLUSTER_VERSION = 'CLUSTER_VERSION',\n MACHINE_CONFIG = 'MACHINE_CONFIG',\n MACHINE_AUTOSCALER = 'MACHINE_AUTOSCALER',\n MACHINE_HEALTH_CHECK = 'MACHINE_HEALTH_CHECK',\n CONSOLE_LINK = 'CONSOLE_LINK',\n CONSOLE_CLI_DOWNLOAD = 'CONSOLE_CLI_DOWNLOAD',\n CONSOLE_NOTIFICATION = 'CONSOLE_NOTIFICATION',\n CONSOLE_EXTERNAL_LOG_LINK = 'CONSOLE_EXTERNAL_LOG_LINK',\n CONSOLE_YAML_SAMPLE = 'CONSOLE_YAML_SAMPLE',\n CONSOLE_QUICKSTART = 'CONSOLE_QUICKSTART',\n CONSOLE_CAPABILITY_LIGHTSPEEDBUTTON_IS_ENABLED = 'CONSOLE_CAPABILITY_LIGHTSPEEDBUTTON_IS_ENABLED',\n LIGHTSPEED_IS_AVAILABLE_TO_INSTALL = 'LIGHTSPEED_IS_AVAILABLE_TO_INSTALL',\n}\n\nexport const CONFIG_STORAGE_CONSOLE = 'console';\nexport const COLUMN_MANAGEMENT_CONFIGMAP_KEY = `${CONFIG_STORAGE_CONSOLE}.tableColumns`;\nexport const ACM_LINK_ID = 'acm-console-link';\n\nexport const SYSTEM_NAMESPACES_PREFIX = ['kube-', 'openshift-', 'kubernetes-'];\nexport const SYSTEM_NAMESPACES = ['default', 'openshift'];\n\nexport enum REQUESTER_FILTER {\n ME = 'me',\n USER = 'user',\n SYSTEM = 'system',\n}\n\nexport enum USER_TELEMETRY_ANALYTICS {\n ALLOW = 'allow',\n DENY = 'deny',\n}\n\nexport enum CLUSTER_TELEMETRY_ANALYTICS {\n OPTIN = 'OPT-IN',\n OPTOUT = 'OPT-OUT',\n DISABLED = 'DISABLED',\n ENFORCE = 'ENFORCE',\n}\n\nexport const CLUSTER_VERSION_DEFAULT_UPSTREAM_SERVER_URL_PLACEHOLDER =\n 'https://api.openshift.com/api/upgrades_info/v1/graph';\n\nexport const GETTING_STARTED_USER_SETTINGS_KEY_ADD_PAGE =\n 'devconsole.addPage.gettingStarted.expanded';\nexport const GETTING_STARTED_USER_SETTINGS_KEY_CLUSTER_DASHBOARD =\n 'console.clusterDashboard.gettingStarted.expanded';\nexport const PREFERRED_TELEMETRY_USER_SETTING_KEY = 'telemetry.analytics';\n","import { K8sModel } from '../../api/common-types';\nimport {\n GetAPIVersionForModel,\n GetGroupVersionKindForResource,\n GetGroupVersionKindForModel,\n} from '../../api/k8s-types';\nimport { K8sGroupVersionKind, K8sResourceKindReference } from '../../extensions/console-types';\n\n/**\n * @deprecated - This will become obsolete when we move away from K8sResourceKindReference to K8sGroupVersionKind\n * Provides a reference string that uniquely identifies the group, version, and kind of a k8s resource.\n * @param K8sGroupVersionKind Pass K8sGroupVersionKind which will have group, version, and kind of a k8s resource.\n * @param K8sGroupVersionKind.group Pass group of k8s resource or model.\n * @param K8sGroupVersionKind.version Pass version of k8s resource or model.\n * @param K8sGroupVersionKind.kind Pass kind of k8s resource or model.\n * @returns The reference for any k8s resource i.e `group~version~kind`.\n * If the group will not be present then \"core\" will be returned as part of the group in reference.\n */\nexport const getReference = ({\n group,\n version,\n kind,\n}: K8sGroupVersionKind): K8sResourceKindReference => [group || 'core', version, kind].join('~');\n\n/**\n * @deprecated - This will become obsolete when we move away from K8sResourceKindReference to K8sGroupVersionKind\n * @see getGroupVersionKindForModel\n * Provides a reference string that uniquely identifies the group, version, and kind of a k8s model.\n * @param model k8s model\n * @returns The reference for model i.e `group~version~kind`.\n */\nexport const getReferenceForModel = (model: K8sModel): K8sResourceKindReference =>\n getReference({ group: model.apiGroup, version: model.apiVersion, kind: model.kind });\n\n/**\n * Provides `apiVersion` for a Kubernetes model.\n * @param model Kubernetes model\n * @returns The apiVersion for the model i.e `group/version`.\n * */\nexport const getAPIVersionForModel: GetAPIVersionForModel = (model) =>\n !model?.apiGroup ? model.apiVersion : `${model.apiGroup}/${model.apiVersion}`;\n\n/**\n * Provides a group, version, and kind for a resource.\n * @param resource Kubernetes resource\n * @returns The group, version, kind for the provided resource.\n * If the resource does not have an API group, the group `core` is returned.\n * If the resource has an invalid apiVersion then it'll throw Error.\n * */\nexport const getGroupVersionKindForResource: GetGroupVersionKindForResource = (resource) => {\n const apiVersion = resource?.apiVersion;\n const kind = resource?.kind;\n const apiVersionSplit = apiVersion?.split('/');\n const apiVersionSplitLen = apiVersionSplit?.length;\n if (apiVersionSplitLen > 2) throw new Error('Provided resource has invalid apiVersion.');\n\n return !apiVersion || !kind\n ? undefined\n : {\n ...(apiVersionSplitLen === 2 && {\n group: apiVersionSplit[0],\n }),\n version: apiVersionSplitLen === 2 ? apiVersionSplit[1] : resource?.apiVersion,\n kind,\n };\n};\n\n/**\n * Provides a group, version, and kind for a k8s model.\n * @param model Kubernetes model\n * @returns The group, version, kind for the provided model.\n * If the model does not have an apiGroup, group `core` will be returned.\n * */\nexport const getGroupVersionKindForModel: GetGroupVersionKindForModel = ({\n apiGroup,\n apiVersion: version,\n kind,\n}) => ({\n ...(apiGroup && { group: apiGroup }),\n version,\n kind,\n});\n\n/**\n * @deprecated - This will become obsolete when we move away from K8sResourceKindReference to K8sGroupVersionKind\n * Provides a group, version, and kind for a reference.\n * @param reference reference for group, version, kind i.e `group~version~kind`.\n * @returns The group, version, kind for the provided reference.\n * If the group's value is \"core\" it denotes resource does not have an API group.\n * */\nexport const getGroupVersionKindForReference = (\n reference: K8sResourceKindReference,\n): K8sGroupVersionKind => {\n const referenceSplit = reference.split('~');\n if (referenceSplit.length > 3) throw new Error('Provided reference is invalid.');\n\n const [group, version, kind] = referenceSplit;\n return {\n group,\n version,\n kind,\n };\n};\n\n/**\n * @deprecated - This will become obsolete when we move away from K8sResourceKindReference to K8sGroupVersionKind\n * Provides a reference string that uniquely identifies the group, version, and kind of K8sGroupVersionKind.\n * @param kind kind can be of type K8sResourceKindReference or K8sGroupVersionKind\n * @returns The reference i.e `group~version~kind`.\n */\nexport const transformGroupVersionKindToReference = (\n kind: K8sResourceKindReference | K8sGroupVersionKind,\n): K8sResourceKindReference =>\n kind && typeof kind !== 'string' ? getReference(kind) : (kind as K8sResourceKindReference);\n","import * as _ from 'lodash';\nimport { HttpError, RetryError } from '@console/dynamic-plugin-sdk/src/utils/error/http-error';\nimport { authSvc } from './module/auth';\nimport { getCSRFToken } from '@console/dynamic-plugin-sdk/src/utils/fetch/console-fetch-utils';\n\nexport const applyConsoleHeaders = (url, options) => {\n const token = getCSRFToken();\n if (options.headers) {\n options.headers['X-CSRFToken'] = token;\n } else {\n options.headers = { 'X-CSRFToken': token };\n }\n\n // X-CSRFToken is used only for non-GET requests targeting bridge\n if (options.method === 'GET' || url.indexOf('://') >= 0) {\n delete options.headers['X-CSRFToken'];\n }\n return options;\n};\n\n// TODO: url can be url or path, but shouldLogout only handles paths\nexport const shouldLogout = (url: string): boolean => {\n const k8sRegex = new RegExp(`^${window.SERVER_FLAGS.basePath}api/kubernetes/`);\n // 401 from k8s. show logout screen\n if (k8sRegex.test(url)) {\n // Don't let 401s from proxied services log out users\n const proxyRegex = new RegExp(`^${window.SERVER_FLAGS.basePath}api/kubernetes/api/v1/proxy/`);\n if (proxyRegex.test(url)) {\n return false;\n }\n const serviceRegex = new RegExp(\n `^${window.SERVER_FLAGS.basePath}api/kubernetes/api/v1/namespaces/\\\\w+/services/\\\\w+/proxy/`,\n );\n if (serviceRegex.test(url)) {\n return false;\n }\n return true;\n }\n return false;\n};\n\nexport const validateStatus = async (\n response: Response,\n url: string,\n method: string,\n retry: boolean,\n) => {\n if (response.ok) {\n return response;\n }\n\n if (retry && response.status === 429) {\n throw new RetryError();\n }\n\n if (response.status === 401 && shouldLogout(url)) {\n const next = window.location.pathname + window.location.search + window.location.hash;\n authSvc.logout(next);\n }\n\n const contentType = response.headers.get('content-type');\n if (!contentType || contentType.indexOf('json') === -1) {\n throw new HttpError(response.statusText, response.status, response);\n }\n\n if (response.status === 403) {\n return response.json().then((json) => {\n throw new HttpError(\n json.message || 'Access denied due to cluster policy.',\n response.status,\n response,\n json,\n );\n });\n }\n\n return response.json().then((json) => {\n // retry 409 conflict errors due to ClustResourceQuota / ResourceQuota\n // https://bugzilla.redhat.com/show_bug.cgi?id=1920699\n if (\n retry &&\n method === 'POST' &&\n response.status === 409 &&\n ['resourcequotas', 'clusterresourcequotas'].includes(json.details?.kind)\n ) {\n throw new RetryError();\n }\n const cause = json.details?.causes?.[0];\n let reason;\n if (cause) {\n reason = `Error \"${cause.message}\" for field \"${cause.field}\".`;\n }\n if (!reason) {\n reason = json.message;\n }\n if (!reason) {\n reason = json.error;\n }\n if (!reason) {\n reason = response.statusText;\n }\n\n throw new HttpError(reason, response.status, response, json);\n });\n};\n\nconst initDefaults = {\n headers: {},\n credentials: 'same-origin',\n};\n\nexport const appInternalFetch = async (url: string, options: RequestInit): Promise<Response> => {\n let attempt = 0;\n let response: Response;\n let retry = true;\n\n const op1 = applyConsoleHeaders(url, options);\n const allOptions = _.defaultsDeep({}, initDefaults, op1);\n\n while (retry) {\n retry = false;\n attempt++;\n try {\n response = await fetch(url, allOptions).then((resp) =>\n validateStatus(resp, url, allOptions.method, attempt < 3),\n );\n } catch (e) {\n if (e instanceof RetryError) {\n retry = true;\n } else {\n // eslint-disable-next-line no-console\n console.warn(`consoleFetch failed for url ${url}`, e);\n throw e;\n }\n }\n }\n return response;\n};\n\nexport {\n consoleFetch as coFetch,\n consoleFetchJSON as coFetchJSON,\n consoleFetchText as coFetchText,\n getConsoleRequestHeaders,\n} from '@console/dynamic-plugin-sdk/src/utils/fetch';\n","import * as classNames from 'classnames';\nimport * as Modal from 'react-modal';\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport { Router } from 'react-router-dom';\nimport { CompatRouter } from 'react-router-dom-v5-compat';\nimport { useTranslation } from 'react-i18next';\nimport { ActionGroup, Button, Text, TextContent, TextVariants } from '@patternfly/react-core';\nimport CloseButton from '@console/shared/src/components/close-button';\nimport store from '../../redux';\nimport { ButtonBar } from '../utils/button-bar';\nimport { history } from '../utils/router';\n\n/** @deprecated Use dynamic plugin sdk 'useModal' hook instead */\nexport const createModal: CreateModal = (getModalElement) => {\n const containerElement = document.getElementById('modal-container');\n const result = new Promise<void>((resolve) => {\n const closeModal = (e?: React.SyntheticEvent) => {\n if (e && e.stopPropagation) {\n e.stopPropagation();\n }\n ReactDOM.unmountComponentAtNode(containerElement);\n resolve();\n };\n Modal.setAppElement(document.getElementById('app-content'));\n containerElement && ReactDOM.render(getModalElement(closeModal), containerElement);\n });\n return { result };\n};\n\n/** @deprecated Use PF modals instead */\nexport const ModalWrapper: React.FC<ModalWrapperProps> = ({\n blocking,\n className,\n children,\n onClose,\n}) => {\n const { t } = useTranslation();\n const parentSelector = React.useCallback(() => document.querySelector('#modal-container'), []);\n return (\n <Modal\n className={classNames('modal-dialog', className)}\n contentLabel={t('public~Modal')}\n isOpen\n onRequestClose={onClose}\n overlayClassName=\"co-overlay\"\n parentSelector={parentSelector}\n shouldCloseOnOverlayClick={!blocking}\n >\n {children}\n </Modal>\n );\n};\n\n/** @deprecated Use dynamic plugin sdk 'useModal' hook instead */\nexport const createModalLauncher: CreateModalLauncher = (Component, modalWrapper = true) => ({\n blocking,\n modalClassName,\n close,\n cancel,\n ...props\n}) => {\n const getModalContainer: GetModalContainer = (onClose) => {\n const handleClose = (e: React.SyntheticEvent) => {\n onClose?.(e);\n close?.();\n };\n const handleCancel = (e: React.SyntheticEvent) => {\n cancel?.();\n handleClose(e);\n };\n\n return (\n <Provider store={store}>\n <Router {...{ history, basename: window.SERVER_FLAGS.basePath }}>\n <CompatRouter>\n {modalWrapper ? (\n <ModalWrapper blocking={blocking} className={modalClassName} onClose={handleClose}>\n <Component {...(props as any)} cancel={handleCancel} close={handleClose} />\n </ModalWrapper>\n ) : (\n <Component {...(props as any)} cancel={handleCancel} close={handleClose} />\n )}\n </CompatRouter>\n </Router>\n </Provider>\n );\n };\n return createModal(getModalContainer);\n};\n\n/** @deprecated Use PF modals instead */\nexport const ModalTitle: React.FC<ModalTitleProps> = ({\n children,\n className = 'modal-header',\n close,\n}) => (\n <div className={className}>\n <TextContent>\n <Text component={TextVariants.h1} data-test-id=\"modal-title\">\n {children}\n {close && (\n <CloseButton\n onClick={(e) => {\n e.stopPropagation();\n close(e);\n }}\n />\n )}\n </Text>\n </TextContent>\n </div>\n);\n\n/** @deprecated Use PF modals instead */\nexport const ModalBody: React.FC<ModalBodyProps> = ({ children }) => (\n <div className=\"modal-body\">\n <div className=\"modal-body-content\">{children}</div>\n </div>\n);\n\n/** @deprecated Use PF modals instead */\nexport const ModalFooter: React.FC<ModalFooterProps> = ({\n message,\n errorMessage,\n inProgress,\n children,\n}) => {\n return (\n <ButtonBar\n className=\"modal-footer\"\n errorMessage={errorMessage}\n infoMessage={message}\n inProgress={inProgress}\n >\n {children}\n </ButtonBar>\n );\n};\n\n/** @deprecated Use PF modals instead */\nexport const ModalSubmitFooter: React.FC<ModalSubmitFooterProps> = ({\n message,\n errorMessage,\n inProgress,\n cancel,\n submitText,\n cancelText,\n className,\n submitDisabled,\n submitDanger,\n buttonAlignment = 'right',\n resetText,\n reset,\n}) => {\n const { t } = useTranslation();\n const onCancelClick = (e) => {\n e.stopPropagation();\n cancel(e);\n };\n\n const onResetClick = (e) => {\n e.stopPropagation();\n reset(e);\n };\n\n const cancelButton = (\n <Button\n type=\"button\"\n variant=\"secondary\"\n data-test-id=\"modal-cancel-action\"\n onClick={onCancelClick}\n aria-label={t('public~Cancel')}\n >\n {cancelText || t('public~Cancel')}\n </Button>\n );\n\n const submitButton = (\n <Button\n data-test=\"confirm-action\"\n id=\"confirm-action\"\n isDisabled={submitDisabled}\n type=\"submit\"\n variant={submitDanger ? 'danger' : 'primary'}\n isLoading={inProgress}\n >\n {submitText || t('public~Submit')}\n </Button>\n );\n\n const resetButton = (\n <Button variant=\"link\" isInline onClick={onResetClick} id=\"reset-action\">\n {resetText || t('public~Reset')}\n </Button>\n );\n\n return (\n <ModalFooter\n inProgress={false}\n errorMessage={errorMessage}\n message={message}\n className={className}\n >\n <ActionGroup\n className={classNames(\n { 'pf-v5-c-form__actions--right': buttonAlignment === 'right' },\n 'pf-v5-c-form pf-v5-c-form__group--no-top-margin',\n )}\n >\n {buttonAlignment === 'left' ? (\n <>\n {submitButton}\n {reset && resetButton}\n {cancelButton}\n </>\n ) : (\n <>\n {reset && resetButton}\n {cancelButton}\n {submitButton}\n </>\n )}\n </ActionGroup>\n </ModalFooter>\n );\n};\n\nexport type ModalWrapperProps = {\n blocking?: boolean;\n className?: string;\n onClose?: (event?: React.SyntheticEvent) => void;\n};\n\n/** @deprecated Use dynamic plugin sdk 'useModal' hook instead */\nexport type GetModalContainer = (onClose: (e?: React.SyntheticEvent) => void) => React.ReactElement;\n\ntype CreateModal = (getModalContainer: GetModalContainer) => { result: Promise<any> };\n\nexport type CreateModalLauncherProps = {\n blocking?: boolean;\n modalClassName?: string;\n};\n\nexport type ModalComponentProps = {\n cancel?: () => void;\n close?: () => void;\n};\n\nexport type ModalTitleProps = {\n className?: string;\n close?: (e: React.SyntheticEvent<any, Event>) => void;\n};\n\nexport type ModalBodyProps = {\n className?: string;\n};\n\nexport type ModalFooterProps = {\n message?: string;\n errorMessage?: React.ReactNode;\n inProgress: boolean;\n className?: string;\n};\n\nexport type ModalSubmitFooterProps = {\n message?: string;\n errorMessage?: string;\n inProgress: boolean;\n cancel: (e: React.SyntheticEvent<any, Event>) => void;\n cancelText?: React.ReactNode;\n className?: string;\n resetText?: React.ReactNode;\n reset?: (e: React.SyntheticEvent<any, Event>) => void;\n submitText: React.ReactNode;\n submitDisabled?: boolean;\n submitDanger?: boolean;\n buttonAlignment?: 'left' | 'right';\n};\n\nexport type CreateModalLauncher = <P extends ModalComponentProps>(\n C: React.ComponentType<P>,\n modalWrapper?: boolean,\n) => (props: P & CreateModalLauncherProps) => { result: Promise<{}> };\n","export { useK8sWatchResource } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sWatchResource';\nexport { useK8sWatchResources } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sWatchResources';\n","import * as _ from 'lodash';\nimport { ActionType as Action, action } from 'typesafe-actions';\nimport { DiscoveryResources, K8sModel } from '../../../api/common-types';\nimport { FilterValue, K8sResourceKind } from '../../../extensions/console-types';\nimport { getReferenceForModel } from '../../../utils/k8s/k8s-ref';\nimport { k8sList, k8sGet } from '../../../utils/k8s/k8s-resource';\nimport { k8sWatch } from '../../../utils/k8s/k8s-utils';\nimport { WSFactory } from '../../../utils/k8s/ws-factory';\nimport { getImpersonate } from '../../core/reducers/coreSelectors';\n\nexport enum ActionType {\n ReceivedResources = 'resources',\n GetResourcesInFlight = 'getResourcesInFlight',\n StartWatchK8sObject = 'startWatchK8sObject',\n StartWatchK8sList = 'startWatchK8sList',\n ModifyObject = 'modifyObject',\n StopWatchK8s = 'stopWatchK8s',\n\n Errored = 'errored',\n Loaded = 'loaded',\n BulkAddToList = 'bulkAddToList',\n UpdateListFromWS = 'updateListFromWS',\n FilterList = 'filterList',\n}\n\ntype K8sEvent = { type: 'ADDED' | 'DELETED' | 'MODIFIED'; object: K8sResourceKind };\n\nexport const updateListFromWS = (id: string, k8sObjects: K8sEvent[]) =>\n action(ActionType.UpdateListFromWS, { id, k8sObjects });\nexport const loaded = (id: string, k8sObjects: K8sResourceKind | K8sResourceKind[]) =>\n action(ActionType.Loaded, { id, k8sObjects });\n\nexport const bulkAddToList = (id: string, k8sObjects: K8sResourceKind[]) =>\n action(ActionType.BulkAddToList, { id, k8sObjects });\n\nexport const startWatchK8sObject = (id: string) => action(ActionType.StartWatchK8sObject, { id });\nexport const startWatchK8sList = (id: string, query: { [key: string]: string }) =>\n action(ActionType.StartWatchK8sList, { id, query });\nexport const modifyObject = (id: string, k8sObjects: K8sResourceKind) =>\n action(ActionType.ModifyObject, { id, k8sObjects });\nexport const stopWatchK8s = (id: string) => action(ActionType.StopWatchK8s, { id });\n\nexport const errored = (id: string, k8sObjects: any) =>\n action(ActionType.Errored, { id, k8sObjects });\nexport const filterList = (id: string, name: string, value: FilterValue) =>\n action(ActionType.FilterList, { id, name, value });\n\nexport const partialObjectMetadataListHeader = {\n Accept: 'application/json;as=PartialObjectMetadataList;v=v1;g=meta.k8s.io,application/json',\n};\n\nexport const partialObjectMetadataHeader = {\n Accept: 'application/json;as=PartialObjectMetadata;v=v1;g=meta.k8s.io,application/json',\n};\n\nconst WS: { [id: string]: WSFactory } = {};\nconst POLLs: { [id: string]: number } = {};\nconst REF_COUNTS: { [id: string]: number } = {};\n\nconst paginationLimit = 250;\n\nexport const stopK8sWatch = (id: string) => (dispatch) => {\n REF_COUNTS[id] -= 1;\n if (REF_COUNTS[id] > 0) {\n return _.noop;\n }\n\n const ws = WS[id];\n if (ws) {\n ws.destroy();\n delete WS[id];\n }\n const poller = POLLs[id];\n clearInterval(poller);\n delete POLLs[id];\n delete REF_COUNTS[id];\n return dispatch(stopWatchK8s(id));\n};\n\nexport const watchK8sList = (\n id: string,\n query: { [key: string]: string },\n k8skind: K8sModel,\n extraAction?,\n partialMetadata = false,\n) => (dispatch, getState) => {\n // Only one watch per unique list ID\n if (id in REF_COUNTS) {\n REF_COUNTS[id] += 1;\n return _.noop;\n }\n\n dispatch(startWatchK8sList(id, query));\n REF_COUNTS[id] = 1;\n\n const incrementallyLoad = async (continueToken = ''): Promise<string> => {\n // the list may not still be around...\n if (!REF_COUNTS[id]) {\n // let .then handle the cleanup\n return null;\n }\n\n const requestOptions: RequestInit = partialMetadata\n ? {\n headers: partialObjectMetadataListHeader,\n }\n : {};\n\n const response = await k8sList(\n k8skind,\n {\n limit: paginationLimit,\n ...query,\n ...(continueToken ? { continue: continueToken } : {}),\n },\n true,\n requestOptions,\n );\n\n if (!REF_COUNTS[id]) {\n return null;\n }\n\n if (!continueToken) {\n [loaded, extraAction].forEach((f) => f && dispatch(f(id, response.items)));\n } else {\n dispatch(bulkAddToList(id, response.items));\n }\n\n if (response.metadata.continue) {\n return incrementallyLoad(response.metadata.continue);\n }\n return response.metadata.resourceVersion;\n };\n /**\n * Incrementally fetch list (XHR) using k8s pagination then use its resourceVersion to\n * start listening on a WS (?resourceVersion=$resourceVersion)\n * start the process over when:\n * 1. the WS closes abnormally\n * 2. the WS can not establish a connection within $TIMEOUT\n */\n const pollAndWatch = async () => {\n delete POLLs[id];\n\n try {\n const resourceVersion = await incrementallyLoad();\n // ensure this watch should still exist because pollAndWatch is recursiveish\n if (!REF_COUNTS[id]) {\n // eslint-disable-next-line no-console\n console.log(`stopped watching ${id} before finishing incremental loading.`);\n // call cleanup function out of abundance of caution...\n dispatch(stopK8sWatch(id));\n return;\n }\n\n if (WS[id]) {\n // eslint-disable-next-line no-console\n console.warn(`Attempted to create multiple websockets for ${id}.`);\n return;\n }\n\n if (!_.get(k8skind, 'verbs', ['watch']).includes('watch')) {\n // eslint-disable-next-line no-console\n console.warn(\n `${getReferenceForModel(k8skind)} does not support watching, falling back to polling.`,\n );\n if (!POLLs[id]) {\n POLLs[id] = window.setTimeout(pollAndWatch, 15 * 1000);\n }\n return;\n }\n\n const { subprotocols } = getImpersonate(getState()) || {};\n WS[id] = k8sWatch(\n k8skind,\n { ...query, resourceVersion },\n { subprotocols, timeout: 60 * 1000 },\n );\n } catch (e) {\n if (!REF_COUNTS[id]) {\n // eslint-disable-next-line no-console\n console.log(`stopped watching ${id} before finishing incremental loading with error ${e}!`);\n // call cleanup function out of abundance of caution...\n dispatch(stopK8sWatch(id));\n return;\n }\n\n dispatch(errored(id, e));\n\n if (!POLLs[id]) {\n POLLs[id] = window.setTimeout(pollAndWatch, 15 * 1000);\n }\n return;\n }\n\n WS[id]\n .onclose((event) => {\n // Close Frame Status Codes: https://tools.ietf.org/html/rfc6455#section-7.4.1\n if (event.code !== 1006) {\n return;\n }\n // eslint-disable-next-line no-console\n console.log('WS closed abnormally');\n const ws = WS[id];\n const timedOut = true;\n ws && ws.destroy(timedOut);\n })\n .ondestroy((timedOut) => {\n if (!timedOut) {\n return;\n }\n // If the WS is unsuccessful for timeout duration, assume it is less work\n // to update the entire list and then start the WS again\n\n // eslint-disable-next-line no-console\n console.log(`WS ${id} timed out - restarting polling`);\n delete WS[id];\n\n if (POLLs[id]) {\n return;\n }\n\n POLLs[id] = window.setTimeout(pollAndWatch, 15 * 1000);\n })\n .onbulkmessage((events) =>\n [updateListFromWS, extraAction].forEach((f) => f && dispatch(f(id, events))),\n );\n };\n return pollAndWatch();\n};\n\nexport const watchK8sObject = (\n id: string,\n name: string,\n namespace: string,\n query: { [key: string]: string },\n k8sModel: K8sModel,\n partialMetadata = false,\n) => (dispatch, getState) => {\n if (id in REF_COUNTS) {\n REF_COUNTS[id] += 1;\n return _.noop;\n }\n const watch = dispatch(startWatchK8sObject(id));\n REF_COUNTS[id] = 1;\n\n const requestOptions: RequestInit = partialMetadata\n ? {\n headers: partialObjectMetadataHeader,\n }\n : {};\n\n const poller = () => {\n k8sGet(k8sModel, name, namespace, {}, requestOptions)\n .then(\n (o) => dispatch(modifyObject(id, o)),\n (e) => dispatch(errored(id, e)),\n )\n .catch((err) => {\n // eslint-disable-next-line no-console\n console.log(err);\n });\n };\n POLLs[id] = window.setInterval(poller, 30 * 1000);\n poller();\n\n if (!_.get(k8sModel, 'verbs', ['watch']).includes('watch')) {\n // eslint-disable-next-line no-console\n console.warn(`${getReferenceForModel(k8sModel)} does not support watching`);\n return _.noop;\n }\n\n // Validate that a namespace is provided when watching a singular namespaced object. Must happen\n // on frontend since we use field selectors against the list endpoint to watch singular resources.\n if (k8sModel.namespaced && query.name && !query.ns) {\n // eslint-disable-next-line no-console\n console.error('Namespace required to watch namespaced resource: ', k8sModel.kind, query.name);\n return _.noop;\n }\n\n if (query.name) {\n query.fieldSelector = `metadata.name=${query.name}`;\n delete query.name;\n }\n\n const { subprotocols } = getImpersonate(getState()) || {};\n\n WS[id] = k8sWatch(k8sModel, query, {\n subprotocols,\n }).onbulkmessage((events) => events.forEach((e) => dispatch(modifyObject(id, e.object))));\n return watch;\n};\n\nexport const receivedResources = (resources: DiscoveryResources) =>\n action(ActionType.ReceivedResources, { resources });\nexport const getResourcesInFlight = () => action(ActionType.GetResourcesInFlight);\n\nconst k8sActions = {\n startWatchK8sObject,\n startWatchK8sList,\n modifyObject,\n stopWatchK8s,\n errored,\n loaded,\n bulkAddToList,\n updateListFromWS,\n filterList,\n receivedResources,\n getResourcesInFlight,\n};\n\nexport type K8sAction = Action<typeof k8sActions>;\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport * as classnames from 'classnames';\nimport { PencilAltIcon } from '@patternfly/react-icons/dist/esm/icons/pencil-alt-icon';\nimport {\n Breadcrumb,\n BreadcrumbItem,\n Button,\n Popover,\n Split,\n SplitItem,\n} from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\n\nimport { getPropertyDescription, K8sResourceKind, referenceFor } from '../../module/k8s';\nimport { LinkifyExternal } from './link';\nimport { useK8sModel } from '@console/shared/src/hooks/useK8sModel';\n\nexport const PropertyPath: React.FC<{ kind: string; path: string | string[] }> = ({\n kind,\n path,\n}) => {\n const pathArray: string[] = _.toPath(path);\n return (\n <Breadcrumb className=\"co-breadcrumb\">\n <BreadcrumbItem>{kind}</BreadcrumbItem>\n {pathArray.map((property, i) => {\n const isLast = i === pathArray.length - 1;\n return (\n <BreadcrumbItem key={i} isActive={isLast}>\n {property}\n </BreadcrumbItem>\n );\n })}\n </Breadcrumb>\n );\n};\n\nconst EditButton: React.SFC<EditButtonProps> = (props) => {\n return (\n <Button\n type=\"button\"\n variant=\"link\"\n isInline\n onClick={props.onClick}\n data-test={\n props.testId ? `${props.testId}-details-item__edit-button` : 'details-item__edit-button'\n }\n >\n {props.children}\n <PencilAltIcon className=\"co-icon-space-l pf-v5-c-button-icon--plain\" />\n </Button>\n );\n};\n\nexport const DetailsItem: React.FC<DetailsItemProps> = ({\n children,\n defaultValue = '-',\n description,\n editAsGroup,\n hideEmpty,\n label,\n labelClassName,\n obj,\n onEdit,\n canEdit = true,\n path,\n valueClassName,\n}) => {\n const { t } = useTranslation();\n const [model] = useK8sModel(obj ? referenceFor(obj) : '');\n const hide = hideEmpty && _.isEmpty(_.get(obj, path));\n const popoverContent: string = description ?? getPropertyDescription(model, path);\n const value: React.ReactNode = children || _.get(obj, path, defaultValue);\n const editable = onEdit && canEdit;\n return hide ? null : (\n <>\n <dt\n className={classnames('details-item__label', labelClassName)}\n data-test-selector={`details-item-label__${label}`}\n >\n <Split>\n <SplitItem className=\"details-item__label\">\n {popoverContent || path ? (\n <Popover\n headerContent={<div>{label}</div>}\n {...(popoverContent && {\n bodyContent: (\n <LinkifyExternal>\n <div className=\"co-pre-line\">{popoverContent}</div>\n </LinkifyExternal>\n ),\n })}\n {...(path && { footerContent: <PropertyPath kind={model?.kind} path={path} /> })}\n maxWidth=\"30rem\"\n >\n <Button data-test={label} variant=\"plain\" className=\"details-item__popover-button\">\n {label}\n </Button>\n </Popover>\n ) : (\n label\n )}\n </SplitItem>\n {editable && editAsGroup && (\n <>\n <SplitItem isFilled />\n <SplitItem>\n <EditButton testId={label} onClick={onEdit}>\n {t('public~Edit')}\n </EditButton>\n </SplitItem>\n </>\n )}\n </Split>\n </dt>\n <dd\n className={classnames('details-item__value', valueClassName, {\n 'details-item__value--group': editable && editAsGroup,\n })}\n data-test-selector={`details-item-value__${label}`}\n >\n {editable && !editAsGroup ? (\n <EditButton testId={label} onClick={onEdit}>\n {value}\n </EditButton>\n ) : (\n value\n )}\n </dd>\n </>\n );\n};\n\nexport type DetailsItemProps = {\n canEdit?: boolean;\n defaultValue?: React.ReactNode;\n description?: string;\n editAsGroup?: boolean;\n hideEmpty?: boolean;\n label: string;\n labelClassName?: string;\n obj?: K8sResourceKind;\n onEdit?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n path?: string | string[];\n valueClassName?: string;\n};\n\ntype EditButtonProps = {\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n testId?: string;\n};\n\nDetailsItem.displayName = 'DetailsItem';\nPropertyPath.displayName = 'PropertyPath';\nEditButton.displayName = 'EditButton';\n","import { K8sKind } from '@console/internal/module/k8s';\n\nexport const OperatorSourceModel: K8sKind = {\n kind: 'OperatorSource',\n label: 'OperatorSource',\n // t('olm~OperatorSource')\n labelKey: 'olm~OperatorSource',\n labelPlural: 'OperatorSource',\n // t('olm~OperatorSource')\n labelPluralKey: 'olm~OperatorSource',\n apiGroup: 'operators.coreos.com',\n apiVersion: 'v1',\n abbr: 'OSRC',\n namespaced: true,\n crd: true,\n plural: 'operatorsources',\n};\n\nexport const CatalogSourceModel: K8sKind = {\n kind: 'CatalogSource',\n label: 'CatalogSource',\n // t('olm~CatalogSource')\n labelKey: 'olm~CatalogSource',\n labelPlural: 'CatalogSources',\n // t('olm~CatalogSources')\n labelPluralKey: 'olm~CatalogSources',\n apiGroup: 'operators.coreos.com',\n apiVersion: 'v1alpha1',\n abbr: 'CS',\n namespaced: true,\n crd: true,\n plural: 'catalogsources',\n};\n\nexport const PackageManifestModel: K8sKind = {\n kind: 'PackageManifest',\n label: 'PackageManifest',\n // t('olm~PackageManifest')\n labelKey: 'olm~PackageManifest',\n labelPlural: 'PackageManifests',\n // t('olm~PackageManifests')\n labelPluralKey: 'olm~PackageManifests',\n apiGroup: 'packages.operators.coreos.com',\n apiVersion: 'v1',\n abbr: 'PM',\n namespaced: true,\n crd: true,\n plural: 'packagemanifests',\n};\n\nexport const ClusterServiceVersionModel: K8sKind = {\n kind: 'ClusterServiceVersion',\n label: 'ClusterServiceVersion',\n // t('olm~ClusterServiceVersion')\n labelKey: 'olm~ClusterServiceVersion',\n labelPlural: 'ClusterServiceVersions',\n // t('olm~ClusterServiceVersions')\n labelPluralKey: 'olm~ClusterServiceVersions',\n apiGroup: 'operators.coreos.com',\n apiVersion: 'v1alpha1',\n abbr: 'CSV',\n namespaced: true,\n crd: true,\n plural: 'clusterserviceversions',\n propagationPolicy: 'Foreground',\n legacyPluralURL: true,\n};\n\nexport const InstallPlanModel: K8sKind = {\n kind: 'InstallPlan',\n label: 'InstallPlan',\n // t('olm~InstallPlan')\n labelKey: 'olm~InstallPlan',\n labelPlural: 'InstallPlans',\n // t('olm~InstallPlans')\n labelPluralKey: 'olm~InstallPlans',\n apiGroup: 'operators.coreos.com',\n apiVersion: 'v1alpha1',\n abbr: 'IP',\n namespaced: true,\n crd: true,\n plural: 'installplans',\n legacyPluralURL: true,\n};\n\nexport const SubscriptionModel: K8sKind = {\n kind: 'Subscription',\n label: 'Subscription',\n // t('olm~Subscription')\n labelKey: 'olm~Subscription',\n labelPlural: 'Subscriptions',\n // t('olm~Subscriptions')\n labelPluralKey: 'olm~Subscriptions',\n apiGroup: 'operators.coreos.com',\n apiVersion: 'v1alpha1',\n abbr: 'SUB',\n namespaced: true,\n crd: true,\n plural: 'subscriptions',\n legacyPluralURL: true,\n};\n\nexport const OperatorGroupModel: K8sKind = {\n kind: 'OperatorGroup',\n label: 'OperatorGroup',\n // t('olm~OperatorGroup')\n labelKey: 'olm~OperatorGroup',\n labelPlural: 'OperatorGroups',\n // t('olm~OperatorGroups')\n labelPluralKey: 'olm~OperatorGroups',\n apiGroup: 'operators.coreos.com',\n apiVersion: 'v1',\n abbr: 'OG',\n namespaced: true,\n crd: true,\n plural: 'operatorgroups',\n};\n\nexport const OperatorHubModel: K8sKind = {\n kind: 'OperatorHub',\n label: 'OperatorHub',\n // t('olm~OperatorHub')\n labelKey: 'olm~OperatorHub',\n labelPlural: 'OperatorHubs',\n // t('olm~OperatorHubs')\n labelPluralKey: 'olm~OperatorHubs',\n apiGroup: 'config.openshift.io',\n apiVersion: 'v1',\n abbr: 'OH',\n namespaced: false,\n crd: true,\n plural: 'operatorhubs',\n};\n","// This module utilizes dynamic `import()` to enable lazy-loading for each modal instead of including them in the main bundle.\n\n// Helper to detect if a modal is open. This is used to disable autofocus in elements under a modal.\n// TODO: Improve focus and keybinding handling, see https://issues.redhat.com/browse/ODC-3554\nexport const isModalOpen = () => document.body.classList.contains('ReactModal__Body--open');\n\nexport const configureCountModal = (props) =>\n import('./configure-count-modal' /* webpackChunkName: \"configure-count-modal\" */).then((m) =>\n m.configureCountModal(props),\n );\n\nexport const configureReplicaCountModal = (props) =>\n import('./configure-count-modal' /* webpackChunkName: \"configure-count-modal\" */).then((m) =>\n m.configureReplicaCountModal(props),\n );\n\nexport const configureJobParallelismModal = (props) =>\n import('./configure-count-modal' /* webpackChunkName: \"configure-count-modal\" */).then((m) =>\n m.configureJobParallelismModal(props),\n );\n\nexport const confirmModal = (props) =>\n import('./confirm-modal' /* webpackChunkName: \"confirm-modal\" */).then((m) =>\n m.confirmModal(props),\n );\n\nexport const deleteNamespaceModal = (props) =>\n import('./delete-namespace-modal' /* webpackChunkName: \"delete-namespace-modal\" */).then((m) =>\n m.deleteNamespaceModal(props),\n );\n\nexport const errorModal = (props) =>\n import('./error-modal' /* webpackChunkName: \"error-modal\" */).then((m) => m.errorModal(props));\n\nexport const configureNamespacePullSecretModal = (props) =>\n import(\n './configure-ns-pull-secret-modal' /* webpackChunkName: \"configure-ns-pull-secret-modal\" */\n ).then((m) => m.configureNamespacePullSecretModal(props));\n\nexport const labelsModalLauncher = (props) =>\n import('./labels-modal' /* webpackChunkName: \"labels-modal\" */).then((m) =>\n m.labelsModalLauncher(props),\n );\n\nexport const podSelectorModal = (props) =>\n import('./labels-modal' /* webpackChunkName: \"labels-modal\" */).then((m) =>\n m.podSelectorModal(props),\n );\n\nexport const rollbackModal = (props) =>\n import('./rollback-modal' /* webpackChunkName: \"rollback-modal\" */).then((m) =>\n m.rollbackModal(props),\n );\n\nexport const configureUpdateStrategyModal = (props) =>\n import(\n './configure-update-strategy-modal' /* webpackChunkName: \"configure-update-strategy-modal\" */\n ).then((m) => m.configureUpdateStrategyModal(props));\n\nexport const annotationsModalLauncher = (props) =>\n import('./tags' /* webpackChunkName: \"tags\" */).then((m) => m.annotationsModalLauncher(props));\n\nexport const deleteModal = (props) =>\n import('./delete-modal' /* webpackChunkName: \"delete-modal\" */).then((m) => m.deleteModal(props));\n\nexport const clusterChannelModal = (props) =>\n import('./cluster-channel-modal' /* webpackChunkName: \"cluster-channel-modal\" */).then((m) =>\n m.clusterChannelModal(props),\n );\n\nexport const clusterMoreUpdatesModal = (props) =>\n import(\n './cluster-more-updates-modal' /* webpackChunkName: \"cluster-more-updates-modal\" */\n ).then((m) => m.clusterMoreUpdatesModal(props));\n\nexport const clusterUpdateModal = (props) =>\n import('./cluster-update-modal' /* webpackChunkName: \"cluster-update-modal\" */).then((m) =>\n m.clusterUpdateModal(props),\n );\n\nexport const taintsModal = (props) =>\n import('./taints-modal' /* webpackChunkName: \"taints-modal\" */).then((m) => m.taintsModal(props));\n\nexport const tolerationsModal = (props) =>\n import('./tolerations-modal' /* webpackChunkName: \"tolerations-modal\" */).then((m) =>\n m.tolerationsModal(props),\n );\n\nexport const expandPVCModal = (props) =>\n import('./expand-pvc-modal' /* webpackChunkName: \"expand-pvc-modal\" */).then((m) =>\n m.expandPVCModal(props),\n );\n\nexport const clonePVCModal = (props) =>\n import(\n '@console/app/src/components/modals/clone/clone-pvc-modal' /* webpackChunkName: \"clone-pvc-modal\" */\n ).then((m) => m.default(props));\n\nexport const removeVolumeModal = (props) =>\n import('./remove-volume-modal' /* webpackChunkName: \"remove-volume-modal\" */).then((m) =>\n m.removeVolumeModal(props),\n );\n\nexport const configureClusterUpstreamModal = (props) =>\n import(\n './configure-cluster-upstream-modal' /* webpackChunkName: \"configure-cluster-upstream-modal\" */\n ).then((m) => m.configureClusterUpstreamModal(props));\n\nexport const configureMachineAutoscalerModal = (props) =>\n import(\n './configure-machine-autoscaler-modal' /* webpackChunkName: \"configure-machine-autoscaler-modal\" */\n ).then((m) => m.configureMachineAutoscalerModal(props));\n\nexport const createAlertRoutingModal = (props) =>\n import('./alert-routing-modal' /* webpackChunkName: \"alert-routing-modal\" */).then((m) =>\n m.createAlertRoutingModal(props),\n );\n\nexport const createColumnManagementModal = (props) =>\n import('./column-management-modal' /* webpackChunkName: \"column-management-modal\" */).then((m) =>\n m.createColumnManagementModal(props),\n );\n\nexport const addUsersModal = (props) =>\n import('./add-users-modal' /* webpackChunkName: \"add-users-modal\" */).then((m) =>\n m.addUsersModal(props),\n );\n\nexport const removeUserModal = (props) =>\n import('./remove-user-modal' /* webpackChunkName: \"remove-user-modal\" */).then((m) =>\n m.removeUserModal(props),\n );\n\nexport const restorePVCModal = (props) =>\n import(\n '@console/app/src/components/modals/restore-pvc/restore-pvc-modal' /* webpackChunkName: \"restore-pvc-modal\" */\n ).then((m) => m.default(props));\n\nexport const managedResourceSaveModal = (props) =>\n import(\n './managed-resource-save-modal' /* webpackChunkName: \"managed-resource-save-modal\" */\n ).then((m) => m.managedResourceSaveModal(props));\n","export const FLAG_KNATIVE_SERVING_CONFIGURATION = 'KNATIVE_SERVING_CONFIGURATION';\nexport const FLAG_KNATIVE_SERVING = 'KNATIVE_SERVING';\nexport const FLAG_KNATIVE_EVENTING = 'KNATIVE_EVENTING';\nexport const FLAG_KNATIVE_SERVING_REVISION = 'KNATIVE_SERVING_REVISION';\nexport const FLAG_KNATIVE_SERVING_ROUTE = 'KNATIVE_SERVING_ROUTE';\nexport const FLAG_KNATIVE_SERVING_SERVICE = 'KNATIVE_SERVING_SERVICE';\nexport const KNATIVE_SERVING_LABEL = 'serving.knative.dev/service';\nexport const PRIVATE_KNATIVE_SERVING_LABEL = 'networking.knative.dev/visibility';\nexport const KNATIVE_SERVING_APIGROUP = 'serving.knative.dev';\nexport const KNATIVE_EVENTING_APIGROUP = 'eventing.knative.dev';\nexport const KNATIVE_EVENT_MESSAGE_APIGROUP = 'messaging.knative.dev';\nexport const KNATIVE_EVENT_SOURCE_APIGROUP_DEP = 'sources.eventing.knative.dev';\nexport const KNATIVE_EVENT_SOURCE_APIGROUP = 'sources.knative.dev';\nexport const CAMEL_APIGROUP = 'camel.apache.org';\nexport const STRIMZI_KAFKA_APIGROUP = 'kafka.strimzi.io';\nexport const EVENT_SOURCE_ICON = 'console.openshift.io/icon';\nexport const CAMEL_KAMELET_ICON = `${CAMEL_APIGROUP}/kamelet.icon`;\nexport const CAMEL_SOURCE_INTEGRATION = `${CAMEL_APIGROUP}/integration`;\nexport const FLAG_KNATIVE_EVENTING_BROKER = 'FLAG_KNATIVE_EVENTING_BROKER';\nexport const FLAG_KNATIVE_EVENTING_CHANNEL = 'FLAG_KNATIVE_EVENTING_CHANNEL';\nexport const FLAG_CAMEL_KAMELETS = 'FLAG_CAMEL_KAMELETS';\nexport const CAMEL_K_PROVIDER_ANNOTATION = `${CAMEL_APIGROUP}/provider`;\nexport const CAMEL_K_TYPE_LABEL = `${CAMEL_APIGROUP}/kamelet.type`;\nexport const KNATIVE_AUTOSCALING_APIGROUP = 'autoscaling.knative.dev';\nexport const KNATIVE_MINSCALE_ANNOTATION = `${KNATIVE_AUTOSCALING_APIGROUP}/min-scale`;\nexport const KNATIVE_MAXSCALE_ANNOTATION = `${KNATIVE_AUTOSCALING_APIGROUP}/max-scale`;\nexport const KNATIVE_CONCURRENCYTARGET_ANNOTATION = `${KNATIVE_AUTOSCALING_APIGROUP}/target`;\nexport const KNATIVE_CONCURRENCYUTILIZATION_ANNOTATION = `${KNATIVE_AUTOSCALING_APIGROUP}/target-utilization-percentage`;\nexport const KNATIVE_AUTOSCALEWINDOW_ANNOTATION = `${KNATIVE_AUTOSCALING_APIGROUP}/window`;\nexport const SERVERLESS_FUNCTION_LABEL_DEPRECATED = 'boson.dev/function'; // TODO: remove deprecated label for serverless function\nexport const SERVERLESS_FUNCTION_LABEL = 'function.knative.dev';\nexport const GLOBAL_OPERATOR_NS = 'openshift-operators';\nexport const CAMEL_K_OPERATOR_NS = 'camel-k-operator';\nexport const EVENTING_KAFKA_CHANNEL_KIND = 'KafkaChannel';\nexport const EVENTING_CHANNEL_KIND = 'Channel';\nexport const EVENTING_IMC_KIND = 'InMemoryChannel';\nexport const EVENT_SOURCE_SINK_BINDING_KIND = 'SinkBinding';\nexport const EVENT_SOURCE_KAFKA_KIND = 'KafkaSource';\nexport const EVENT_SOURCE_CAMEL_KIND = 'CamelSource';\nexport const EVENT_SOURCE_API_SERVER_KIND = 'ApiServerSource';\nexport const EVENT_SOURCE_CONTAINER_KIND = 'ContainerSource';\nexport const EVENT_SOURCE_PING_KIND = 'PingSource';\nexport const EVENT_SOURCE_CRONJOB_KIND = 'CronJobSource';\nexport const EVENT_SINK_KAFKA_KIND = 'KafkaSink';\nexport const FLAG_KNATIVE_EVENT_SOURCE_CATALOG_TYPE = 'KNATIVE_EVENT_SOURCE_CATALOG_TYPE';\nexport const FLAG_KNATIVE_EVENT_SINK_CATALOG_TYPE = 'KNATIVE_EVENT_SINK_CATALOG_TYPE';\nexport const EVENT_SOURCE_CATALOG_TYPE_ID = 'EventSource';\nexport const EVENT_SINK_CATALOG_TYPE_ID = 'EventSink';\nexport const FLAG_EVENT_SOURCE_PING = 'FLAG_EVENT_SOURCE_PING';\nexport const FLAG_KNATIVE_EVENTING_ENABLED = 'FLAG_KNATIVE_EVENTING_ENABLED';\nexport const EVENT_SOURCE_ACTION_ID = 'knative-event-source';\nexport const EVENT_SINK_ACTION_ID = 'knative-event-sink';\nexport const EVENTING_CHANNEL_ACTION_ID = 'knative-eventing-channel';\nexport const EVENTING_BROKER_ACTION_ID = 'knative-eventing-broker';\nexport const FUNCTIONS_GETTING_STARTED_SECTION_USER_SETTING_KEY = 'functions.gettingStartedSection';\n","export const getFieldId = (fieldName: string, fieldType: string) => {\n return `form-${fieldType}-${fieldName?.replace(/\\./g, '-')}-field`;\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { Link } from 'react-router-dom-v5-compat';\nimport * as classNames from 'classnames';\n\nimport { FLAGS } from '@console/shared/src/constants';\nimport { ResourceLinkProps } from '@console/dynamic-plugin-sdk';\nimport { ResourceIcon } from './resource-icon';\nimport { K8sModel } from '@console/dynamic-plugin-sdk/src/api/common-types';\nimport { K8sResourceKindReference } from '@console/dynamic-plugin-sdk/src/extensions/console-types';\nimport { K8sResourceKind } from '../../module/k8s/types';\nimport { modelFor } from '../../module/k8s/k8s-models';\nimport { referenceForModel } from '../../module/k8s/k8s-ref';\nimport { connectToFlags } from '../../reducers/connectToFlags';\nimport { FlagsObject } from '../../reducers/features';\nimport { getReference } from '@console/dynamic-plugin-sdk/src/utils/k8s/k8s-ref';\n\nconst unknownKinds = new Set();\n\nexport const resourcePathFromModel = (model: K8sModel, name?: string, namespace?: string) => {\n const { plural, namespaced, crd } = model;\n\n let url = '/k8s/';\n\n if (!namespaced) {\n url += 'cluster/';\n }\n\n if (namespaced) {\n url += namespace ? `ns/${namespace}/` : 'all-namespaces/';\n }\n\n if (crd) {\n url += referenceForModel(model);\n } else if (plural) {\n url += plural;\n }\n\n if (name) {\n // Some resources have a name that needs to be encoded. For instance,\n // Users can have special characters in the name like `#`.\n url += `/${encodeURIComponent(name)}`;\n }\n\n return url;\n};\n\nexport const resourceListPathFromModel = (model: K8sModel, namespace?: string) =>\n resourcePathFromModel(model, null, namespace);\n\n/**\n * NOTE: This will not work for runtime-defined resources. Use a `connect`-ed component like `ResourceLink` instead.\n */\nexport const resourcePath = (kind: K8sResourceKindReference, name?: string, namespace?: string) => {\n const model = modelFor(kind);\n if (!model) {\n if (!unknownKinds.has(kind)) {\n unknownKinds.add(kind);\n // eslint-disable-next-line no-console\n console.error(`resourcePath: no model for \"${kind}\"`);\n }\n return;\n }\n\n return resourcePathFromModel(model, name, namespace);\n};\n\nexport const resourceObjPath = (obj: K8sResourceKind, kind: K8sResourceKindReference) =>\n resourcePath(kind, _.get(obj, 'metadata.name'), _.get(obj, 'metadata.namespace'));\n\nexport const ResourceLink: React.FC<ResourceLinkProps> = ({\n className,\n displayName,\n inline = false,\n kind,\n groupVersionKind,\n linkTo = true,\n name,\n nameSuffix,\n namespace,\n hideIcon,\n title,\n children,\n dataTest,\n onClick,\n truncate,\n}) => {\n if (!kind && !groupVersionKind) {\n return null;\n }\n const kindReference = groupVersionKind ? getReference(groupVersionKind) : kind;\n const path = linkTo ? resourcePath(kindReference, name, namespace) : undefined;\n const value = displayName ? displayName : name;\n const classes = classNames('co-resource-item', className, {\n 'co-resource-item--inline': inline,\n 'co-resource-item--truncate': truncate,\n });\n\n return (\n <span className={classes}>\n {!hideIcon && <ResourceIcon kind={kindReference} />}\n {path ? (\n <Link\n to={path}\n title={title}\n className=\"co-resource-item__resource-name\"\n data-test-id={value}\n data-test={dataTest ?? value}\n onClick={onClick}\n >\n {value}\n {nameSuffix}\n </Link>\n ) : (\n <span\n className=\"co-resource-item__resource-name\"\n data-test-id={value}\n data-test={dataTest ?? value}\n >\n {value}\n {nameSuffix}\n </span>\n )}\n {children}\n </span>\n );\n};\n\nconst NodeLink_: React.FC<NodeLinkProps> = (props) => {\n const { name, flags } = props;\n if (!name) {\n return <>-</>;\n }\n return flags[FLAGS.CAN_LIST_NODE] ? (\n <ResourceLink kind=\"Node\" name={name} title={name} />\n ) : (\n <span className=\"co-break-word\">{name}</span>\n );\n};\n\nexport const NodeLink = connectToFlags<NodeLinkProps>(FLAGS.CAN_LIST_NODE)(NodeLink_);\n\ntype NodeLinkProps = {\n name: string;\n flags: FlagsObject;\n};\n\nResourceLink.displayName = 'ResourceLink';\n","export * from './icons';\nexport * from './statuses';\nexport * from './Status';\n\nexport { default as SecondaryStatus } from './SecondaryStatus';\nexport { default as LinkStatus } from './LinkStatus';\nexport { default as NodeUnschedulableStatus } from './NodeUnschedulableStatus';\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport * as classNames from 'classnames';\nimport { Alert, Button } from '@patternfly/react-core';\nimport { useTranslation, Trans } from 'react-i18next';\nimport {\n IncompleteDataError,\n TimeoutError,\n} from '@console/dynamic-plugin-sdk/src/utils/error/http-error';\nimport * as restrictedSignImg from '../../imgs/restricted-sign.svg';\nimport { getLastLanguage } from '@console/app/src/components/user-preferences/language/getLastLanguage';\n\nexport const Box: React.FC<BoxProps> = ({ children, className }) => (\n <div className={classNames('cos-status-box', className)}>{children}</div>\n);\n\nexport const LoadError: React.FC<LoadErrorProps> = ({\n label,\n className,\n message,\n canRetry = true,\n}) => {\n const { t } = useTranslation();\n return (\n <Box className={className}>\n <div className=\"pf-v5-u-text-align-center cos-error-title\">\n {_.isString(message)\n ? t('public~Error Loading {{label}}: {{message}}', {\n label,\n message,\n })\n : t('public~Error Loading {{label}}', { label })}\n </div>\n {canRetry && (\n <div className=\"pf-v5-u-text-align-center\">\n <Trans ns=\"public\">\n Please{' '}\n <Button\n type=\"button\"\n onClick={window.location.reload.bind(window.location)}\n variant=\"link\"\n isInline\n >\n try again\n </Button>\n .\n </Trans>\n </div>\n )}\n </Box>\n );\n};\nLoadError.displayName = 'LoadError';\n\nexport const Loading: React.FC<LoadingProps> = ({ className }) => (\n <div\n className={classNames('co-m-loader co-an-fade-in-out', className)}\n data-test=\"loading-indicator\"\n >\n <div className=\"co-m-loader-dot__one\" />\n <div className=\"co-m-loader-dot__two\" />\n <div className=\"co-m-loader-dot__three\" />\n </div>\n);\nLoading.displayName = 'Loading';\n\nexport const LoadingInline: React.FC<{}> = () => <Loading className=\"co-m-loader--inline\" />;\nLoadingInline.displayName = 'LoadingInline';\n\nexport const LoadingBox: React.FC<LoadingBoxProps> = ({ className, message }) => (\n <Box className={classNames('cos-status-box--loading', className)}>\n <Loading />\n {message && <div className=\"cos-status-box__loading-message\">{message}</div>}\n </Box>\n);\nLoadingBox.displayName = 'LoadingBox';\n\nexport const EmptyBox: React.FC<EmptyBoxProps> = ({ label }) => {\n const { t } = useTranslation();\n return (\n <Box>\n <div data-test=\"empty-message\" className=\"pf-v5-u-text-align-center\">\n {label ? t('public~No {{label}} found', { label }) : t('public~Not found')}\n </div>\n </Box>\n );\n};\nEmptyBox.displayName = 'EmptyBox';\n\nexport const MsgBox: React.FC<MsgBoxProps> = ({ title, detail, className = '' }) => (\n <Box className={className}>\n {title && (\n <div className=\"cos-status-box__title\" data-test=\"msg-box-title\">\n {title}\n </div>\n )}\n {detail && (\n <div className=\"pf-v5-u-text-align-center cos-status-box__detail\" data-test=\"msg-box-detail\">\n {detail}\n </div>\n )}\n </Box>\n);\nMsgBox.displayName = 'MsgBox';\n\nexport const AccessDenied: React.FC<AccessDeniedProps> = ({ message }) => {\n const { t } = useTranslation();\n return (\n <div>\n <Box className=\"pf-v5-u-text-align-center\">\n <img className=\"cos-status-box__access-denied-icon\" src={restrictedSignImg} />\n <MsgBox\n title={t('public~Restricted Access')}\n detail={t(\"public~You don't have access to this section due to cluster policy.\")}\n />\n </Box>\n {_.isString(message) && (\n <Alert isInline className=\"co-alert\" variant=\"danger\" title={t('public~Error details')}>\n {message}\n </Alert>\n )}\n </div>\n );\n};\nAccessDenied.displayName = 'AccessDenied';\n\nconst Data: React.FC<DataProps> = ({\n NoDataEmptyMsg,\n EmptyMsg,\n label,\n data,\n unfilteredData,\n children,\n}) => {\n if (NoDataEmptyMsg && _.isEmpty(unfilteredData)) {\n return (\n <div className=\"loading-box loading-box__loaded\">\n {NoDataEmptyMsg ? <NoDataEmptyMsg /> : <EmptyBox label={label} />}\n </div>\n );\n }\n\n if (!data || _.isEmpty(data)) {\n return (\n <div className=\"loading-box loading-box__loaded\">\n {EmptyMsg ? <EmptyMsg /> : <EmptyBox label={label} />}\n </div>\n );\n }\n return <div className=\"loading-box loading-box__loaded\">{children}</div>;\n};\nData.displayName = 'Data';\n\nexport const StatusBox: React.FC<StatusBoxProps> = (props) => {\n const { loadError, loaded, skeleton, data, ...dataProps } = props;\n const { t } = useTranslation();\n\n if (loadError) {\n const status = _.get(loadError, 'response.status');\n if (status === 404) {\n return (\n <div className=\"co-m-pane__body\">\n <h1 className=\"co-m-pane__heading co-m-pane__heading--center\">\n {t('public~404: Not Found')}\n </h1>\n </div>\n );\n }\n if (status === 403) {\n return <AccessDenied message={loadError.message} />;\n }\n\n if (loadError instanceof IncompleteDataError && !_.isEmpty(data)) {\n return (\n <Data data={data} {...dataProps}>\n <Alert\n variant=\"info\"\n isInline\n title={t(\n 'public~{{labels}} content is not available in the catalog at this time due to loading failures.',\n {\n labels: new Intl.ListFormat(getLastLanguage() || 'en', {\n style: 'long',\n type: 'conjunction',\n }).format(loadError.labels),\n },\n )}\n />\n {props.children}\n </Data>\n );\n }\n\n if (loaded && loadError instanceof TimeoutError) {\n return (\n <Data data={data} {...dataProps}>\n <div className=\"co-m-timeout-error text-muted\">\n {t('public~Timed out fetching new data. The data below is stale.')}\n </div>\n {props.children}\n </Data>\n );\n }\n\n return (\n <LoadError\n message={loadError.message}\n label={props.label}\n className=\"loading-box loading-box__errored\"\n />\n );\n }\n\n if (!loaded) {\n return skeleton ? <>{skeleton}</> : <LoadingBox className=\"loading-box loading-box__loading\" />;\n }\n return <Data data={data} {...dataProps} />;\n};\nStatusBox.displayName = 'StatusBox';\n\ntype BoxProps = {\n children: React.ReactNode;\n className?: string;\n};\n\ntype LoadErrorProps = {\n label: string;\n className?: string;\n message?: string;\n canRetry?: boolean;\n};\n\ntype LoadingProps = {\n className?: string;\n};\n\ntype LoadingBoxProps = {\n className?: string;\n message?: string;\n};\n\ntype EmptyBoxProps = {\n label?: string;\n};\n\ntype MsgBoxProps = {\n title?: string;\n detail?: React.ReactNode;\n className?: string;\n};\n\ntype AccessDeniedProps = {\n message?: string;\n};\n\ntype DataProps = {\n NoDataEmptyMsg?: React.ComponentType;\n EmptyMsg?: React.ComponentType;\n label?: string;\n unfilteredData?: any;\n data?: any;\n children?: React.ReactNode;\n};\n\ntype StatusBoxProps = {\n label?: string;\n loadError?: any;\n loaded?: boolean;\n data?: any;\n unfilteredData?: any;\n skeleton?: React.ReactNode;\n NoDataEmptyMsg?: React.ComponentType;\n EmptyMsg?: React.ComponentType;\n children?: React.ReactNode;\n};\n","import { coFetchJSON, coFetch } from '@console/internal/co-fetch';\nimport { K8sResourceKind, k8sPatch, k8sGet, K8sKind, EnvVar } from '@console/internal/module/k8s';\nimport { getRandomChars } from '@console/shared';\nimport { v1alpha1WorkspaceModel, WorkspaceModel } from '../../../models';\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype v1alpha1Component = {\n plugin: {\n name?: string;\n id: string;\n };\n};\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype v1alpha2Component = {\n name: string;\n plugin: {\n kubernetes: {\n name: string;\n namespace?: string;\n };\n };\n};\n\ntype DevWorkspaceTemplateSpec = {\n components: v1alpha1Component[] | v1alpha2Component[];\n};\n\nexport type CloudShellResource = K8sResourceKind & {\n status?: v1alpha1CloudShellStatusResource | v1alpha2CloudShellStatusResource;\n spec?: {\n started?: boolean;\n routingClass?: string;\n template?: DevWorkspaceTemplateSpec;\n };\n};\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype v1alpha1CloudShellStatusResource = {\n phase: string;\n ideUrl: string;\n};\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype v1alpha2CloudShellStatusResource = {\n phase: string;\n mainUrl: string;\n};\n\ntype CloudShellContainerSpec = {\n env?: EnvVar[];\n image?: string;\n};\n\nexport type CloudShellComponent = {\n name: string;\n container: CloudShellContainerSpec;\n};\n\nexport type TerminalInitData = { pod: string; container: string; cmd: string[] };\n\nexport const CLOUD_SHELL_LABEL = 'console.openshift.io/terminal';\nexport const CLOUD_SHELL_CREATOR_LABEL = 'controller.devfile.io/creator';\nexport const CLOUD_SHELL_RESTRICTED_ANNOTATION = 'controller.devfile.io/restricted-access';\nexport const CLOUD_SHELL_STOPPED_BY_ANNOTATION = 'controller.devfile.io/stopped-by';\nexport const CLOUD_SHELL_SOURCE_ANNOTATION = 'controller.devfile.io/devworkspace-source';\nexport const CLOUD_SHELL_PROTECTED_NAMESPACE = 'openshift-terminal';\n\nexport const createCloudShellResourceName = () => `terminal-${getRandomChars(6)}`;\n\nexport enum CLOUD_SHELL_PHASE {\n STARTING = 'Starting',\n FAILED = 'Failed',\n RUNNING = 'Running',\n}\n\nconst v1alpha1DevworkspaceComponent = [\n {\n plugin: {\n name: 'web-terminal',\n id: 'redhat-developer/web-terminal/latest',\n },\n },\n];\n\nconst devWorkspaceComponent = (namespace: string, timeout?: string, image?: string) => [\n {\n name: 'web-terminal-tooling',\n plugin: {\n kubernetes: {\n name: 'web-terminal-tooling',\n namespace,\n },\n ...(image && {\n components: [\n {\n name: 'web-terminal-tooling',\n container: {\n image,\n },\n },\n ],\n }),\n },\n },\n {\n name: 'web-terminal-exec',\n plugin: {\n kubernetes: {\n name: 'web-terminal-exec',\n namespace,\n },\n ...(timeout && {\n components: [\n {\n name: 'web-terminal-exec',\n container: {\n env: [{ name: 'WEB_TERMINAL_IDLE_TIMEOUT', value: timeout }],\n },\n },\n ],\n }),\n },\n },\n];\n\nexport const newCloudShellWorkSpace = (\n name: string,\n workspaceNamespace: string,\n operatorNamespace: string,\n version: string,\n timeout?: string,\n image?: string,\n): CloudShellResource => ({\n apiVersion: `workspace.devfile.io/${version}`,\n kind: 'DevWorkspace',\n metadata: {\n name,\n namespace: workspaceNamespace,\n labels: {\n [CLOUD_SHELL_LABEL]: 'true',\n },\n annotations: {\n [CLOUD_SHELL_RESTRICTED_ANNOTATION]: 'true',\n [CLOUD_SHELL_SOURCE_ANNOTATION]: 'web-terminal',\n },\n },\n spec: {\n started: true,\n routingClass: 'web-terminal',\n template: {\n components:\n version === v1alpha1WorkspaceModel.apiVersion\n ? v1alpha1DevworkspaceComponent\n : devWorkspaceComponent(operatorNamespace, timeout, image),\n },\n },\n});\n\nexport const startWorkspace = (workspace: CloudShellResource) => {\n // Check the version so we know what workspace model to use for starting the workspace\n const groupVersion = workspace.apiVersion.split('/');\n const version = groupVersion[1];\n\n const workspaceModel =\n version === v1alpha1WorkspaceModel.apiVersion ? v1alpha1WorkspaceModel : WorkspaceModel;\n\n return k8sPatch(workspaceModel, workspace, [\n {\n path: '/spec/started',\n op: 'replace',\n value: true,\n },\n ]);\n};\n\nexport const initTerminal = (\n username: string,\n workspaceName: string,\n workspaceNamespace: string,\n): Promise<TerminalInitData> => {\n const url = `/api/terminal/proxy/${workspaceNamespace}/${workspaceName}/exec/init`;\n const payload = {\n kubeconfig: {\n username,\n namespace: workspaceNamespace,\n },\n };\n return coFetchJSON.post(url, payload);\n};\n\nexport const sendActivityTick = (workspaceName: string, namespace: string): void => {\n coFetch(`/api/terminal/proxy/${namespace}/${workspaceName}/activity/tick`, {\n method: 'POST',\n }).catch((e) =>\n // eslint-disable-next-line no-console\n console.error(e),\n );\n};\n\nexport const checkTerminalAvailable = () => coFetch('/api/terminal/available');\n\nexport const getCloudShellCR = (workspaceModel: K8sKind, name: string, ns: string) => {\n return k8sGet(workspaceModel, name, ns);\n};\n\nexport const getTerminalInstalledNamespace = () => coFetch('/api/terminal/installedNamespace');\n","import {\n K8sResourceCommon,\n K8sResourceCondition,\n K8sResourceKind,\n ObjectReference,\n Selector,\n} from '@console/internal/module/k8s';\nimport { Descriptor } from './components/descriptors/types';\n\nexport enum AppCatalog {\n rhOperators = 'rh-operators',\n}\n\nexport enum ClusterServiceVersionPhase {\n CSVPhaseNone = '',\n CSVPhasePending = 'Pending',\n CSVPhaseInstallReady = 'InstallReady',\n CSVPhaseInstalling = 'Installing',\n CSVPhaseSucceeded = 'Succeeded',\n CSVPhaseFailed = 'Failed',\n CSVPhaseUnknown = 'Unknown',\n CSVPhaseReplacing = 'Replacing',\n CSVPhaseDeleting = 'Deleting',\n}\n\nexport enum CSVConditionReason {\n CSVReasonRequirementsUnknown = 'RequirementsUnknown',\n CSVReasonRequirementsNotMet = 'RequirementsNotMet',\n CSVReasonRequirementsMet = 'AllRequirementsMet',\n CSVReasonOwnerConflict = 'OwnerConflict',\n CSVReasonComponentFailed = 'InstallComponentFailed',\n CSVReasonInvalidStrategy = 'InvalidInstallStrategy',\n CSVReasonWaiting = 'InstallWaiting',\n CSVReasonInstallSuccessful = 'InstallSucceeded',\n CSVReasonInstallCheckFailed = 'InstallCheckFailed',\n CSVReasonComponentUnhealthy = 'ComponentUnhealthy',\n CSVReasonBeingReplaced = 'BeingReplaced',\n CSVReasonReplaced = 'Replaced',\n CSVReasonCopied = 'Copied',\n}\n\nexport enum InstallPlanApproval {\n Automatic = 'Automatic',\n Manual = 'Manual',\n}\n\nexport enum InstallModeType {\n InstallModeTypeOwnNamespace = 'OwnNamespace',\n InstallModeTypeSingleNamespace = 'SingleNamespace',\n InstallModeTypeMultiNamespace = 'MultiNamespace',\n InstallModeTypeAllNamespaces = 'AllNamespaces',\n}\n\nexport enum SubscriptionState {\n SubscriptionStateNone = '',\n SubscriptionStateFailed = 'UpgradeFailed',\n SubscriptionStateUpgradeAvailable = 'UpgradeAvailable',\n SubscriptionStateUpgradePending = 'UpgradePending',\n SubscriptionStateAtLatest = 'AtLatestKnown',\n}\n\nexport enum ClusterServiceVersionStatus {\n Failed = 'Failed',\n OK = 'OK',\n Pending = 'Pending',\n Unknown = 'Unknown',\n}\n\nexport type CRDDescription = {\n name: string;\n version: string;\n kind: string;\n displayName: string;\n description?: string;\n specDescriptors?: Descriptor[];\n statusDescriptors?: Descriptor[];\n resources?: {\n name?: string;\n version: string;\n kind: string;\n }[];\n};\n\nexport type APIServiceDefinition = {\n name: string;\n group: string;\n version: string;\n kind: string;\n deploymentName: string;\n containerPort: number;\n displayName: string;\n description?: string;\n specDescriptors?: Descriptor[];\n statusDescriptors?: Descriptor[];\n resources?: {\n name?: string;\n version: string;\n kind: string;\n }[];\n};\n\nexport type ProvidedAPI = CRDDescription | APIServiceDefinition;\n\nexport type RequirementStatus = {\n group: string;\n version: string;\n kind: string;\n name: string;\n status: string;\n uuid?: string;\n};\n\nexport type ClusterServiceVersionIcon = { base64data: string; mediatype: string };\n\nexport type ClusterServiceVersionKind = {\n apiVersion: 'operators.coreos.com/v1alpha1';\n kind: 'ClusterServiceVersion';\n spec: {\n install: {\n strategy: 'Deployment';\n spec?: {\n permissions: {\n serviceAccountName: string;\n rules: { apiGroups: string[]; resources: string[]; verbs: string[] }[];\n }[];\n deployments: { name: string; spec: any }[];\n };\n };\n customresourcedefinitions?: { owned?: CRDDescription[]; required?: CRDDescription[] };\n apiservicedefinitions?: { owned?: APIServiceDefinition[]; required?: APIServiceDefinition[] };\n replaces?: string;\n installModes?: { type: InstallModeType; supported: boolean }[];\n displayName?: string;\n description?: string;\n provider?: { name: string };\n version?: string;\n icon?: ClusterServiceVersionIcon[];\n };\n status?: {\n phase: ClusterServiceVersionPhase;\n reason: CSVConditionReason;\n message?: string;\n requirementStatus?: RequirementStatus[];\n };\n} & K8sResourceKind;\n\nexport type StepResource = {\n group: string;\n version: string;\n kind: string;\n name: string;\n manifest?: string;\n sourceName?: string;\n sourceNamespace?: string;\n};\n\nexport type Step = {\n resolving: string;\n resource: StepResource;\n status: 'Unknown' | 'NotPresent' | 'Present' | 'Created';\n};\n\nexport enum InstallPlanPhase {\n InstallPlanPhaseNone = '',\n InstallPlanPhasePlanning = 'Planning',\n InstallPlanPhaseRequiresApproval = 'RequiresApproval',\n InstallPlanPhaseInstalling = 'Installing',\n InstallPlanPhaseComplete = 'Complete',\n InstallPlanPhaseFailed = 'Failed',\n}\n\nexport type InstallPlanKind = {\n spec: {\n clusterServiceVersionNames: string[];\n approval: InstallPlanApproval;\n approved?: boolean;\n };\n status?: {\n phase: InstallPlanPhase;\n catalogSources: string[];\n plan: Step[];\n conditions?: K8sResourceCondition[];\n };\n} & K8sResourceCommon;\n\nexport type Env = {\n name: string;\n value: string;\n};\n\nexport type SubscriptionKind = {\n apiVersion: 'operators.coreos.com/v1alpha1';\n kind: 'Subscription';\n spec: {\n source: string;\n name: string;\n channel?: string;\n startingCSV?: string;\n sourceNamespace?: string;\n installPlanApproval?: InstallPlanApproval;\n config?: {\n env?: Env[];\n };\n };\n status?: {\n catalogHealth?: {\n catalogSourceRef?: ObjectReference;\n healthy?: boolean;\n lastUpdated?: string;\n }[];\n conditions?: K8sResourceCondition[];\n installedCSV?: string;\n installPlanRef?: ObjectReference;\n state?: SubscriptionState;\n lastUpdated?: string;\n currentCSV?: string;\n };\n} & K8sResourceCommon;\n\nexport type CatalogSourceKind = {\n apiVersion: 'operators.coreos.com/v1alpha1';\n kind: 'CatalogSource';\n spec: {\n name: string;\n sourceType: 'internal' | 'grpc' | 'configMap';\n configMap?: string;\n secrets?: string[];\n displayName?: string;\n description?: string;\n publisher?: string;\n icon?: { mediatype: string; data: string };\n updateStrategy?: { registryPoll: { interval: string } };\n };\n} & K8sResourceKind;\n\nexport type PackageManifestKind = {\n apiVersion: 'packages.operators.coreos.com/v1';\n kind: 'PackageManifest';\n spec: {};\n status: {\n catalogSource: string;\n catalogSourceNamespace: string;\n catalogSourceDisplayName: string;\n catalogSourcePublisher: string;\n provider: {\n name: string;\n };\n packageName: string;\n deprecation?: { message: string };\n channels: {\n name: string;\n currentCSV: string;\n deprecation?: { message: string };\n currentCSVDesc: {\n annotations?: any;\n description?: string;\n displayName: string;\n icon: { mediatype: string; base64data: string }[];\n keywords?: string[];\n version: string;\n provider: {\n name: string;\n };\n installModes: { type: InstallModeType; supported: boolean }[];\n customresourcedefinitions?: { owned?: CRDDescription[]; required?: CRDDescription[] };\n apiservicedefinitions?: {\n owned?: APIServiceDefinition[];\n required?: APIServiceDefinition[];\n };\n };\n entries?: {\n name: string;\n version: string;\n deprecation?: { message: string };\n }[];\n }[];\n defaultChannel: string;\n };\n} & K8sResourceKind;\n\nexport type OperatorGroupKind = {\n apiVersion: 'operators.coreos.com/v1';\n kind: 'OperatorGroup';\n spec?: {\n selector?: Selector;\n targetNamespaces?: string[];\n serviceAccount?: K8sResourceKind;\n };\n status?: {\n namespaces?: string[];\n lastUpdated: string;\n };\n} & K8sResourceKind;\n\nexport type DeprecatedOperatorWarning = {\n deprecation?: {\n message?: string;\n };\n};\n","import {\n CatalogItem,\n CatalogItemAttribute,\n CatalogItemType,\n} from '@console/dynamic-plugin-sdk/src/extensions';\nimport { ResolvedExtension } from '@console/dynamic-plugin-sdk/src/types';\n\nexport enum CatalogQueryParams {\n TYPE = 'catalogType',\n CATEGORY = 'category',\n KEYWORD = 'keyword',\n SORT_ORDER = 'sortOrder',\n GROUPING = 'grouping',\n SELECTED_ID = 'selectedId',\n}\n\nexport enum CatalogSortOrder {\n ASC = 'asc',\n DESC = 'desc',\n}\n\nexport type CatalogFilterItem = {\n label?: string;\n value: string;\n active: boolean;\n};\n\nexport type CatalogFilter = { [key: string]: CatalogFilterItem };\n\nexport type CatalogFilters = Record<string, CatalogFilter>;\n\nexport type CatalogFilterCounts = Record<string, { [key: string]: number }>;\n\nexport type CatalogTypeCounts = Record<string, number>;\n\nexport type CatalogStringMap = Record<string, string>;\n\nexport type CatalogFilterGroupMap = { [key: string]: CatalogItemAttribute };\n\nexport type CatalogType = {\n label: string;\n value: string;\n description: string;\n};\n\nexport type CatalogCategory = {\n id: string;\n label: string;\n tags?: string[];\n subcategories?: CatalogSubcategory[];\n};\n\nexport type CatalogSubcategory = {\n id: string;\n label: string;\n tags?: string[];\n};\n\nexport type CatalogService = {\n type: string;\n items: CatalogItem[];\n itemsMap: { [type: string]: CatalogItem[] };\n loaded: boolean;\n loadError: any;\n searchCatalog: (query: string) => CatalogItem[];\n catalogExtensions: ResolvedExtension<CatalogItemType>[];\n};\n","import * as React from 'react';\nimport { QuickStartContextValues } from '@patternfly/quickstarts';\nimport { ButtonProps } from '@patternfly/react-core';\nimport { ICell, OnSelect, SortByDirection, TableGridBreakpoint } from '@patternfly/react-table';\nimport { LocationDescriptor } from 'history';\nimport MonacoEditor from 'react-monaco-editor/lib/editor';\nimport {\n ExtensionK8sGroupKindModel,\n K8sModel,\n MatchLabels,\n PrometheusEndpoint,\n PrometheusLabels,\n PrometheusValue,\n ResolvedExtension,\n Selector,\n} from '../api/common-types';\nimport { Extension, ExtensionTypeGuard } from '../types';\nimport { CustomDataSource } from './dashboard-data-source';\n\nexport type OwnerReference = {\n name: string;\n kind: string;\n uid: string;\n apiVersion: string;\n controller?: boolean;\n blockOwnerDeletion?: boolean;\n};\n\nexport type ObjectReference = {\n kind?: string;\n namespace?: string;\n name?: string;\n uid?: string;\n apiVersion?: string;\n resourceVersion?: string;\n fieldPath?: string;\n};\n\nexport type ObjectMetadata = {\n annotations?: { [key: string]: string };\n clusterName?: string;\n creationTimestamp?: string;\n deletionGracePeriodSeconds?: number;\n deletionTimestamp?: string;\n finalizers?: string[];\n generateName?: string;\n generation?: number;\n labels?: { [key: string]: string };\n managedFields?: any[];\n name?: string;\n namespace?: string;\n ownerReferences?: OwnerReference[];\n resourceVersion?: string;\n uid?: string;\n};\n\n// Properties common to (almost) all Kubernetes resources.\nexport type K8sResourceCommon = {\n apiVersion?: string;\n kind?: string;\n metadata?: ObjectMetadata;\n};\n\nexport type K8sResourceKind = K8sResourceCommon & {\n spec?: {\n selector?: Selector | MatchLabels;\n [key: string]: any;\n };\n status?: { [key: string]: any };\n data?: { [key: string]: any };\n};\n\nexport type K8sVerb =\n | 'create'\n | 'get'\n | 'list'\n | 'update'\n | 'patch'\n | 'delete'\n | 'deletecollection'\n | 'watch'\n | 'impersonate';\n\nexport type AccessReviewResourceAttributes = {\n group?: string;\n resource?: string;\n subresource?: string;\n verb?: K8sVerb;\n name?: string;\n namespace?: string;\n};\n\n/**\n * @deprecated Use K8sGroupVersionKind type instead. Support for type K8sResourceKindReference will be removed in a future release.\n * @see K8sGroupVersionKind\n * GroupVersionKind unambiguously identifies a kind.\n * https://godoc.org/k8s.io/apimachinery/pkg/runtime/schema#GroupVersionKind\n * TODO: Change this to a regex-type if it ever becomes a thing (https://github.com/Microsoft/TypeScript/issues/6579)\n */\nexport type GroupVersionKind = string;\n\n/**\n * The canonical, unique identifier for a Kubernetes resource type.\n * Maintains backwards-compatibility with references using the `kind` string field.\n */\nexport type K8sResourceKindReference = string;\n\nexport type K8sGroupVersionKind = { group?: string; version: string; kind: string };\n\nenum InventoryStatusGroup {\n WARN = 'WARN',\n ERROR = 'ERROR',\n PROGRESS = 'PROGRESS',\n NOT_MAPPED = 'NOT_MAPPED',\n UNKNOWN = 'UNKNOWN',\n}\n\ntype StatusGroup = {\n [key in InventoryStatusGroup | string]: {\n filterType?: string;\n statusIDs: string[];\n count: number;\n };\n};\n\nexport type StatusGroupMapper<\n T extends K8sResourceCommon = K8sResourceCommon,\n R extends { [key: string]: K8sResourceCommon[] } = { [key: string]: K8sResourceCommon[] }\n> = (resources: T[], additionalResources?: R) => StatusGroup;\n\nexport enum HealthState {\n OK = 'OK',\n ERROR = 'ERROR',\n WARNING = 'WARNING',\n LOADING = 'LOADING',\n UNKNOWN = 'UNKNOWN',\n UPDATING = 'UPDATING',\n PROGRESS = 'PROGRESS',\n UPGRADABLE = 'UPGRADABLE',\n NOT_AVAILABLE = 'NOT_AVAILABLE',\n}\n\n// Only covers range and instant vector responses for now.\nexport type PrometheusResult = {\n metric: PrometheusLabels;\n values?: PrometheusValue[];\n value?: PrometheusValue;\n};\n\nexport type PrometheusData = {\n resultType: 'matrix' | 'vector' | 'scalar' | 'string';\n result: PrometheusResult[];\n};\n\nexport type PrometheusResponse = {\n status: string;\n data: PrometheusData;\n errorType?: string;\n error?: string;\n warnings?: string[];\n};\n\nexport type PrometheusPollProps = {\n /** Delay between polling requests */\n delay?: number;\n /** One of the well-defined Prometheus API endpoints */\n endpoint: PrometheusEndpoint;\n namespace?: string;\n /** Prometheus query, polling is skipped when empty or undefined */\n query?: string;\n /** A search parameter */\n timeout?: string;\n /** A vector-query search parameter */\n endTime?: number;\n /** A vector-query search parameter */\n samples?: number;\n /** A vector-query search parameter */\n timespan?: number;\n /** An object used to facilitate fetching from different data sources. */\n customDataSource?: CustomDataSource;\n};\n\nexport type UsePrometheusPoll = (\n props: PrometheusPollProps,\n) => [PrometheusResponse | undefined, boolean, unknown];\n\nexport type WatchK8sResource = {\n /** @deprecated Use groupVersionKind instead. The kind property will be removed in a future release. */\n kind?: K8sResourceKindReference;\n groupVersionKind?: K8sGroupVersionKind;\n name?: string;\n namespace?: string;\n isList?: boolean;\n selector?: Selector;\n namespaced?: boolean;\n limit?: number;\n fieldSelector?: string;\n optional?: boolean;\n partialMetadata?: boolean;\n};\n\nexport type ResourcesObject = { [key: string]: K8sResourceCommon | K8sResourceCommon[] };\n\nexport type WatchK8sResultsObject<R extends K8sResourceCommon | K8sResourceCommon[]> = {\n data: R;\n loaded: boolean;\n loadError: any;\n};\n\nexport type WatchK8sResults<R extends ResourcesObject> = {\n [k in keyof R]: WatchK8sResultsObject<R[k]>;\n};\n\nexport type WatchK8sResources<R extends ResourcesObject> = {\n [k in keyof R]: WatchK8sResource;\n};\n\nexport type WatchK8sResourcesGeneric = {\n [key: string]: {\n model?: ExtensionK8sGroupKindModel;\n opts?: Partial<WatchK8sResource>;\n };\n};\n\nexport type FirehoseResource = {\n kind: K8sResourceKindReference;\n name?: string;\n namespace?: string;\n isList?: boolean;\n selector?: Selector;\n prop: string;\n namespaced?: boolean;\n optional?: boolean;\n limit?: number;\n fieldSelector?: string;\n};\n\nexport type FirehoseResult<\n R extends K8sResourceCommon | K8sResourceCommon[] = K8sResourceCommon[]\n> = {\n loaded: boolean;\n loadError: string;\n optional?: boolean;\n data: R;\n kind?: string;\n};\n\nexport type FirehoseResourcesResult = {\n [key: string]: FirehoseResult<K8sResourceCommon | K8sResourceCommon[]>;\n};\n\nexport type WatchK8sResult<R extends K8sResourceCommon | K8sResourceCommon[]> = [R, boolean, any];\n\nexport type UseK8sWatchResource = <R extends K8sResourceCommon | K8sResourceCommon[]>(\n initResource: WatchK8sResource | null,\n) => WatchK8sResult<R>;\n\nexport type UseK8sWatchResources = <R extends ResourcesObject>(\n initResources: WatchK8sResources<R>,\n) => WatchK8sResults<R>;\n\nexport type UseResolvedExtensions = <E extends Extension>(\n ...typeGuards: ExtensionTypeGuard<E>[]\n) => [ResolvedExtension<E>[], boolean, any[]];\n\nexport type ConsoleFetch = (\n url: string,\n options?: RequestInit,\n timeout?: number,\n) => Promise<Response>;\n\nexport type ConsoleFetchJSON<T = any> = {\n (url: string, method?: string, options?: RequestInit, timeout?: number): Promise<T>;\n delete(url: string, json?: any, options?: RequestInit, timeout?: number): Promise<T>;\n post(url: string, json: any, options?: RequestInit, timeout?: number): Promise<T>;\n put(url: string, json: any, options?: RequestInit, timeout?: number): Promise<T>;\n patch(url: string, json: any, options?: RequestInit, timeout?: number): Promise<T>;\n};\n\nexport type ConsoleFetchText<T = any> = (...args: Parameters<ConsoleFetch>) => Promise<T>;\n\n/* Horizontal Nav Types */\nexport type NavPage = {\n href?: string;\n path?: string;\n name: string;\n component: React.ComponentType;\n};\n\nexport type HorizontalNavProps = {\n resource?: K8sResourceCommon;\n pages: NavPage[];\n};\n\nexport type TableColumn<D> = ICell & {\n title: string;\n id: string;\n additional?: boolean;\n sort?: ((data: D[], sortDirection: SortByDirection) => D[]) | string;\n};\n\nexport type RowProps<D, R extends any = {}> = {\n obj: D;\n rowData: R;\n activeColumnIDs: Set<string>;\n};\n\nexport type VirtualizedTableProps<D, R extends any = {}> = {\n data: D[];\n unfilteredData: D[];\n loaded: boolean;\n loadError: any;\n columns: TableColumn<D>[];\n Row: React.ComponentType<RowProps<D, R>>;\n NoDataEmptyMsg?: React.ComponentType<{}>;\n EmptyMsg?: React.ComponentType<{}>;\n scrollNode?: () => HTMLElement;\n onSelect?: OnSelect;\n label?: string;\n 'aria-label'?: string;\n gridBreakPoint?: TableGridBreakpoint;\n rowData?: R;\n mock?: boolean;\n sortColumnIndex?: number;\n sortDirection?: SortByDirection;\n};\n\nexport type VirtualizedTableFC = <D, R extends any = {}>(\n props: VirtualizedTableProps<D, R>,\n) => JSX.Element;\n\nexport type TableDataProps = {\n id: string;\n activeColumnIDs: Set<string>;\n className?: string;\n};\n\nexport type UseActiveColumns = <D = any>({\n columns,\n showNamespaceOverride,\n columnManagementID,\n}: {\n columns: TableColumn<D>[];\n showNamespaceOverride: boolean;\n columnManagementID: string;\n}) => [TableColumn<D>[], boolean];\n\nexport type ListPageHeaderProps = {\n title: string;\n helpText?: React.ReactNode;\n badge?: React.ReactNode;\n};\n\nexport type CreateWithPermissionsProps = {\n createAccessReview?: {\n groupVersionKind: K8sResourceKindReference | K8sGroupVersionKind;\n namespace?: string;\n };\n};\n\nexport type ListPageCreateProps = CreateWithPermissionsProps & {\n groupVersionKind: K8sResourceKindReference | K8sGroupVersionKind;\n};\n\nexport type ListPageCreateLinkProps = CreateWithPermissionsProps & {\n to: string;\n};\n\nexport type ListPageCreateButtonProps = CreateWithPermissionsProps & ButtonProps;\n\nexport type ListPageCreateDropdownProps = CreateWithPermissionsProps & {\n items: {\n [key: string]: React.ReactNode;\n };\n onClick: (item: string) => void;\n};\n\nexport type RowFilterItem = {\n id: string;\n title: string;\n hideIfEmpty?: string;\n};\n\nexport type FilterValue = {\n selected?: string[];\n all?: string[];\n};\n\ntype RowFilterBase<R> = {\n filterGroupName: string;\n type: string;\n items: RowFilterItem[];\n filter: (input: FilterValue, obj: R) => boolean;\n defaultSelected?: string[];\n};\n\nexport type RowMatchFilter<R = any> = RowFilterBase<R> & {\n isMatch: (obj: R, id: string) => boolean;\n};\n\nexport type RowReducerFilter<R = any> = RowFilterBase<R> & {\n reducer: (obj: R) => React.ReactText;\n};\n\nexport type RowFilter<R = any> = RowMatchFilter<R> | RowReducerFilter<R>;\n\nexport type RowSearchFilter<R = any> = Omit<RowFilterBase<R>, 'items' | 'defaultSelected'> & {\n placeholder?: string;\n};\n\nexport type AnyRowFilter<R = any> = RowFilter<R> | RowSearchFilter<R>;\n\nexport type ColumnLayout = {\n id: string;\n columns: ManagedColumn[];\n selectedColumns: Set<string>;\n showNamespaceOverride?: boolean;\n type: string;\n};\n\nexport type ManagedColumn = {\n id: string;\n title: string;\n additional?: boolean;\n};\n\nexport type OnFilterChange = (type: string, value: FilterValue) => void;\n\nexport type ListPageFilterProps<D = any> = {\n data: D;\n loaded: boolean;\n rowFilters?: RowFilter<D>[];\n labelFilter?: string;\n labelPath?: string;\n nameFilterTitle?: string;\n nameFilterPlaceholder?: string;\n labelFilterPlaceholder?: string;\n hideNameLabelFilters?: boolean;\n hideLabelFilter?: boolean;\n columnLayout?: ColumnLayout;\n onFilterChange: OnFilterChange;\n hideColumnManagement?: boolean;\n nameFilter?: string;\n rowSearchFilters?: RowSearchFilter<D>[];\n};\n\nexport type UseListPageFilter = <D, R>(\n data: D[],\n rowFilters?: AnyRowFilter<R>[],\n staticFilters?: { [key: string]: FilterValue },\n) => [D[], D[], OnFilterChange];\n\nexport type ResourceLinkProps = {\n /** @deprecated Use groupVersionKind instead. The kind property will be removed in a future release. */\n kind?: K8sResourceKindReference;\n groupVersionKind?: K8sGroupVersionKind;\n className?: string;\n displayName?: string;\n inline?: boolean;\n linkTo?: boolean;\n name?: string;\n namespace?: string;\n hideIcon?: boolean;\n title?: string;\n dataTest?: string;\n onClick?: () => void;\n truncate?: boolean;\n nameSuffix?: React.ReactNode;\n children?: React.ReactNode;\n};\n\nexport type ResourceIconProps = {\n className?: string;\n /** @deprecated Use groupVersionKind instead. The kind property will be removed in a future release. */\n kind?: K8sResourceKindReference;\n groupVersionKind?: K8sGroupVersionKind;\n};\n\nexport type UseK8sModel = (\n // Use K8sGroupVersionKind type instead of K8sResourceKindReference. Support for type K8sResourceKindReference will be removed in a future release.\n groupVersionKind?: K8sResourceKindReference | K8sGroupVersionKind,\n) => [K8sModel, boolean];\nexport type UseK8sModels = () => [{ [key: string]: K8sModel }, boolean];\n\nexport type PerspectiveType = string;\n\nexport type UseActivePerspective = () => [\n PerspectiveType,\n (perspective: string, next?: string) => void,\n];\n\nexport type QueryParams = {\n watch?: string;\n labelSelector?: string;\n fieldSelector?: string;\n resourceVersion?: string;\n [key: string]: string;\n};\n\nexport type Patch = {\n op: string;\n path: string;\n value?: any;\n};\n\nexport type Cause = {\n field: string;\n message: string;\n reason: string;\n};\n\nexport type Status = {\n apiVersion: 'v1';\n kind: 'Status';\n details: {\n causes: Cause[];\n group: string;\n kind: string;\n };\n message: string;\n metadata: any;\n reason: string;\n status: string;\n};\n\nexport type StatusComponentProps = {\n title?: string;\n iconOnly?: boolean;\n noTooltip?: boolean;\n className?: string;\n popoverTitle?: string;\n};\n\nexport type OverviewProps = {\n className?: string;\n children: React.ReactNode;\n};\n\nexport enum GridPosition {\n MAIN = 'MAIN',\n LEFT = 'LEFT',\n RIGHT = 'RIGHT',\n}\n\nexport type OverviewCardSpan = 4 | 6 | 12;\n\nexport type OverviewGridCard = {\n Card: React.ComponentType<any>;\n span?: OverviewCardSpan;\n};\n\nexport type OverviewGridProps = {\n mainCards: OverviewGridCard[];\n leftCards?: OverviewGridCard[];\n rightCards?: OverviewGridCard[];\n};\n\nexport type InventoryItemTitleProps = {\n children: React.ReactNode;\n};\n\nexport type InventoryItemBodyProps = {\n error?: any;\n};\n\nexport type InventoryItemStatusProps = {\n count: number;\n icon: React.ReactNode;\n linkTo?: string;\n};\n\nexport type HumanizeResult = {\n string: string;\n value: number;\n unit: string;\n};\n\nexport type Humanize = (\n value: string | number,\n initialUnit?: string,\n preferredUnit?: string,\n) => HumanizeResult;\n\nexport enum LIMIT_STATE {\n 'ERROR' = 'ERROR',\n 'WARN' = 'WARN',\n 'OK' = 'OK',\n}\n\nexport type TopConsumerPopoverProps = {\n current: string;\n total?: string;\n available?: string;\n limit?: string;\n limitState?: LIMIT_STATE;\n requested?: string;\n requestedState?: LIMIT_STATE;\n};\n\nexport type QueryWithDescription = {\n query: string;\n desc: string;\n};\n\nexport type SelfSubjectAccessReviewKind = {\n apiVersion: string;\n kind: string;\n metadata?: ObjectMetadata;\n spec: {\n resourceAttributes?: AccessReviewResourceAttributes;\n };\n status?: {\n allowed: boolean;\n denied?: boolean;\n reason?: string;\n evaluationError?: string;\n };\n};\n\n// per https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#selfsubjectreview-v1-authentication-k8s-io\nexport type SelfSubjectReviewKind = {\n apiVersion: string;\n kind: string;\n metadata?: ObjectMetadata;\n status?: {\n userInfo?: UserInfo;\n };\n};\n\n// per https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/#userinfo-v1-authentication-k8s-io\nexport type UserInfo = {\n uid?: string;\n username?: string;\n groups?: string[];\n extra?: object;\n};\n\nexport type CodeEditorProps = {\n value?: string;\n language?: string;\n options?: object;\n minHeight?: string | number;\n showShortcuts?: boolean;\n showMiniMap?: boolean;\n toolbarLinks?: React.ReactNodeArray;\n onChange?: (newValue, event) => void;\n onSave?: () => void;\n};\n\nexport type CodeEditorRef = {\n editor?: MonacoEditor['editor'];\n};\n\nexport type ResourceYAMLEditorProps = {\n initialResource: string | { [key: string]: any };\n header?: string;\n onSave?: (content: string) => void;\n readOnly?: boolean;\n create?: boolean;\n onChange?: (content: string) => void;\n hideHeader?: boolean;\n};\n\nexport type ResourceEventStreamProps = {\n resource: K8sResourceCommon;\n};\n\nexport type TimestampProps = {\n timestamp: string | number | Date;\n simple?: boolean;\n omitSuffix?: boolean;\n className?: string;\n};\n\nexport type NamespaceBarProps = {\n onNamespaceChange?: (namespace: string) => void;\n isDisabled?: boolean;\n children?: React.ReactNode;\n};\n\nexport type ErrorBoundaryFallbackProps = {\n errorMessage: string;\n componentStack: string;\n stack: string;\n title: string;\n};\n\nexport type FormatSeriesTitle = (labels: PrometheusLabels, i?: number) => string;\n\nexport type QueryBrowserProps = {\n customDataSource?: CustomDataSource;\n defaultSamples?: number;\n defaultTimespan?: number;\n disabledSeries?: PrometheusLabels[][];\n disableZoom?: boolean;\n filterLabels?: PrometheusLabels;\n fixedEndTime?: number;\n formatSeriesTitle?: FormatSeriesTitle;\n GraphLink?: React.ComponentType<{}>;\n hideControls?: boolean;\n isStack?: boolean;\n namespace?: string;\n onZoom?: (from: number, to: number) => void;\n pollInterval?: number;\n queries: string[];\n showLegend?: boolean;\n showStackedControl?: boolean;\n timespan?: number;\n units?: string;\n};\n\nexport type StorageClass = K8sResourceCommon & {\n provisioner: string;\n parameters: object;\n reclaimPolicy?: string;\n volumeBindingMode?: string;\n allowVolumeExpansion?: boolean;\n};\n\nexport type UseAnnotationsModal = (resource: K8sResourceCommon) => () => void;\n\nexport type UseDeleteModal = (\n resource: K8sResourceCommon,\n redirectTo?: LocationDescriptor,\n message?: JSX.Element,\n btnText?: React.ReactNode,\n deleteAllResources?: () => Promise<K8sResourceKind[]>,\n) => () => void;\n\nexport type UseLabelsModal = (resource: K8sResourceCommon) => () => void;\n\nexport type UseValuesForNamespaceContext = () => {\n namespace: string;\n setNamespace: (ns: string) => void;\n loaded: boolean;\n};\n\nexport type UseActiveNamespace = () => [string, (ns: string) => void];\n\nexport type UseUserSettings = <T>(\n key: string,\n defaultValue?: T,\n sync?: boolean,\n) => [T, React.Dispatch<React.SetStateAction<T>>, boolean];\n\nexport type UseQuickStartContext = () => QuickStartContextValues;\n\nexport type TaintEffect = '' | 'NoSchedule' | 'PreferNoSchedule' | 'NoExecute';\n\nexport type Taint = {\n key: string;\n value: string;\n effect: TaintEffect;\n};\n\nexport enum K8sResourceConditionStatus {\n True = 'True',\n False = 'False',\n Unknown = 'Unknown',\n}\n\nexport type K8sResourceCondition = {\n type: string;\n status: keyof typeof K8sResourceConditionStatus;\n lastTransitionTime?: string;\n reason?: string;\n message?: string;\n};\n\nexport type NodeCondition = {\n lastHeartbeatTime?: string;\n} & K8sResourceCondition;\n\nexport type NodeAddress = {\n type: string;\n address: string;\n};\n\nexport type NodeKind = {\n spec: {\n taints?: Taint[];\n unschedulable?: boolean;\n };\n status?: {\n capacity?: {\n [key: string]: string;\n };\n allocatable?: {\n [key: string]: string;\n };\n conditions?: NodeCondition[];\n images?: {\n names: string[];\n sizeBytes?: number;\n }[];\n phase?: string;\n nodeInfo?: {\n operatingSystem: string;\n };\n addresses?: NodeAddress[];\n };\n} & K8sResourceCommon;\n\nexport type CertificateSigningRequestKind = {\n spec: {\n groups: string[];\n request: string;\n usages: string[];\n username: string;\n uid: string;\n };\n status?: {\n conditions: {\n type: string;\n [key: string]: string;\n }[];\n };\n} & K8sResourceCommon;\n\nexport type NodeCertificateSigningRequestKind = CertificateSigningRequestKind & {\n metadata: K8sResourceCommon['metadata'] & { originalName: string };\n};\n","import * as _ from 'lodash-es';\nimport i18n from 'i18next';\nimport { getLastLanguage } from '@console/app/src/components/user-preferences/language/getLastLanguage';\n\n// The maximum allowed clock skew in milliseconds where we show a date as \"Just now\" even if it is from the future.\nexport const maxClockSkewMS = -60000;\nconst lang = getLastLanguage();\n\n// https://tc39.es/ecma402/#datetimeformat-objects\nexport const timeFormatter = new Intl.DateTimeFormat(lang, {\n hour: 'numeric',\n minute: 'numeric',\n});\n\nexport const timeFormatterWithSeconds = new Intl.DateTimeFormat(lang, {\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n});\n\nexport const dateFormatter = new Intl.DateTimeFormat(lang, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n});\n\nexport const dateFormatterNoYear = new Intl.DateTimeFormat(lang, {\n month: 'short',\n day: 'numeric',\n});\n\nexport const dateTimeFormatter = (langArg?: string) =>\n new Intl.DateTimeFormat(langArg ?? lang, {\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n year: 'numeric',\n });\n\nexport const dateTimeFormatterWithSeconds = new Intl.DateTimeFormat(lang, {\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n year: 'numeric',\n});\n\nexport const utcDateTimeFormatter = new Intl.DateTimeFormat(lang, {\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n year: 'numeric',\n timeZone: 'UTC',\n timeZoneName: 'short',\n});\n\nexport const relativeTimeFormatter = (langArg?: string) =>\n Intl.RelativeTimeFormat ? new Intl.RelativeTimeFormat(langArg ?? lang) : null;\n\nexport const getDuration = (ms: number) => {\n if (!ms || ms < 0) {\n ms = 0;\n }\n let seconds = Math.floor(ms / 1000);\n let minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n let hours = Math.floor(minutes / 60);\n minutes = minutes % 60;\n const days = Math.floor(hours / 24);\n hours = hours % 24;\n return { days, hours, minutes, seconds };\n};\n\nexport const fromNow = (dateTime: string | Date, now?: Date, options?, langArg?: string) => {\n // Check for null. If dateTime is null, it returns incorrect date Jan 1 1970.\n if (!dateTime) {\n return '-';\n }\n\n if (!now) {\n now = new Date();\n }\n\n const d = new Date(dateTime);\n const ms = now.getTime() - d.getTime();\n const justNow = i18n.t('public~Just now');\n\n // If the event occurred less than one minute in the future, assume it's clock drift and show \"Just now.\"\n if (!options?.omitSuffix && ms < 60000 && ms > maxClockSkewMS) {\n return justNow;\n }\n\n // Do not attempt to handle other dates in the future.\n if (ms < 0) {\n return '-';\n }\n\n const { days, hours, minutes } = getDuration(ms);\n\n if (options?.omitSuffix) {\n if (days) {\n return i18n.t('public~{{count}} day', { count: days });\n }\n if (hours) {\n return i18n.t('public~{{count}} hour', { count: hours });\n }\n return i18n.t('public~{{count}} minute', { count: minutes });\n }\n\n // Fallback to normal date/time formatting if Intl.RelativeTimeFormat is not\n // available. This is the case for older Safari versions.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat#browser_compatibility\n if (!relativeTimeFormatter(langArg)) {\n return dateTimeFormatter().format(d);\n }\n\n if (!days && !hours && !minutes) {\n return justNow;\n }\n\n if (days) {\n return relativeTimeFormatter(langArg).format(-days, 'day');\n }\n\n if (hours) {\n return relativeTimeFormatter(langArg).format(-hours, 'hour');\n }\n\n return relativeTimeFormatter(langArg).format(-minutes, 'minute');\n};\n\nexport const isValid = (dateTime: Date) => dateTime instanceof Date && !_.isNaN(dateTime.valueOf());\n\nconst zeroPad = (number: number) => (number < 10 ? `0${number}` : number);\n\nexport const twentyFourHourTime = (date: Date, showSeconds?: boolean): string => {\n const hours = zeroPad(date.getHours() ?? 0);\n const minutes = `:${zeroPad(date.getMinutes() ?? 0)}`;\n const seconds = showSeconds ? `:${zeroPad(date.getSeconds() ?? 0)}` : '';\n return `${hours}${minutes}${seconds}`;\n};\n","import * as React from 'react';\nimport { createContainer } from '@patternfly/react-charts';\nimport { AsyncComponent } from '../utils/async';\nimport { ONE_HOUR } from '@console/shared/src/constants/time';\n\n// Constants\nexport const PROMETHEUS_BASE_PATH = window.SERVER_FLAGS.prometheusBaseURL;\nexport const PROMETHEUS_TENANCY_BASE_PATH = window.SERVER_FLAGS.prometheusTenancyBaseURL;\nexport const ALERTMANAGER_BASE_PATH = window.SERVER_FLAGS.alertManagerBaseURL;\nexport const ALERTMANAGER_USER_WORKLOAD_BASE_PATH =\n window.SERVER_FLAGS.alertmanagerUserWorkloadBaseURL;\nexport const ALERTMANAGER_TENANCY_BASE_PATH = 'api/alertmanager-tenancy'; // remove it once it get added to SERVER_FLAGS\nexport const DEFAULT_PROMETHEUS_SAMPLES = 60;\nexport const DEFAULT_PROMETHEUS_TIMESPAN = ONE_HOUR;\n// Components\nexport { errorStatus, Status } from './status';\nexport const Area = (props) => (\n <AsyncComponent loader={() => import('./graph-loader').then((c) => c.Area)} {...props} />\n);\nexport const Bar = (props) => (\n <AsyncComponent loader={() => import('./graph-loader').then((c) => c.Bar)} {...props} />\n);\nexport const Gauge = (props) => (\n <AsyncComponent loader={() => import('./graph-loader').then((c) => c.Gauge)} {...props} />\n);\nexport const Stack = (props) => (\n <AsyncComponent loader={() => import('./graph-loader').then((c) => c.Stack)} {...props} />\n);\n\nexport const CursorVoronoiContainer = createContainer('cursor', 'voronoi');\n\n// Types\nexport type DataPoint<X = Date | number | string> = {\n x?: X;\n y?: number;\n label?: string;\n metric?: { [key: string]: string };\n description?: string;\n symbol?: {\n type?: string;\n fill?: string;\n };\n};\n\nexport type PrometheusLabels = { [key: string]: string };\nexport type PrometheusValue = [number, string];\n\n// Only covers range and instant vector responses for now.\nexport type PrometheusResult = {\n metric: PrometheusLabels;\n values?: PrometheusValue[];\n value?: PrometheusValue;\n};\n\nexport type PrometheusData = {\n resultType: 'matrix' | 'vector' | 'scalar' | 'string';\n result: PrometheusResult[];\n};\n\nexport type PrometheusResponse = {\n status: string;\n data: PrometheusData;\n errorType?: string;\n error?: string;\n warnings?: string[];\n};\n\nexport type DomainPadding =\n | number\n | {\n x?: number | [number, number];\n y?: number | [number, number];\n };\n","import { K8sKind } from '@console/internal/module/k8s';\n\nexport const BareMetalHostModel: K8sKind = {\n label: 'Bare Metal Host',\n labelPlural: 'Bare Metal Hosts',\n apiVersion: 'v1alpha1',\n apiGroup: 'metal3.io',\n plural: 'baremetalhosts',\n abbr: 'BMH',\n namespaced: true,\n kind: 'BareMetalHost',\n id: 'baremetalhost',\n crd: true,\n};\n\nexport const NodeMaintenanceModel: K8sKind = {\n label: 'Node Maintenance',\n labelPlural: 'Node Maintenances',\n apiVersion: 'v1beta1',\n apiGroup: 'nodemaintenance.medik8s.io',\n plural: 'nodemaintenances',\n abbr: 'NM',\n namespaced: false,\n kind: 'NodeMaintenance',\n id: 'nodemaintenance',\n crd: true,\n};\n\nexport const NodeMaintenanceKubevirtBetaModel: K8sKind = {\n label: 'Node Maintenance',\n labelPlural: 'Node Maintenances',\n apiVersion: 'v1beta1',\n apiGroup: 'nodemaintenance.kubevirt.io',\n plural: 'nodemaintenances',\n abbr: 'NM',\n namespaced: false,\n kind: 'NodeMaintenance',\n id: 'nodemaintenance',\n crd: true,\n};\n\nexport const ProvisioningModel: K8sKind = {\n label: 'Provisioning',\n labelPlural: 'Provisionings',\n apiVersion: 'v1alpha1',\n apiGroup: 'metal3.io',\n plural: 'provisionings',\n abbr: 'P',\n namespaced: false,\n kind: 'Provisioning',\n id: 'provisioning',\n crd: true,\n};\n\nexport const NodeMaintenanceKubevirtAlphaModel: K8sKind = {\n label: 'Node Maintenance',\n labelPlural: 'Node Maintenances',\n apiVersion: 'v1alpha1',\n apiGroup: 'kubevirt.io',\n plural: 'nodemaintenances',\n abbr: 'NM',\n namespaced: false,\n kind: 'NodeMaintenance',\n id: 'nodemaintenance',\n crd: true,\n};\n\nexport const CephClusterModel: K8sKind = {\n label: 'Ceph Cluster',\n labelPlural: 'Ceph Clusters',\n apiVersion: 'v1',\n apiGroup: 'ceph.rook.io',\n plural: 'cephclusters',\n abbr: 'CC',\n namespaced: true,\n kind: 'CephCluster',\n id: 'cephcluster',\n crd: true,\n};\n","import { getReference } from '@console/dynamic-plugin-sdk/src/utils/k8s';\n\n// TODO(alecmerdler): Replace all manual string building with this function\n/**\n * @deprecated - Use getReference if absolutely needed, otherwise pivot towards using K8sGroupVersionKind objects where possible\n */\nexport const referenceForGroupVersionKind = (group: string) => (version: string) => (\n kind: string,\n) => getReference({ group, version, kind });\n\nexport {\n getReferenceForModel as referenceForModel,\n getAPIVersionForModel as apiVersionForModel,\n} from '@console/dynamic-plugin-sdk/src/utils/k8s/k8s-ref';\n","// Default ErrorBoundary usage\nexport { default as ErrorBoundary } from './error-boundary';\n\n// Packaged, easy to use, fallback options\nexport { default as ErrorBoundaryPage } from './fallbacks/ErrorBoundaryPage';\nexport { default as ErrorBoundaryInline } from './fallbacks/ErrorBoundaryInline';\n\n// Custom fallback options\nexport { default as withFallback } from './fallbacks/withFallback';\nexport { default as ErrorBoundaryFallbackPage } from './fallbacks/ErrorBoundaryFallbackPage';\nexport { default as ErrorBoundaryFallbackInline } from './fallbacks/ErrorBoundaryFallbackInline';\n","import * as React from 'react';\nimport {\n useResolvedExtensions,\n isTelemetryListener,\n TelemetryListener,\n TelemetryEventListener,\n} from '@console/dynamic-plugin-sdk';\nimport {\n CLUSTER_TELEMETRY_ANALYTICS,\n PREFERRED_TELEMETRY_USER_SETTING_KEY,\n USER_TELEMETRY_ANALYTICS,\n} from '../constants';\nimport { useUserSettings } from './useUserSettings';\n\nlet telemetryEvents: { eventType: string; event: Record<string, any> }[] = [];\n\ninterface ClusterProperties {\n clusterId?: string;\n clusterType?: string;\n consoleVersion?: string;\n organizationId?: string;\n}\n\nexport const getClusterProperties = () => {\n const clusterProperties: ClusterProperties = {};\n clusterProperties.clusterId = window.SERVER_FLAGS?.telemetry?.CLUSTER_ID;\n clusterProperties.clusterType = window.SERVER_FLAGS?.telemetry?.CLUSTER_TYPE;\n if (\n window.SERVER_FLAGS?.telemetry?.CLUSTER_TYPE === 'OSD' &&\n window.SERVER_FLAGS?.telemetry?.DEVSANDBOX === 'true'\n ) {\n clusterProperties.clusterType = 'DEVSANDBOX';\n }\n clusterProperties.consoleVersion = window.SERVER_FLAGS?.consoleVersion;\n clusterProperties.organizationId = window.SERVER_FLAGS?.telemetry?.ORGANIZATION_ID;\n return clusterProperties;\n};\n\nlet clusterProperties = getClusterProperties();\n\nexport const updateClusterPropertiesFromTests = () => (clusterProperties = getClusterProperties());\n\nexport const useTelemetry = () => {\n // TODO use useDynamicPluginInfo() hook to tell whether all dynamic plugins have been processed\n // to avoid firing telemetry events multiple times whenever a dynamic plugin loads asynchronously\n\n const [currentUserPreferenceTelemetryValue] = useUserSettings<USER_TELEMETRY_ANALYTICS>(\n PREFERRED_TELEMETRY_USER_SETTING_KEY,\n null,\n true,\n );\n\n const [extensions] = useResolvedExtensions<TelemetryListener>(isTelemetryListener);\n\n React.useEffect(() => {\n if (\n currentUserPreferenceTelemetryValue === USER_TELEMETRY_ANALYTICS.ALLOW &&\n window.SERVER_FLAGS.telemetry?.STATE === CLUSTER_TELEMETRY_ANALYTICS.OPTIN &&\n telemetryEvents.length > 0\n ) {\n telemetryEvents.forEach(({ eventType, event }) => {\n extensions.forEach((e) => e.properties.listener(eventType, event));\n });\n telemetryEvents = [];\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentUserPreferenceTelemetryValue]);\n\n return React.useCallback<TelemetryEventListener>(\n (eventType, properties: Record<string, any>) => {\n const event = {\n ...clusterProperties,\n ...properties,\n // This is required to ensure that the replayed events uses the right path.\n path: properties?.pathname,\n };\n if (\n window.SERVER_FLAGS.telemetry?.STATE === CLUSTER_TELEMETRY_ANALYTICS.DISABLED ||\n (currentUserPreferenceTelemetryValue === USER_TELEMETRY_ANALYTICS.DENY &&\n (window.SERVER_FLAGS.telemetry?.STATE === CLUSTER_TELEMETRY_ANALYTICS.OPTIN ||\n window.SERVER_FLAGS.telemetry?.STATE === CLUSTER_TELEMETRY_ANALYTICS.OPTOUT))\n ) {\n return;\n }\n if (\n !currentUserPreferenceTelemetryValue &&\n window.SERVER_FLAGS.telemetry?.STATE === CLUSTER_TELEMETRY_ANALYTICS.OPTIN\n ) {\n telemetryEvents.push({ eventType, event });\n if (telemetryEvents.length > 10) {\n telemetryEvents.shift(); // Remove the first element\n }\n return;\n }\n extensions.forEach((e) => e.properties.listener(eventType, event));\n },\n [extensions, currentUserPreferenceTelemetryValue],\n );\n};\n","export { consoleFetch, consoleFetchJSON, consoleFetchText } from './console-fetch';\nexport { getConsoleRequestHeaders } from './console-fetch-utils';\n","export * from './grammar';\nexport * from './utils';\nexport * from './pod-utils';\nexport * from './pod-ring-utils';\nexport * from './pod-resource-utils';\nexport * from './resource-utils';\nexport * from './validation';\nexport * from './table-utils';\nexport * from './storage-utils';\nexport * from './useCombineRefs';\nexport * from './icon-utils';\nexport * from './namespace';\nexport * from './label-filter';\nexport * from './alert-utils';\nexport * from './operator-utils';\nexport * from './helm-utils';\nexport * from './hpa-utils';\nexport * from './sample-utils';\nexport * from './multiselectdropdown';\nexport * from './annotations';\nexport * from './xterm-addon-fullscreen';\nexport * from './yup-validations';\nexport * from './keyword-filter';\nexport * from './order-extensions';\nexport * from './console-plugin';\nexport * from './default-categories';\n","import { K8sKind } from '@console/internal/module/k8s';\n\nexport const QuickStartModel: K8sKind = {\n kind: 'ConsoleQuickStart',\n label: 'ConsoleQuickStart',\n labelPlural: 'ConsoleQuickStarts',\n apiGroup: 'console.openshift.io',\n apiVersion: 'v1',\n abbr: 'CQS',\n namespaced: false,\n crd: true,\n plural: 'consolequickstarts',\n propagationPolicy: 'Background',\n};\n\nexport const PodDisruptionBudgetModel: K8sKind = {\n label: 'PodDisruptionBudget',\n // t('console-app~PodDisruptionBudget')\n labelKey: 'console-app~PodDisruptionBudget',\n labelPlural: 'PodDisruptionBudgets',\n // t('console-app~PodDisruptionBudgets')\n labelPluralKey: 'console-app~PodDisruptionBudgets',\n plural: 'poddisruptionbudgets',\n apiVersion: 'v1',\n apiGroup: 'policy',\n abbr: 'PDB',\n namespaced: true,\n kind: 'PodDisruptionBudget',\n id: 'poddisruptionbudget',\n};\n\nexport const EndPointSliceModel: K8sKind = {\n kind: 'EndpointSlice',\n label: 'EndpointSlice',\n labelPlural: 'EndpointSlices',\n apiGroup: 'discovery.k8s.io',\n apiVersion: 'v1',\n abbr: 'EPS',\n namespaced: true,\n plural: 'endpointslices',\n};\n","import * as _ from 'lodash';\n\n// Conversions between units and milliseconds\nconst s = 1000;\nconst m = s * 60;\nconst h = m * 60;\nconst d = h * 24;\nconst w = d * 7;\nconst units = { w, d, h, m, s };\n\n/**\n * Converts a duration in milliseconds to a Prometheus time duration string like \"1h 10m\"\n * @param {number} ms - Time duration in milliseconds\n * @returns {string} The duration converted to a Prometheus time duration string\n * @example\n * ```\n * formatPrometheusDuration(65000) // Returns \"1m 5s\"\n * ```\n */\nexport const formatPrometheusDuration = (ms: number) => {\n if (!_.isFinite(ms) || ms < 0) {\n return '';\n }\n let remaining = ms;\n let str = '';\n _.each(units, (factor, unit) => {\n const n = Math.floor(remaining / factor);\n if (n > 0) {\n str += `${n}${unit} `;\n remaining -= n * factor;\n }\n });\n return _.trim(str);\n};\n\n/**\n * Converts a Prometheus time duration like \"1h 10m 23s\" to milliseconds\n * @param {string} duration - Prometheus time duration string\n * @returns {number} The duration converted to a Prometheus time duration string or 0 if the duration could not be parsed\n * @example\n * ```\n * parsePrometheusDuration(\"1m 5s\") // Returns 65000\n * ```\n */\nexport const parsePrometheusDuration = (duration: string): number => {\n try {\n const parts = duration\n .trim()\n .split(/\\s+/)\n .map((p) => p.match(/^(\\d+)([wdhms])$/));\n return _.sumBy(parts, (p) => parseInt(p[1], 10) * units[p[2]]);\n } catch (ignored) {\n // Invalid duration format\n return 0;\n }\n};\n","import * as React from 'react';\nimport * as classNames from 'classnames';\nimport Linkify from 'react-linkify';\nimport { useTranslation } from 'react-i18next';\nimport { CopyToClipboard as CTC } from 'react-copy-to-clipboard';\nimport { Tooltip } from '@patternfly/react-core';\nimport { CopyIcon } from '@patternfly/react-icons/dist/esm/icons/copy-icon';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons/dist/esm/icons/external-link-alt-icon';\nimport { ALL_NAMESPACES_KEY } from '@console/shared/src/constants';\n\n// Kubernetes \"dns-friendly\" names match\n// [a-z0-9]([-a-z0-9]*[a-z0-9])? and are 63 or fewer characters\n// long. This pattern checks the pattern but not the length.\n//\n// Don't capture anything in legalNamePattern, since it's used\n// in expressions like\n//\n// new RegExp(\"PREFIX\" + legalNamePattern.source + \"(SUFFIX)\")\n//\n// And it's ok for users to make assumptions about capturing groups.\n\nexport const legalNamePattern = /[a-z0-9](?:[-a-z0-9]*[a-z0-9])?/;\n\nconst basePathPattern = new RegExp(`^/?${window.SERVER_FLAGS.basePath}`);\n\nexport const namespacedPrefixes = [\n '/api-resource',\n '/k8s',\n '/operatorhub',\n '/operatormanagement',\n '/operators',\n '/details',\n '/search',\n '/status',\n];\n\nexport const stripBasePath = (path: string): string => path.replace(basePathPattern, '/');\n\nexport const getNamespace = (path: string): string => {\n path = stripBasePath(path);\n const split = path.split('/').filter((x) => x);\n\n if (split[1] === 'all-namespaces') {\n return ALL_NAMESPACES_KEY;\n }\n\n let ns: string;\n if (split[1] === 'cluster' && ['namespaces', 'projects'].includes(split[2]) && split[3]) {\n ns = split[3];\n } else if (split[1] === 'ns' && split[2]) {\n ns = split[2];\n } else {\n return;\n }\n\n const match = ns.match(legalNamePattern);\n return match && match.length > 0 && match[0];\n};\n\nexport const getURLSearchParams = () => {\n const all: any = {};\n const params = new URLSearchParams(window.location.search);\n\n for (const [k, v] of params.entries()) {\n all[k] = v;\n }\n\n return all;\n};\n\nexport const ExternalLink: React.FC<ExternalLinkProps> = ({\n children,\n href,\n text,\n additionalClassName = '',\n dataTestID,\n stopPropagation,\n}) => (\n <a\n className={classNames('co-external-link', additionalClassName)}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-test-id={dataTestID}\n {...(stopPropagation ? { onClick: (e) => e.stopPropagation() } : {})}\n >\n {children || text}\n </a>\n);\n\n// Opens link with copy-to-clipboard\n\nexport const ExternalLinkWithCopy: React.FC<ExternalLinkWithCopyProps> = ({\n link,\n text,\n additionalClassName,\n dataTestID,\n}) => {\n const [copied, setCopied] = React.useState(false);\n\n const { t } = useTranslation();\n const tooltipText = copied ? t('public~Copied to clipboard') : t('public~Copy to clipboard');\n const tooltipContent = [\n <span className=\"co-nowrap\" key=\"nowrap\">\n {tooltipText}\n </span>,\n ];\n\n return (\n <div className={classNames(additionalClassName)}>\n <a href={link} target=\"_blank\" rel=\"noopener noreferrer\" data-test-id={dataTestID}>\n {text ?? link}\n <span className=\"co-icon-nowrap\">\n \n <span className=\"co-external-link-with-copy__icon co-external-link-with-copy__externallinkicon\">\n <ExternalLinkAltIcon />\n </span>\n </span>\n </a>\n <span className=\"co-icon-nowrap\">\n <Tooltip content={tooltipContent} trigger=\"click mouseenter focus\" exitDelay={1250}>\n <CTC text={link} onCopy={() => setCopied(true)}>\n <span\n onMouseEnter={() => setCopied(false)}\n className=\"co-external-link-with-copy__icon co-external-link-with-copy__copyicon\"\n >\n <CopyIcon />\n <span className=\"pf-v5-u-screen-reader\">{t('public~Copy to clipboard')}</span>\n </span>\n </CTC>\n </Tooltip>\n </span>\n </div>\n );\n};\n\n// Open links in a new window and set noopener/noreferrer.\nexport const LinkifyExternal: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <Linkify properties={{ target: '_blank', rel: 'noopener noreferrer' }}>{children}</Linkify>\n);\nLinkifyExternal.displayName = 'LinkifyExternal';\n\ntype ExternalLinkProps = {\n href: string;\n text?: React.ReactNode;\n additionalClassName?: string;\n dataTestID?: string;\n stopPropagation?: boolean;\n};\n\ntype ExternalLinkWithCopyProps = {\n link: string;\n text?: string;\n dataTestID?: string;\n additionalClassName?: string;\n};\n","import { Map as ImmutableMap } from 'immutable';\nimport * as _ from 'lodash-es';\n\nimport { FLAGS } from '@console/shared/src/constants';\nimport { isModelFeatureFlag } from '@console/plugin-sdk/src/typings';\nimport {\n subscribeToExtensions,\n extensionDiffListener,\n} from '@console/plugin-sdk/src/api/pluginSubscriptionService';\nimport {\n ModelFeatureFlag as DynamicModelFeatureFlag,\n isModelFeatureFlag as isDynamicModelFeatureFlag,\n} from '@console/dynamic-plugin-sdk/src/extensions';\nimport {\n ClusterAutoscalerModel,\n ConsoleCLIDownloadModel,\n ConsoleExternalLogLinkModel,\n ConsoleLinkModel,\n ConsoleNotificationModel,\n ConsoleYAMLSampleModel,\n MachineAutoscalerModel,\n MachineConfigModel,\n MachineHealthCheckModel,\n MachineModel,\n PrometheusModel,\n} from '../models';\nimport { referenceForGroupVersionKind, referenceForModel } from '../module/k8s/k8s-ref';\nimport { RootState } from '../redux';\nimport { ActionType as K8sActionType } from '@console/dynamic-plugin-sdk/src/app/k8s/actions/k8s';\nimport { FeatureState } from '@console/dynamic-plugin-sdk/src/app/features';\nimport { FeatureAction, ActionType } from '../actions/features';\nimport { pluginStore } from '../plugins';\n\n// eslint-disable-next-line prettier/prettier\nexport type { FeatureState };\n\nexport const defaults = _.mapValues(FLAGS, (flag) => {\n switch (flag) {\n case FLAGS.AUTH_ENABLED:\n return !window.SERVER_FLAGS.authDisabled;\n case FLAGS.MONITORING:\n return (\n !!window.SERVER_FLAGS.prometheusBaseURL && !!window.SERVER_FLAGS.prometheusTenancyBaseURL\n );\n default:\n return undefined;\n }\n});\n\nexport const baseCRDs = {\n [referenceForModel(ClusterAutoscalerModel)]: FLAGS.CLUSTER_AUTOSCALER,\n [referenceForModel(ConsoleLinkModel)]: FLAGS.CONSOLE_LINK,\n [referenceForModel(ConsoleCLIDownloadModel)]: FLAGS.CONSOLE_CLI_DOWNLOAD,\n [referenceForModel(ConsoleExternalLogLinkModel)]: FLAGS.CONSOLE_EXTERNAL_LOG_LINK,\n [referenceForModel(ConsoleNotificationModel)]: FLAGS.CONSOLE_NOTIFICATION,\n [referenceForModel(ConsoleYAMLSampleModel)]: FLAGS.CONSOLE_YAML_SAMPLE,\n [referenceForModel(MachineAutoscalerModel)]: FLAGS.MACHINE_AUTOSCALER,\n [referenceForModel(MachineConfigModel)]: FLAGS.MACHINE_CONFIG,\n [referenceForModel(MachineHealthCheckModel)]: FLAGS.MACHINE_HEALTH_CHECK,\n [referenceForModel(MachineModel)]: FLAGS.CLUSTER_API,\n [referenceForModel(PrometheusModel)]: FLAGS.PROMETHEUS,\n};\n\nconst CRDs = { ...baseCRDs };\n\nconst addToCRDs = (ref: string, flag: string) => {\n if (!CRDs[ref]) {\n CRDs[ref] = flag as FLAGS;\n }\n};\n\npluginStore\n .getExtensionsInUse()\n .filter(isModelFeatureFlag)\n .forEach((ff) => {\n addToCRDs(referenceForModel(ff.properties.model), ff.properties.flag);\n });\n\nsubscribeToExtensions<DynamicModelFeatureFlag>(\n extensionDiffListener((added, removed) => {\n const getModelRef = (e: DynamicModelFeatureFlag) => {\n const model = e.properties.model;\n return referenceForGroupVersionKind(model.group)(model.version)(model.kind);\n };\n\n added.forEach((e) => {\n addToCRDs(getModelRef(e), e.properties.flag);\n });\n\n removed.forEach((e) => {\n delete CRDs[getModelRef(e)];\n });\n\n // TODO(vojtech): change of 'CRDs' should trigger relevant detection logic\n }),\n isDynamicModelFeatureFlag,\n);\n\nexport const featureReducerName = 'FLAGS';\nexport const featureReducer = (state: FeatureState, action: FeatureAction): FeatureState => {\n if (!state) {\n return ImmutableMap(defaults);\n }\n\n switch (action.type) {\n case ActionType.SetFlag:\n return state.set(action.payload.flag, action.payload.value);\n\n case ActionType.ClearSSARFlags:\n return state.withMutations((s) =>\n action.payload.flags.reduce((acc, curr) => acc.remove(curr), s),\n );\n\n case K8sActionType.ReceivedResources:\n // Flip all flags to false to signify that we did not see them\n _.each(CRDs, (v) => (state = state.set(v, false)));\n\n return action.payload.resources.models\n .filter((model) => CRDs[referenceForModel(model)] !== undefined)\n .reduce((nextState, model) => {\n const flag = CRDs[referenceForModel(model)];\n // eslint-disable-next-line no-console\n console.log(`${flag} was detected.`);\n\n return nextState.set(flag, true);\n }, state);\n\n default:\n return state;\n }\n};\n\nexport const getFlagsObject = ({ [featureReducerName]: featureState }: RootState): FlagsObject =>\n featureState.toObject();\n\nexport type FlagsObject = { [key: string]: boolean };\n\n// Flag detection is not complete if the flag's value is `undefined`.\nexport const flagPending = (flag: boolean) => flag === undefined;\n","import * as _ from 'lodash';\nimport {\n useResolvedExtensions,\n CatalogItemType,\n isCatalogItemType,\n} from '@console/dynamic-plugin-sdk';\nimport {\n CatalogItem,\n CatalogItemDetails,\n CatalogItemMetadataProviderFunction,\n} from '@console/dynamic-plugin-sdk/src/extensions';\nimport { normalizeIconClass } from '@console/internal/components/catalog/catalog-item-icon';\nimport { history } from '@console/internal/components/utils';\nimport * as catalogImg from '@console/internal/imgs/logos/catalog-icon.svg';\nimport { keywordFilter } from '../../../utils/keyword-filter';\nimport { CatalogType, CatalogTypeCounts } from './types';\n\nenum CatalogVisibilityState {\n Enabled = 'Enabled',\n Disabled = 'Disabled',\n}\n\nconst catalogItemCompare = (keyword: string, item: CatalogItem): boolean => {\n if (!item) {\n return false;\n }\n return (\n item.name.toLowerCase().includes(keyword) ||\n (typeof item.description === 'string' && item.description.toLowerCase().includes(keyword)) ||\n item.type.toLowerCase().includes(keyword) ||\n item.tags?.some((tag) => tag.includes(keyword)) ||\n item.cta?.label.toLowerCase().includes(keyword)\n );\n};\n\nexport const keywordCompare = (filterString: string, items: CatalogItem[]): CatalogItem[] => {\n return keywordFilter(filterString, items, catalogItemCompare);\n};\n\nexport const getIconProps = (item: CatalogItem) => {\n const { icon } = item;\n if (!icon) {\n return {};\n }\n if (icon.url) {\n return { iconImg: icon.url, iconClass: null };\n }\n if (icon.class) {\n return { iconImg: null, iconClass: normalizeIconClass(icon.class) };\n }\n if (icon.node) {\n return { iconImg: null, iconClass: null, icon: icon.node };\n }\n return { iconImg: catalogImg, iconClass: null };\n};\n\nexport const setURLParams = (params: URLSearchParams) => {\n const url = new URL(window.location.href);\n const searchParams = `?${params.toString()}${url.hash}`;\n\n history.replace(`${url.pathname}${searchParams}`);\n};\n\nexport const updateURLParams = (paramName: string, value: string | string[]) => {\n const params = new URLSearchParams(window.location.search);\n\n if (value) {\n params.set(paramName, Array.isArray(value) ? JSON.stringify(value) : value);\n } else {\n params.delete(paramName);\n }\n setURLParams(params);\n};\n\nexport const getURLWithParams = (paramName: string, value: string | string[]): string => {\n const params = new URLSearchParams(window.location.search);\n const url = new URL(window.location.href);\n\n if (value) {\n params.set(paramName, Array.isArray(value) ? JSON.stringify(value) : value);\n } else {\n params.delete(paramName);\n }\n\n const searchParams = `?${params.toString()}${url.hash}`;\n return `${url.pathname}${searchParams}`;\n};\n\nexport const getCatalogTypeCounts = (\n items: CatalogItem[],\n catalogTypes: CatalogType[],\n): CatalogTypeCounts => {\n const catalogTypeCounts = {};\n\n catalogTypes.forEach((catalogType) => {\n const matchedItems = items.filter((item) => item.type === catalogType.value);\n catalogTypeCounts[catalogType.value] = matchedItems.length;\n });\n\n return catalogTypeCounts;\n};\n\nexport const customPropertyPresent = (\n catalogItemDetails: CatalogItemDetails,\n proppertyName: string,\n): boolean => {\n return catalogItemDetails?.properties?.some((property) => property.label === proppertyName);\n};\n\nexport const applyCatalogItemMetadata = (\n catalogItems: CatalogItem[],\n metadataProviderMap: {\n [type: string]: { [id: string]: CatalogItemMetadataProviderFunction };\n },\n) =>\n catalogItems.map((item) => {\n const metadataProviders = Object.values(metadataProviderMap[item.type] ?? {});\n if (metadataProviders?.length) {\n const metadata = metadataProviders\n .map((metadataProvider) => metadataProvider(item))\n .filter((x) => x);\n\n const tags = _.flatten(metadata.map((m) => m.tags).filter((x) => x));\n const badges = _.flatten(metadata.map((m) => m.badges).filter((x) => x));\n const attributes = metadata.reduce(\n (acc, m) => Object.assign(acc, m.attributes),\n {} as CatalogItem['attributes'],\n );\n const attributeCount = Object.keys(attributes).length;\n if (tags.length > 0 || badges.length > 0 || attributeCount > 0) {\n return {\n ...item,\n tags: tags.length > 0 ? [...(item.tags ?? []), ...tags] : item.tags,\n badges: badges.length > 0 ? [...(item.badges ?? []), ...badges] : item.badges,\n attributes: attributeCount ? { ...item.attributes, ...attributes } : item.attributes,\n };\n }\n }\n return item;\n });\n\nexport const isCatalogTypeEnabled = (catalogType: string): boolean => {\n if (window.SERVER_FLAGS.developerCatalogTypes) {\n const developerCatalogTypes = JSON.parse(window.SERVER_FLAGS.developerCatalogTypes);\n if (\n developerCatalogTypes?.state === CatalogVisibilityState.Enabled &&\n developerCatalogTypes?.enabled?.length > 0\n ) {\n return developerCatalogTypes?.enabled.includes(catalogType);\n }\n if (developerCatalogTypes?.state === CatalogVisibilityState.Disabled) {\n if (developerCatalogTypes?.disabled?.length > 0) {\n return !developerCatalogTypes?.disabled.includes(catalogType);\n }\n return false;\n }\n }\n return true;\n};\n\nexport const useGetAllDisabledSubCatalogs = () => {\n const [catalogExtensionsArray] = useResolvedExtensions<CatalogItemType>(isCatalogItemType);\n const catalogTypeExtensions = catalogExtensionsArray.map((type) => {\n return type.properties.type;\n });\n let disabledSubCatalogs = [];\n if (window.SERVER_FLAGS.developerCatalogTypes) {\n const developerCatalogTypes = JSON.parse(window.SERVER_FLAGS.developerCatalogTypes);\n if (\n developerCatalogTypes?.state === CatalogVisibilityState.Enabled &&\n developerCatalogTypes?.enabled?.length > 0\n ) {\n disabledSubCatalogs = catalogTypeExtensions.filter(\n (val) => !developerCatalogTypes?.enabled.includes(val),\n );\n return [disabledSubCatalogs];\n }\n if (developerCatalogTypes?.state === CatalogVisibilityState.Disabled) {\n if (developerCatalogTypes?.disabled?.length > 0) {\n return [developerCatalogTypes?.disabled, catalogTypeExtensions];\n }\n return [catalogTypeExtensions];\n }\n }\n return [disabledSubCatalogs];\n};\n\nexport const useIsDeveloperCatalogEnabled = (): boolean => {\n const [disabledSubCatalogs] = useGetAllDisabledSubCatalogs();\n const [catalogExtensionsArray] = useResolvedExtensions<CatalogItemType>(isCatalogItemType);\n const catalogTypeExtensions = catalogExtensionsArray.map((type) => {\n return type.properties.type;\n });\n if (disabledSubCatalogs?.length === catalogTypeExtensions?.length) {\n return (\n JSON.stringify(disabledSubCatalogs.sort()) !== JSON.stringify(catalogTypeExtensions.sort())\n );\n }\n return true;\n};\n","import { Dispatch } from 'react-redux';\nimport * as _ from 'lodash-es';\nimport { ActionType as Action, action } from 'typesafe-actions';\n\nimport { FLAGS } from '@console/shared/src/constants/common';\nimport { isCustomFeatureFlag, CustomFeatureFlag } from '@console/plugin-sdk/src/typings';\nimport {\n subscribeToExtensions,\n extensionDiffListener,\n} from '@console/plugin-sdk/src/api/pluginSubscriptionService';\nimport {\n FeatureFlag as DynamicFeatureFlag,\n isFeatureFlag as isDynamicFeatureFlag,\n SetFeatureFlag,\n} from '@console/dynamic-plugin-sdk/src/extensions/feature-flags';\nimport { setUser } from '@console/dynamic-plugin-sdk/src/app/core/actions/core';\nimport { resolveExtension } from '@console/dynamic-plugin-sdk/src/coderefs/coderef-resolver';\nimport store from '../redux';\nimport { GroupModel, UserModel, VolumeSnapshotContentModel } from '../models';\nimport { ClusterVersionKind } from '../module/k8s/types';\nimport { receivedResources } from '@console/dynamic-plugin-sdk/src/app/k8s/actions/k8s';\nimport { setClusterID, setCreateProjectMessage } from './common';\nimport client, { fetchURL } from '../graphql/client';\nimport { SSARQuery, SSRQuery } from './features.gql';\nimport {\n SSARQueryType,\n SSARQueryVariables,\n SSRQueryType,\n} from '../../@types/console/generated/graphql-schema';\nimport { UserInfo } from '@console/internal/module/k8s';\n\nexport enum ActionType {\n SetFlag = 'setFlag',\n ClearSSARFlags = 'clearSSARFlags',\n}\n\nexport const defaults = _.mapValues(FLAGS, (flag) =>\n flag === FLAGS.AUTH_ENABLED ? !window.SERVER_FLAGS.authDisabled : undefined,\n);\n\nexport const setFlag = (flag: FLAGS | string, value: boolean) =>\n action(ActionType.SetFlag, { flag, value });\n\nconst retryFlagDetection = (dispatch, cb) => {\n setTimeout(() => cb(dispatch), 15000);\n};\n\nexport const handleError = (res, flag, dispatch, cb) => {\n const status = res?.response?.status;\n if (_.includes([403, 502], status)) {\n dispatch(setFlag(flag, undefined));\n }\n if (!_.includes([401, 403, 500], status)) {\n retryFlagDetection(dispatch, cb);\n }\n};\n\nconst projectListPath = '/apis/project.openshift.io/v1/projects?limit=1';\nconst detectShowOpenShiftStartGuide = (dispatch, canListNS: boolean = false) => {\n // Skip the project check if we know the user can list all namespaces. This\n // avoids potentially listing thousands of projects more than once (projects\n // dropdown and flag check). Even though we only ask for one project, the\n // projects API currently doesn't support paging.\n //\n // TODO: Consider adding a global watch for projects / namespaces, which\n // could remove the need for this flag entirely. It would also prevent us\n // from re-listing projects when switching from a namespace-scoped resource\n // to a cluster-scoped resource and back.\n if (canListNS) {\n dispatch(setFlag(FLAGS.SHOW_OPENSHIFT_START_GUIDE, false));\n return;\n }\n\n fetchURL(projectListPath).then(\n (res) => dispatch(setFlag(FLAGS.SHOW_OPENSHIFT_START_GUIDE, _.isEmpty(res.items))),\n (err) =>\n err?.response?.status === 404\n ? dispatch(setFlag(FLAGS.SHOW_OPENSHIFT_START_GUIDE, false))\n : handleError(\n err,\n FLAGS.SHOW_OPENSHIFT_START_GUIDE,\n dispatch,\n detectShowOpenShiftStartGuide,\n ),\n );\n};\n\n// Check the user's access to some resources.\nconst ssarChecks = [\n {\n flag: FLAGS.CAN_CREATE_NS,\n resourceAttributes: { resource: 'namespaces', verb: 'get' },\n },\n {\n flag: FLAGS.CAN_GET_NS,\n resourceAttributes: { resource: 'namespaces', verb: 'get' },\n },\n {\n flag: FLAGS.CAN_LIST_NS,\n resourceAttributes: { resource: 'namespaces', verb: 'list' },\n after: detectShowOpenShiftStartGuide,\n },\n {\n flag: FLAGS.CAN_LIST_NODE,\n resourceAttributes: { resource: 'nodes', verb: 'list' },\n },\n {\n flag: FLAGS.CAN_LIST_PV,\n resourceAttributes: { resource: 'persistentvolumes', verb: 'list' },\n },\n {\n flag: FLAGS.CAN_LIST_USERS,\n resourceAttributes: {\n group: UserModel.apiGroup,\n resource: UserModel.plural,\n verb: 'list',\n },\n },\n {\n flag: FLAGS.CAN_LIST_GROUPS,\n resourceAttributes: {\n group: GroupModel.apiGroup,\n resource: GroupModel.plural,\n verb: 'list',\n },\n },\n {\n flag: FLAGS.CAN_LIST_CRD,\n resourceAttributes: {\n group: 'apiextensions.k8s.io',\n resource: 'customresourcedefinitions',\n verb: 'list',\n },\n },\n {\n // TODO: Move into OLM plugin\n flag: FLAGS.CAN_LIST_OPERATOR_GROUP,\n resourceAttributes: {\n group: 'operators.coreos.com',\n resource: 'operatorgroups',\n verb: 'list',\n },\n },\n {\n // TODO: Move into OLM plugin\n flag: FLAGS.CAN_LIST_PACKAGE_MANIFEST,\n resourceAttributes: {\n group: 'packages.operators.coreos.com',\n resource: 'packagemanifests',\n verb: 'list',\n },\n },\n // TODO: Move into Core Plugin\n {\n flag: FLAGS.CAN_LIST_VSC,\n resourceAttributes: {\n group: VolumeSnapshotContentModel.apiGroup,\n resource: VolumeSnapshotContentModel.plural,\n verb: 'list',\n },\n },\n];\n\nexport const clearSSARFlags = () =>\n action(ActionType.ClearSSARFlags, {\n flags: ssarChecks.map((check) => check.flag),\n });\n\nconst featureActions = { setFlag };\nconst clearFlags = { clearSSARFlags };\n\nexport type FeatureAction = Action<\n typeof featureActions | typeof receivedResources | typeof clearFlags\n>;\n\n// This config API contains the OpenShift Project, and other mandatory resources\nconst openshiftPath = '/apis/config.openshift.io/v1';\nconst detectOpenShift = (dispatch) =>\n fetchURL(openshiftPath).then(\n (res) => dispatch(setFlag(FLAGS.OPENSHIFT, _.size(res.resources) > 0)),\n (err) =>\n err?.response?.status === 404\n ? dispatch(setFlag(FLAGS.OPENSHIFT, false))\n : handleError(err, FLAGS.OPENSHIFT, dispatch, detectOpenShift),\n );\n\nconst clusterVersionPath = '/apis/config.openshift.io/v1/clusterversions/version';\nconst detectClusterVersion = (dispatch) =>\n fetchURL<ClusterVersionKind>(clusterVersionPath).then(\n (clusterVersion) => {\n const hasClusterVersion = !_.isEmpty(clusterVersion);\n dispatch(setFlag(FLAGS.CLUSTER_VERSION, hasClusterVersion));\n dispatch(setClusterID(clusterVersion.spec.clusterID));\n },\n (err) => {\n if (_.includes([403, 404], err?.response?.status)) {\n dispatch(setFlag(FLAGS.CLUSTER_VERSION, false));\n } else {\n handleError(err, FLAGS.CLUSTER_VERSION, dispatch, detectClusterVersion);\n }\n },\n );\n\nconst projectRequestPath = '/apis/project.openshift.io/v1/projectrequests';\nconst detectCanCreateProject = (dispatch) =>\n fetchURL(projectRequestPath).then(\n (res) => dispatch(setFlag(FLAGS.CAN_CREATE_PROJECT, res.status === 'Success')),\n (err) => {\n const status = err?.response?.status;\n if (status === 403) {\n dispatch(setFlag(FLAGS.CAN_CREATE_PROJECT, false));\n dispatch(setCreateProjectMessage(_.get(err, 'json.details.causes[0].message')));\n } else if (!_.includes([400, 404, 500], status)) {\n retryFlagDetection(dispatch, detectCanCreateProject);\n }\n },\n );\n\nconst detectUser = (dispatch: Dispatch) =>\n client\n .query<SSRQueryType>({\n query: SSRQuery,\n })\n .then(\n (res) => {\n const userInfo = res.data.selfSubjectReview.status.userInfo;\n const newUserInfo: UserInfo = {};\n if (userInfo.extra) {\n try {\n newUserInfo.extra = JSON.parse(userInfo.extra);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error parsing UserInfo JSON:', error);\n }\n }\n newUserInfo.groups = userInfo.groups;\n newUserInfo.uid = userInfo.uid;\n newUserInfo.username = userInfo.username;\n dispatch(setUser(newUserInfo));\n },\n (err) => {\n // eslint-disable-next-line no-console\n console.error('Error retrieving SelfSubjectReview: ', err);\n if (!_.includes([400, 404, 500], err?.response?.status)) {\n retryFlagDetection(dispatch, detectUser);\n }\n },\n );\n\nconst ssarCheckActions = ssarChecks.map(({ flag, resourceAttributes, after }) => {\n const fn = (dispatch: Dispatch) =>\n client\n .query<SSARQueryType, SSARQueryVariables>({\n query: SSARQuery,\n variables: resourceAttributes,\n })\n .then(\n (res) => {\n const allowed: boolean = res.data.selfSubjectAccessReview.status.allowed;\n dispatch(setFlag(flag, allowed));\n if (after) {\n after(dispatch, allowed);\n }\n },\n (err) => handleError({ response: err.graphQLErrors[0]?.extensions }, flag, dispatch, fn),\n );\n return fn;\n});\n\nexport const detectFeatures = () => (dispatch: Dispatch) => {\n subscribeToExtensions<CustomFeatureFlag>(\n extensionDiffListener((added) =>\n added.forEach((detector) => detector.properties.detect(dispatch)),\n ),\n isCustomFeatureFlag,\n );\n [\n detectOpenShift,\n detectCanCreateProject,\n detectClusterVersion,\n detectUser,\n ...ssarCheckActions,\n ].forEach((detect) => detect(dispatch));\n};\n\nexport const featureFlagController: SetFeatureFlag = (flag, enabled) => {\n store.dispatch(setFlag(flag, enabled));\n};\n\nsubscribeToExtensions<DynamicFeatureFlag>(\n extensionDiffListener((added) => {\n added.forEach((e) => {\n resolveExtension(e)\n .then((resolvedExtension) => {\n resolvedExtension.properties.handler(featureFlagController);\n })\n .catch((error) => {\n // eslint-disable-next-line no-console\n console.error('Resolve extension failed:', error);\n });\n });\n }),\n isDynamicFeatureFlag,\n);\n","export const MARKDOWN_COPY_BUTTON_ID = 'data-copy-for';\nexport const MARKDOWN_EXECUTE_BUTTON_ID = 'data-execute-for';\nexport const MARKDOWN_SNIPPET_ID = 'data-snippet-id';\n","import * as _ from 'lodash-es';\nimport {\n PROMETHEUS_BASE_PATH,\n PROMETHEUS_TENANCY_BASE_PATH,\n DEFAULT_PROMETHEUS_SAMPLES,\n DEFAULT_PROMETHEUS_TIMESPAN,\n} from './index';\nimport { PrometheusEndpoint } from '@console/dynamic-plugin-sdk/src/api/common-types';\nexport { PrometheusEndpoint };\n\n// Range vector queries require end, start, and step search params\nconst getRangeVectorSearchParams = (\n endTime: number = Date.now(),\n samples: number = DEFAULT_PROMETHEUS_SAMPLES,\n timespan: number = DEFAULT_PROMETHEUS_TIMESPAN,\n): URLSearchParams => {\n const params = new URLSearchParams();\n params.append('start', `${(endTime - timespan) / 1000}`);\n params.append('end', `${endTime / 1000}`);\n params.append('step', `${timespan / samples / 1000}`);\n return params;\n};\n\nconst getSearchParams = ({\n endpoint,\n endTime,\n timespan,\n samples,\n ...params\n}: PrometheusURLProps): URLSearchParams => {\n const searchParams =\n endpoint === PrometheusEndpoint.QUERY_RANGE\n ? getRangeVectorSearchParams(endTime, samples, timespan)\n : new URLSearchParams();\n _.each(params, (value, key) => value && searchParams.append(key, value.toString()));\n return searchParams;\n};\n\nexport const getPrometheusURL = (\n props: PrometheusURLProps,\n basePath: string = props.namespace ? PROMETHEUS_TENANCY_BASE_PATH : PROMETHEUS_BASE_PATH,\n): string => {\n if (props.endpoint !== PrometheusEndpoint.RULES && !props.query) {\n return '';\n }\n const params = getSearchParams(props);\n return `${basePath}/${props.endpoint}?${params.toString()}`;\n};\n\ntype PrometheusURLProps = {\n endpoint: PrometheusEndpoint;\n endTime?: number;\n namespace?: string;\n query?: string;\n samples?: number;\n timeout?: string;\n timespan?: number;\n};\n","export { useFlag } from '@console/dynamic-plugin-sdk/src/utils/flags';\n","import * as React from 'react';\n\nexport const useBoolean = (\n initialValue: boolean,\n): [boolean, () => void, () => void, () => void] => {\n const [value, setValue] = React.useState(initialValue);\n const toggle = React.useCallback(() => setValue((v) => !v), []);\n const setTrue = React.useCallback(() => setValue(true), []);\n const setFalse = React.useCallback(() => setValue(false), []);\n return [value, toggle, setTrue, setFalse];\n};\n","import { connect } from 'react-redux';\nimport * as _ from 'lodash-es';\nimport { FLAGS } from '@console/shared/src/constants';\nimport { RootState } from '../redux';\nimport { FeatureState, FlagsObject } from './features';\n\nexport const stateToFlagsObject = (state: FeatureState, desiredFlags: string[]): FlagsObject =>\n desiredFlags.reduce((allFlags, f) => ({ ...allFlags, [f]: state.get(f) }), {} as FlagsObject);\n\nconst stateToProps = (state: FeatureState, desiredFlags: string[]): WithFlagsProps => ({\n flags: stateToFlagsObject(state, desiredFlags),\n});\n\nexport type WithFlagsProps = {\n flags: FlagsObject;\n};\n\nexport type ConnectToFlags = <P extends WithFlagsProps>(\n ...flags: (FLAGS | string)[]\n) => (\n C: React.ComponentType<P>,\n) => React.ComponentType<Omit<P, keyof WithFlagsProps>> & {\n WrappedComponent: React.ComponentType<P>;\n};\n\nexport const connectToFlags: ConnectToFlags = (...flags) =>\n connect((state: RootState) => stateToProps(state.FLAGS, flags), null, null, {\n areStatePropsEqual: _.isEqual,\n });\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\n\nimport { LoadingBox } from './status-box';\n\n/**\n * FIXME: Comparing two functions is not the *best* solution, but we can handle false negatives.\n */\nconst sameLoader = (a: () => Promise<React.ComponentType>) => (\n b: () => Promise<React.ComponentType>,\n) => a?.name === b?.name && (a || 'a').toString() === (b || 'b').toString();\n\nenum AsyncComponentError {\n ComponentNotFound = 'COMPONENT_NOT_FOUND',\n}\n\nexport class AsyncComponent extends React.Component<AsyncComponentProps, AsyncComponentState> {\n state: AsyncComponentState = { Component: null, loader: null };\n props: AsyncComponentProps;\n\n private retryCount: number = 0;\n private maxRetries: number = 25;\n private isAsyncMounted: boolean = false;\n\n static getDerivedStateFromProps(props, state) {\n if (!sameLoader(props.loader)(state.loader)) {\n return { Component: null, loader: props.loader };\n }\n return null;\n }\n\n componentDidUpdate() {\n if (this.state.Component === null) {\n this.loadComponent();\n }\n }\n\n componentDidMount() {\n this.isAsyncMounted = true;\n if (this.state.Component === null) {\n this.loadComponent();\n }\n }\n\n componentWillUnmount() {\n this.isAsyncMounted = false;\n }\n\n private loadComponent() {\n this.state\n .loader()\n .then((Component) => {\n if (!Component) {\n return Promise.reject(AsyncComponentError.ComponentNotFound);\n }\n this.isAsyncMounted && this.setState({ Component });\n })\n .catch((error) => {\n if (error === AsyncComponentError.ComponentNotFound) {\n // eslint-disable-next-line no-console\n console.error('Component does not exist in module');\n } else {\n setTimeout(() => this.loadComponent(), this.retryAfter);\n }\n });\n }\n\n private get retryAfter(): number {\n this.retryCount++;\n const base = this.retryCount < this.maxRetries ? this.retryCount : this.maxRetries;\n return 100 * Math.pow(base, 2);\n }\n\n render() {\n const { Component } = this.state;\n const { LoadingComponent = LoadingBox, forwardRef } = this.props;\n const rest = _.omit(this.props, 'loader');\n return Component != null ? <Component ref={forwardRef} {...rest} /> : <LoadingComponent />;\n }\n}\n\nexport type AsyncComponentProps = {\n loader: () => Promise<React.ComponentType>;\n LoadingComponent?: React.ReactNode;\n} & any;\nexport type AsyncComponentState = {\n Component: React.ComponentType;\n loader: () => Promise<React.ComponentType>;\n};\n","import * as _ from 'lodash';\nimport { Store } from 'redux';\nimport { RootState } from '@console/internal/redux';\nimport { isExtensionInUse, PluginStore, DynamicPluginInfo } from '../store';\nimport { Extension, ExtensionTypeGuard, LoadedExtension } from '../typings';\n\nlet subscriptionServiceInitialized = false;\n\nconst extensionSubscriptions: ExtensionSubscription[] = [];\nconst dynamicPluginListeners: DynamicPluginListener[] = [];\n\nlet onExtensionSubscriptionAdded: (sub: ExtensionSubscription) => void = _.noop;\nlet onDynamicPluginListenerAdded: (listener: DynamicPluginListener) => void = _.noop;\n\nconst subscribe = <T>(sub: T, subList: T[], invokeListener: VoidFunction): VoidFunction => {\n let isSubscribed = true;\n\n subList.push(sub);\n invokeListener();\n\n return () => {\n if (isSubscribed) {\n isSubscribed = false;\n subList.splice(subList.indexOf(sub), 1);\n }\n };\n};\n\nexport const initSubscriptionService = (pluginStore: PluginStore, reduxStore: Store<RootState>) => {\n if (subscriptionServiceInitialized) {\n throw new Error('Subscription service is already initialized');\n }\n\n subscriptionServiceInitialized = true;\n\n const getExtensionsInUse = () => pluginStore.getExtensionsInUse();\n const getFlags = () => reduxStore.getState().FLAGS;\n\n type FeatureFlags = ReturnType<typeof getFlags>;\n\n const invokeExtensionListener = (\n sub: ExtensionSubscription,\n currentExtensions: Extension[],\n currentFlags: FeatureFlags,\n ) => {\n // Narrow extensions according to type guards\n const matchedExtensions = _.flatMap(sub.typeGuards.map((tg) => currentExtensions.filter(tg)));\n\n // Gate matched extensions by relevant feature flags\n const extensionsInUse = matchedExtensions.filter((e) =>\n isExtensionInUse(e, currentFlags.toObject()),\n );\n\n // Invoke listener only if the extension list has changed\n if (!_.isEqual(extensionsInUse, sub.listenerLastArgs)) {\n sub.listenerLastArgs = extensionsInUse;\n sub.listener(extensionsInUse);\n }\n };\n\n onExtensionSubscriptionAdded = (sub) => {\n invokeExtensionListener(sub, getExtensionsInUse(), getFlags());\n };\n\n onDynamicPluginListenerAdded = (listener) => {\n listener(pluginStore.getDynamicPluginInfo());\n };\n\n let lastExtensions: Extension[] = null;\n let lastFlags: FeatureFlags = null;\n\n const invokeAllExtensionListeners = () => {\n if (extensionSubscriptions.length === 0) {\n return;\n }\n\n const nextExtensions = getExtensionsInUse();\n const nextFlags = getFlags();\n\n if (_.isEqual(nextExtensions, lastExtensions) && nextFlags === lastFlags) {\n return;\n }\n\n lastExtensions = nextExtensions;\n lastFlags = nextFlags;\n\n extensionSubscriptions.forEach((sub) => {\n invokeExtensionListener(sub, nextExtensions, nextFlags);\n });\n };\n\n let lastPluginEntries: DynamicPluginInfo[] = null;\n\n const invokeAllDynamicPluginListeners = () => {\n if (dynamicPluginListeners.length === 0) {\n return;\n }\n\n const nextPluginEntries = pluginStore.getDynamicPluginInfo();\n\n if (_.isEqual(nextPluginEntries, lastPluginEntries)) {\n return;\n }\n\n lastPluginEntries = nextPluginEntries;\n\n dynamicPluginListeners.forEach((listener) => {\n listener(nextPluginEntries);\n });\n };\n\n // Subscribe to changes in Console plugins and Redux\n pluginStore.subscribe(invokeAllExtensionListeners);\n pluginStore.subscribe(invokeAllDynamicPluginListeners);\n reduxStore.subscribe(invokeAllExtensionListeners);\n\n // Invoke listeners registered prior to initializing subscription service\n invokeAllExtensionListeners();\n invokeAllDynamicPluginListeners();\n};\n\n/**\n * Subscription based mechanism for consuming Console extensions.\n *\n * Provided listener will be invoked immediately to allow processing existing extensions.\n * It will also be invoked whenever the computed list of extension instances changes.\n *\n * _Tip: need to access extensions in a React component?_\n * - **Yes**\n * - Functional components: use `useExtensions` hook.\n * - Class components: use `withExtensions` higher-order component.\n * - **No**\n * - Use `subscribeToExtensions` function.\n *\n * @param listener Listener invoked when the list of extension instances which are\n * currently in use, narrowed by the given type guard(s), changes.\n *\n * @param typeGuards Type guard(s) used to narrow the extension instances.\n *\n * @returns Function that unsubscribes the listener.\n */\nexport const subscribeToExtensions = <E extends Extension>(\n listener: ExtensionListener<LoadedExtension<E>>,\n ...typeGuards: ExtensionTypeGuard<E>[]\n) => {\n if (typeGuards.length === 0) {\n throw new Error('You must pass at least one type guard to subscribeToExtensions');\n }\n\n const sub: ExtensionSubscription<E> = { listener, typeGuards };\n\n return subscribe<ExtensionSubscription>(sub, extensionSubscriptions, () => {\n onExtensionSubscriptionAdded(sub);\n });\n};\n\n/**\n * Subscribe to changes related to processing Console dynamic plugins.\n *\n * @param listener Listener invoked when the runtime status of a dynamic plugin changes.\n *\n * @returns Function that unsubscribes the listener.\n */\nexport const subscribeToDynamicPlugins = (listener: DynamicPluginListener) => {\n return subscribe<DynamicPluginListener>(listener, dynamicPluginListeners, () => {\n onDynamicPluginListenerAdded(listener);\n });\n};\n\n/**\n * `ExtensionListener` adapter that computes the difference between the calls.\n */\nexport const extensionDiffListener = <E extends Extension>(\n listener: (added: E[], removed: E[]) => void,\n): ExtensionListener<E> => {\n let prevExtensions: E[] = [];\n\n return (nextExtensions: E[]) => {\n listener(\n _.difference(nextExtensions, prevExtensions),\n _.difference(prevExtensions, nextExtensions),\n );\n\n prevExtensions = nextExtensions;\n };\n};\n\ntype ExtensionListener<E extends Extension> = (extensions: E[]) => void;\n\ntype ExtensionSubscription<E extends Extension = Extension> = {\n listener: ExtensionListener<E>;\n typeGuards: ExtensionTypeGuard<E>[];\n listenerLastArgs?: E[];\n};\n\ntype DynamicPluginListener = (pluginInfoEntries: DynamicPluginInfo[]) => void;\n","import * as _ from 'lodash-es';\nimport i18next from 'i18next';\n\nimport { ContainerSpec, ContainerStatus, PodKind, Volume, VolumeMount } from './types';\n\nconst getRestartPolicy = (pod: PodKind) =>\n _.find(\n {\n Always: {\n // A unique id to identify the type, used as the value when communicating with the API.\n id: 'Always',\n // What is shown in the UI.\n label: i18next.t('public~Always restart'),\n // Description in the UI.\n description: i18next.t(\n 'public~If the container restarts for any reason, restart it. Useful for stateless services that may fail from time to time.',\n ),\n // Default selection for new pods.\n default: true,\n },\n OnFailure: {\n id: 'OnFailure',\n label: i18next.t('public~Restart on failure'),\n description: i18next.t(\n 'public~If the container exits with a non-zero status code, restart it.',\n ),\n },\n Never: {\n id: 'Never',\n label: i18next.t('public~Never restart'),\n description: i18next.t(\n 'public~Never restart the container. Useful for containers that exit when they have completed a specific job, like a data import daemon.',\n ),\n },\n },\n { id: _.get<any, string>(pod, 'spec.restartPolicy') },\n );\n\nexport const VolumeSource = {\n emptyDir: {\n id: 'emptyDir',\n label: i18next.t('public~Container volume'),\n description: i18next.t(\"public~Temporary directory that shares a pod's lifetime.\"),\n },\n hostPath: {\n id: 'hostPath',\n label: i18next.t('public~Host directory'),\n description: i18next.t(\n 'public~Pre-existing host file or directory, generally for privileged system daemons or other agents tied to the host.',\n ),\n },\n gitRepo: {\n id: 'gitRepo',\n label: i18next.t('public~Git repo'),\n description: i18next.t('public~Git repository at a particular revision.'),\n },\n nfs: {\n id: 'nfs',\n label: i18next.t('public~NFS'),\n description: i18next.t('public~NFS volume that will be mounted in the host machine.'),\n },\n secret: {\n id: 'secret',\n label: i18next.t('public~Secret'),\n description: i18next.t('public~Secret to populate volume.'),\n },\n gcePersistentDisk: {\n id: 'gcePersistentDisk',\n label: i18next.t('public~GCE Persistent Disk'),\n description: i18next.t('public~GCE disk resource attached to the host machine on demand.'),\n },\n awsElasticBlockStore: {\n id: 'awsElasticBlockStore',\n label: i18next.t('public~AWS Elastic Block Store'),\n description: i18next.t('public~AWS disk resource attached to the host machine on demand.'),\n },\n glusterfs: {\n id: 'glusterfs',\n label: i18next.t('public~Gluster FS'),\n description: i18next.t('public~GlusterFS volume that will be mounted on the host machine.'),\n },\n iscsi: {\n id: 'iscsi',\n label: i18next.t('public~iSCSI'),\n description: i18next.t('public~iSCSI disk attached to host machine on demand'),\n },\n configMap: {\n id: 'configMap',\n label: i18next.t('public~ConfigMap'),\n description: i18next.t('public~ConfigMap to be consumed in volume.'),\n },\n projected: {\n id: 'projected',\n label: i18next.t('public~Projected'),\n description: i18next.t(\n 'public~A projected volume maps several existing volume sources into the same directory.',\n ),\n },\n};\n\nexport const getVolumeType = (volume: Volume) => {\n if (!volume) {\n return null;\n }\n return _.find(VolumeSource, function (v) {\n return !!volume[v.id];\n });\n};\n\nconst genericFormatter = (volInfo) => {\n const keys = Object.keys(volInfo).sort();\n const parts = keys.map(function (key) {\n if (key === 'readOnly') {\n return '';\n }\n return volInfo[key];\n });\n if (keys.indexOf('readOnly') !== -1) {\n parts.push(volInfo.readOnly ? 'ro' : 'rw');\n }\n return parts.join(' ') || null;\n};\n\nexport const getVolumeLocation = (volume: Volume) => {\n const vtype = getVolumeType(volume);\n if (!vtype) {\n return null;\n }\n\n const typeID = vtype.id;\n const info = volume[typeID];\n switch (typeID) {\n // Override any special formatting cases.\n case VolumeSource.gitRepo.id:\n return `${info.repository}:${info.revision}`;\n case VolumeSource.configMap.id:\n case VolumeSource.emptyDir.id:\n case VolumeSource.secret.id:\n case VolumeSource.projected.id:\n return null;\n // Defaults to space separated sorted keys.\n default:\n return genericFormatter(info);\n }\n};\n\nexport const getRestartPolicyLabel = (pod: PodKind) => _.get(getRestartPolicy(pod), 'label', '');\n\nexport type PodReadiness = string;\nexport type PodPhase = string;\n\nexport const getVolumeMountPermissions = (v: VolumeMount) => {\n if (!v) {\n return null;\n }\n\n return v.readOnly ? 'Read-only' : 'Read/Write';\n};\n\nexport const getVolumeMountsByPermissions = (pod: PodKind) => {\n if (!pod || !pod.spec || !pod.spec.volumes) {\n return [];\n }\n const m = {};\n\n const volumes = (pod.spec.volumes || []).reduce((p, v: Volume) => {\n p[v.name] = v;\n return p;\n }, {});\n\n _.forEach(pod.spec.containers, (c: ContainerSpec) => {\n _.forEach(c.volumeMounts, (v: VolumeMount) => {\n const k = `${v.name}_${v.readOnly ? 'ro' : 'rw'}`;\n const mount = { container: c.name, mountPath: v.mountPath, subPath: v.subPath };\n if (k in m) {\n return m[k].mounts.push(mount);\n }\n m[k] = { mounts: [mount], name: v.name, readOnly: !!v.readOnly, volume: volumes[v.name] };\n });\n });\n\n return _.values(m);\n};\n\nexport const podRestarts = (pod: PodKind): number => {\n if (!pod || !pod.status) {\n return 0;\n }\n const { initContainerStatuses = [], containerStatuses = [] } = pod.status;\n const isInitializing = initContainerStatuses.some(({ state }) => {\n return !state.terminated || state.terminated.exitCode !== 0;\n });\n const toCheck = isInitializing ? initContainerStatuses : containerStatuses;\n return toCheck.reduce(\n (restartCount, status: ContainerStatus) => restartCount + status.restartCount,\n 0,\n );\n};\n\nexport const podReadiness = (pod: PodKind): { readyCount: number; totalContainers: number } => {\n // Don't include init containers in readiness count. This is consistent with the CLI.\n const containerStatuses = pod?.status?.containerStatuses || [];\n return containerStatuses.reduce(\n (acc, { ready }: ContainerStatus) => {\n if (ready) {\n acc.readyCount = acc.readyCount + 1;\n }\n return acc;\n },\n { readyCount: 0, totalContainers: containerStatuses.length },\n );\n};\n\n// This logic is replicated from k8s (at this writing, Kubernetes 1.17)\n// (See https://github.com/kubernetes/kubernetes/blob/release-1.17/pkg/printers/internalversion/printers.go)\nexport const podPhase = (pod: PodKind): PodPhase => {\n if (!pod || !pod.status) {\n return '';\n }\n\n if (pod.metadata.deletionTimestamp) {\n return 'Terminating';\n }\n\n if (pod.status.reason === 'NodeLost') {\n return 'Unknown';\n }\n\n if (pod.status.reason === 'Evicted') {\n return 'Evicted';\n }\n\n let initializing = false;\n let phase = pod.status.phase || pod.status.reason;\n\n _.each(pod.status.initContainerStatuses, (container: ContainerStatus, i: number) => {\n const { terminated, waiting } = container.state;\n const initContainerSpec = pod.spec.initContainers.find((c) => c.name === container.name);\n\n if (terminated && terminated.exitCode === 0) {\n return true;\n }\n\n if (initContainerSpec?.restartPolicy === 'Always' && container.started) {\n return true;\n }\n\n initializing = true;\n if (terminated && terminated.reason) {\n phase = `Init:${terminated.reason}`;\n } else if (terminated && !terminated.reason) {\n phase = terminated.signal\n ? `Init:Signal:${terminated.signal}`\n : `Init:ExitCode:${terminated.exitCode}`;\n } else if (waiting && waiting.reason && waiting.reason !== 'PodInitializing') {\n phase = `Init:${waiting.reason}`;\n } else {\n phase = `Init:${i}/${pod.status.initContainerStatuses.length}`;\n }\n return false;\n });\n\n if (!initializing) {\n let hasRunning = false;\n const containerStatuses = pod.status.containerStatuses || [];\n for (let i = containerStatuses.length - 1; i >= 0; i--) {\n const {\n state: { running, terminated, waiting },\n ready,\n } = containerStatuses[i];\n if (terminated && terminated.reason) {\n phase = terminated.reason;\n } else if (waiting && waiting.reason) {\n phase = waiting.reason;\n } else if (waiting && !waiting.reason) {\n phase = terminated.signal\n ? `Signal:${terminated.signal}`\n : `ExitCode:${terminated.exitCode}`;\n } else if (running && ready) {\n hasRunning = true;\n }\n }\n\n // Change pod status back to \"Running\" if there is at least one container\n // still reporting as \"Running\" status.\n if (phase === 'Completed' && hasRunning) {\n phase = 'Running';\n }\n }\n\n return phase;\n};\n\nexport const podPhaseFilterReducer = (pod: PodKind): PodPhase => {\n const status = podPhase(pod);\n if (status === 'Terminating') {\n return status;\n }\n if (status.includes('CrashLoopBackOff')) {\n return 'CrashLoopBackOff';\n }\n return _.get(pod, 'status.phase', 'Unknown');\n};\n\nexport const isWindowsPod = (pod: PodKind): boolean => {\n return pod?.spec?.tolerations?.some((t) => t.key === 'os' && t.value === 'Windows');\n};\n\nexport const isContainerCrashLoopBackOff = (pod: PodKind, containerName: string): boolean => {\n const containerStatus = pod?.status?.containerStatuses?.find((c) => c.name === containerName);\n const waitingReason = containerStatus?.state?.waiting?.reason;\n return waitingReason === 'CrashLoopBackOff';\n};\n","import { applyMiddleware, combineReducers, createStore, compose, ReducersMapObject } from 'redux';\nimport * as _ from 'lodash-es';\nimport thunk from 'redux-thunk';\nimport {\n ResolvedExtension,\n ReduxReducer,\n SDKReducers,\n SDKStoreState,\n} from '@console/dynamic-plugin-sdk';\nimport { FeatureSubStore } from '@console/dynamic-plugin-sdk/src/app/features';\nimport { featureReducer, featureReducerName } from './reducers/features';\nimport ObserveReducers, { ObserveState } from './reducers/observe';\nimport UIReducers, { UIState } from './reducers/ui';\nimport { dashboardsReducer, DashboardsState } from './reducers/dashboards';\n\nconst composeEnhancers =\n (process.env.NODE_ENV !== 'production' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || compose;\n\nexport type RootState = {\n observe: ObserveState;\n UI: UIState;\n dashboards: DashboardsState;\n plugins?: {\n [namespace: string]: any;\n };\n} & SDKStoreState &\n FeatureSubStore;\n\nconst baseReducers = Object.freeze({\n observe: ObserveReducers,\n UI: UIReducers,\n [featureReducerName]: featureReducer,\n dashboards: dashboardsReducer,\n ...SDKReducers,\n});\n\nconst store = createStore(\n combineReducers<RootState>(baseReducers),\n {},\n composeEnhancers(applyMiddleware(thunk)),\n);\n\nexport const applyReduxExtensions = (reducerExtensions: ResolvedExtension<ReduxReducer>[]) => {\n const pluginReducers: ReducersMapObject = {};\n\n reducerExtensions.forEach(({ properties: { scope, reducer } }) => {\n pluginReducers[scope] = reducer;\n });\n\n const nextReducers: ReducersMapObject<RootState> = _.isEmpty(pluginReducers)\n ? baseReducers\n : { plugins: combineReducers(pluginReducers), ...baseReducers };\n\n store.replaceReducer(combineReducers<RootState>(nextReducers));\n};\n\nif (process.env.NODE_ENV !== 'production') {\n // Expose Redux store for debugging\n window.store = store;\n}\n\nexport default store;\n","import { coFetch } from '@console/internal/co-fetch';\nimport { ConfigMapModel } from '@console/internal/models';\nimport { ConfigMapKind, resourceURL } from '@console/internal/module/k8s';\n\nexport const USER_SETTING_CONFIGMAP_NAMESPACE = 'openshift-console-user-settings';\n\nexport const createConfigMap = async (): Promise<ConfigMapKind> => {\n try {\n const response = await coFetch('/api/console/user-settings', {\n method: 'POST',\n });\n return response.json();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('Could not create user settings ConfigMap', err);\n throw err;\n }\n};\n\nexport const updateConfigMap = async (\n configMap: ConfigMapKind,\n key: string,\n value: string,\n): Promise<ConfigMapKind> => {\n const url = resourceURL(ConfigMapModel, {\n ns: configMap.metadata.namespace,\n name: configMap.metadata.name,\n });\n const patch = {\n data: {\n [key]: value,\n },\n };\n // Use JSON Merge Patch instead of normal JSON Patch because JSON Patch calls\n // fail if there is no data defined.\n try {\n const response = await coFetch(url, {\n method: 'PATCH',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/merge-patch+json;charset=UTF-8',\n },\n body: JSON.stringify(patch),\n });\n return response.json();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('Could not update (patch) user settings ConfigMap', err);\n throw err;\n }\n};\n\nexport const deseralizeData = (data: string | null) => {\n if (typeof data !== 'string') {\n return data;\n }\n try {\n return JSON.parse(data);\n } catch {\n return data;\n }\n};\n\nexport const seralizeData = <T>(data: T) => {\n if (typeof data === 'string') {\n return data;\n }\n return JSON.stringify(data);\n};\n","import { Alert } from '@console/dynamic-plugin-sdk';\n\nexport const getAlertSeverity = (alert: Alert) =>\n alert && alert.labels ? alert.labels.severity : null;\nexport const getAlertMessage = (alert: Alert) =>\n alert && alert.annotations ? alert.annotations.message : null;\nexport const getAlertDescription = (alert: Alert) =>\n alert && alert.annotations ? alert.annotations.description : null;\nexport const getAlertSummary = (alert: Alert) => alert?.annotations?.summary || null;\nexport const getAlertTime = (alert: Alert) => (alert ? alert.activeAt : null);\nexport const getAlertName = (alert: Alert) =>\n alert && alert.labels ? alert.labels.alertname : null;\n","import * as _ from 'lodash-es';\nimport { ExtensionK8sGroupModel } from '@console/dynamic-plugin-sdk/src/api/common-types';\nimport {\n CustomResourceDefinitionKind,\n GroupVersionKind,\n K8sKind,\n K8sResourceCommon,\n K8sResourceKind,\n K8sResourceKindReference,\n OwnerReference,\n modelFor,\n} from './index';\nimport { referenceForGroupVersionKind, referenceForModel } from './k8s-ref';\n\nexport * from './k8s-ref';\n\nexport const getQN: (obj: K8sResourceKind) => string = (obj) => {\n const { name, namespace } = obj.metadata;\n // Name + namespace is not unique for PackageManifest resources, so include the catalog source.\n // TODO: We should be able to remove this when the upstream OLM bug is fixed:\n // https://bugzilla.redhat.com/show_bug.cgi?id=1814822\n if (obj.apiVersion === 'packages.operators.coreos.com/v1' && obj.kind === 'PackageManifest') {\n return `(${obj.status?.catalogSource})-${name}`;\n }\n return (namespace ? `(${namespace})-` : '') + name;\n};\n\nexport const k8sBasePath = `${window.SERVER_FLAGS.basePath}api/kubernetes`;\n\nexport const getGroupVersionKind = (\n ref: GroupVersionKind | string,\n): [string, string, string] | undefined => {\n const parts = ref.split('~');\n if (parts.length !== 3) {\n return undefined;\n }\n return parts as [string, string, string];\n};\n\nexport const isGroupVersionKind = (ref: GroupVersionKind | string) => ref?.split('~').length === 3;\n\nexport const groupVersionFor = (apiVersion: string) => ({\n group: apiVersion.split('/').length === 2 ? apiVersion.split('/')[0] : 'core',\n version: apiVersion.split('/').length === 2 ? apiVersion.split('/')[1] : apiVersion,\n});\n\nconst parseAPIVersion = (version: string) => {\n const parsed = /^v(\\d+)(?:(alpha|beta)(\\d+))?$/.exec(version);\n return parsed\n ? { majorVersion: Number(parsed[1]), qualifier: parsed[2], minorVersion: Number(parsed[3]) }\n : null;\n};\n\nexport const apiVersionCompare = (v1: string, v2: string) => {\n const v1Parsed = parseAPIVersion(v1);\n const v2Parsed = parseAPIVersion(v2);\n\n // Check null parsed versions first\n if (!v1Parsed || !v2Parsed) {\n // If a value fails null check order it last\n if (v1Parsed) {\n return -1;\n }\n if (v2Parsed) {\n return 1;\n }\n return v1.localeCompare(v2);\n }\n // Then sort on major version with no qualifiers: v3 > v1\n if (\n v1Parsed.majorVersion !== v2Parsed.majorVersion &&\n !v1Parsed.qualifier &&\n !v2Parsed.qualifier\n ) {\n return v2Parsed.majorVersion - v1Parsed.majorVersion;\n }\n // Then sort on any version with no qualifier over a qualifier: v1 > v3alpha\n if (_.isEmpty(v1Parsed.qualifier) !== _.isEmpty(v2Parsed.qualifier)) {\n return v1Parsed.qualifier ? 1 : -1;\n }\n // Beta beats alpha: v1beta1 > v1alpha1\n const isBetaV1 = v1Parsed.qualifier === 'beta';\n const isBetaV2 = v2Parsed.qualifier === 'beta';\n if (isBetaV1 !== isBetaV2) {\n return isBetaV1 ? -1 : 1;\n }\n // Same qualifier, then numeric values win: v2beta2 > v1beta2\n if (v1Parsed.majorVersion !== v2Parsed.majorVersion) {\n return v2Parsed.majorVersion - v1Parsed.majorVersion;\n }\n // Finally compare minor version: v1beta2 > v1beta1\n return v2Parsed.minorVersion - v1Parsed.minorVersion;\n};\n\nexport const getLatestVersionForCRD = (crd: CustomResourceDefinitionKind) => {\n const sorted = crd.spec.versions\n ?.filter((version) => version.served)\n ?.map(({ name }) => name)\n ?.sort(apiVersionCompare);\n return sorted[0];\n};\n\nexport const referenceForCRD = (obj: CustomResourceDefinitionKind): GroupVersionKind =>\n referenceForGroupVersionKind(obj.spec.group)(getLatestVersionForCRD(obj))(obj.spec.names.kind);\n\nexport const referenceForOwnerRef = (ownerRef: OwnerReference): GroupVersionKind =>\n referenceForGroupVersionKind(groupVersionFor(ownerRef.apiVersion).group)(\n groupVersionFor(ownerRef.apiVersion).version,\n )(ownerRef.kind);\n\nexport const referenceForExtensionModel = (model: ExtensionK8sGroupModel): GroupVersionKind =>\n referenceForGroupVersionKind(model?.group || 'core')(model?.version)(model?.kind);\n\nexport const referenceFor = ({ kind, apiVersion }: K8sResourceCommon): GroupVersionKind => {\n if (!kind) {\n return '';\n }\n\n // `apiVersion` is optional in some k8s object references (for instance,\n // event `involvedObject`). The CLI resolves the version from API discovery.\n // Use `modelFor` to get the version from the model when missing.\n if (!apiVersion) {\n const m = modelFor(kind);\n return m ? referenceForModel(m) : '';\n }\n\n const { group, version } = groupVersionFor(apiVersion);\n return referenceForGroupVersionKind(group)(version)(kind);\n};\n\nexport const kindForReference = (ref: K8sResourceKindReference) =>\n isGroupVersionKind(ref) ? ref.split('~')[2] : ref;\n\nexport const apiGroupForReference = (ref: GroupVersionKind) => ref.split('~')[0];\n\nexport const versionForReference = (ref: GroupVersionKind) => ref.split('~')[1];\n\nexport const apiVersionForReference = (ref: GroupVersionKind) =>\n isGroupVersionKind(ref) ? `${ref.split('~')[0]}/${ref.split('~')[1]}` : ref;\n\nexport const nameForModel = (model: K8sKind) => [model.plural, model.apiGroup].join('.');\n","export const LAST_PERSPECTIVE_USER_SETTINGS_KEY = 'console.lastPerspective';\nexport const LAST_PERSPECTIVE_LOCAL_STORAGE_KEY = `bridge/last-perspective`;\nexport const HIDE_USER_WORKLOAD_NOTIFICATIONS_USER_SETTINGS_KEY =\n 'console.hideUserWorkloadNotifications';\nexport const FLAG_DEVELOPER_PERSPECTIVE = 'DEVELOPER_PERSPECTIVE';\nexport const ACM_PERSPECTIVE_ID = 'acm';\nexport const ADMIN_PERSPECTIVE_ID = 'admin';\n","import * as _ from 'lodash';\nimport { K8sModel } from '../../../api/common-types';\nimport * as k8sActions from '../../../app/k8s/actions/k8s';\nimport { SDKStoreState } from '../../../app/redux-types';\nimport { WatchK8sResource } from '../../../extensions/console-types';\nimport { CustomError } from '../../error/custom-error';\nimport { getReferenceForModel } from '../k8s-ref';\nimport { GetIDAndDispatch, MakeQuery, Query } from './k8s-watch-types';\n\nexport class NoModelError extends CustomError {\n constructor() {\n super('Model does not exist');\n }\n}\n\nexport const makeReduxID = (k8sKind: K8sModel, query: Query) => {\n let qs = '';\n if (!_.isEmpty(query)) {\n qs = `---${JSON.stringify(query)}`;\n }\n\n return `${getReferenceForModel(k8sKind || ({} as K8sModel))}${qs}`;\n};\n\nexport const makeQuery: MakeQuery = (namespace, labelSelector, fieldSelector, name, limit) => {\n const query: Query = {};\n\n if (!_.isEmpty(labelSelector)) {\n query.labelSelector = labelSelector;\n }\n\n if (!_.isEmpty(namespace)) {\n query.ns = namespace;\n }\n\n if (!_.isEmpty(name)) {\n query.name = name;\n }\n\n if (fieldSelector) {\n query.fieldSelector = fieldSelector;\n }\n\n if (limit) {\n query.limit = limit;\n }\n return query;\n};\n\nexport const INTERNAL_REDUX_IMMUTABLE_TOARRAY_CACHE_SYMBOL = Symbol('_cachedToArrayResult');\nexport const INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL = Symbol('_cachedToJSONResult');\n\nexport const getReduxData = (immutableData, resource: WatchK8sResource) => {\n if (!immutableData) {\n return null;\n }\n if (resource.isList && immutableData.toArray) {\n if (!immutableData[INTERNAL_REDUX_IMMUTABLE_TOARRAY_CACHE_SYMBOL]) {\n immutableData[INTERNAL_REDUX_IMMUTABLE_TOARRAY_CACHE_SYMBOL] = immutableData\n .toArray()\n .map((a) => {\n if (a.toJSON) {\n if (!a[INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL]) {\n a[INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL] = a.toJSON();\n }\n return a[INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL];\n }\n return a;\n });\n }\n return immutableData[INTERNAL_REDUX_IMMUTABLE_TOARRAY_CACHE_SYMBOL];\n }\n if (immutableData.toJSON) {\n if (!immutableData[INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL]) {\n immutableData[INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL] = immutableData.toJSON();\n }\n return immutableData[INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL];\n }\n return null;\n};\n\nexport const getIDAndDispatch: GetIDAndDispatch<SDKStoreState> = (resource, k8sModel) => {\n if (!k8sModel || !resource) {\n return null;\n }\n const query = makeQuery(\n resource.namespace,\n resource.selector,\n resource.fieldSelector,\n resource.name,\n resource.limit,\n );\n const id = makeReduxID(k8sModel, query);\n const dispatch = resource.isList\n ? k8sActions.watchK8sList(id, query, k8sModel, null, resource.partialMetadata)\n : k8sActions.watchK8sObject(\n id,\n resource.name,\n resource.namespace,\n query,\n k8sModel,\n resource.partialMetadata,\n );\n return { id, dispatch };\n};\n","import * as React from 'react';\nimport * as classNames from 'classnames';\nimport * as _ from 'lodash-es';\nimport { Link } from 'react-router-dom-v5-compat';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useSelector } from 'react-redux';\nimport { useTranslation } from 'react-i18next';\nimport {\n Breadcrumb,\n BreadcrumbItem,\n Button,\n Split,\n SplitItem,\n Text,\n TextContent,\n TextVariants,\n} from '@patternfly/react-core';\nimport { ResourceStatus } from '@console/dynamic-plugin-sdk';\nimport { RootState } from '@console/internal/redux';\nimport {\n OverviewItem,\n Status,\n HealthChecksAlert,\n YellowExclamationTriangleIcon,\n useCsvWatchResource,\n} from '@console/shared';\nimport { getActiveNamespace } from '@console/internal/reducers/ui';\nimport {\n ActionsMenu,\n FirehoseResult,\n KebabAction,\n KebabOption,\n ResourceIcon,\n resourcePath,\n} from './index';\nimport { connectToModel } from '../../kinds';\nimport {\n K8sKind,\n K8sResourceKind,\n K8sResourceKindReference,\n referenceForModel,\n} from '../../module/k8s';\nimport { ManagedByOperatorLink } from './managed-by';\n\nexport const ResourceItemDeleting = () => {\n const { t } = useTranslation();\n return (\n <span className=\"co-resource-item__deleting\">\n <YellowExclamationTriangleIcon /> {t('public~Deleting')}\n </span>\n );\n};\n\nexport const BreadCrumbs: React.SFC<BreadCrumbsProps> = ({ breadcrumbs }) => (\n <Breadcrumb className=\"co-breadcrumb\">\n {breadcrumbs.map((crumb, i, { length }) => {\n const isLast = i === length - 1;\n\n return (\n <BreadcrumbItem key={i} isActive={isLast}>\n {isLast ? (\n crumb.name\n ) : (\n <Link\n className=\"pf-v5-c-breadcrumb__link\"\n to={crumb.path}\n data-test-id={`breadcrumb-link-${i}`}\n >\n {crumb.name}\n </Link>\n )}\n </BreadcrumbItem>\n );\n })}\n </Breadcrumb>\n);\n\nexport const ActionButtons: React.SFC<ActionButtonsProps> = ({ actionButtons }) => (\n <div className=\"co-action-buttons\">\n {_.map(actionButtons, (actionButton, i) => {\n if (!_.isEmpty(actionButton)) {\n return (\n <Button\n className=\"co-action-buttons__btn\"\n variant=\"primary\"\n onClick={actionButton.callback}\n key={i}\n data-test={actionButton.label}\n >\n {actionButton.label}\n </Button>\n );\n }\n })}\n </div>\n);\n\nexport const PageHeading = connectToModel((props: PageHeadingProps) => {\n const {\n kind,\n kindObj,\n detail,\n title,\n menuActions,\n buttonActions,\n customActionMenu,\n link,\n obj,\n breadcrumbs,\n breadcrumbsFor,\n titleFunc,\n style,\n customData,\n badge,\n getResourceStatus = (resource: K8sResourceKind): string =>\n _.get(resource, ['status', 'phase'], null),\n className,\n centerText,\n helpText,\n 'data-test': dataTestId,\n } = props;\n const extraResources = _.reduce(\n props.resourceKeys,\n (extraObjs, key) => ({ ...extraObjs, [key]: _.get(props[key], 'data') }),\n {},\n );\n const data = _.get(obj, 'data');\n const resourceTitle = titleFunc && data ? titleFunc(data) : title;\n const hasButtonActions = !_.isEmpty(buttonActions);\n const hasMenuActions = _.isFunction(menuActions) || !_.isEmpty(menuActions);\n const hasData = !_.isEmpty(data);\n const showActions =\n (hasButtonActions || hasMenuActions || customActionMenu) &&\n hasData &&\n !_.get(data, 'metadata.deletionTimestamp');\n const resourceStatus = hasData && getResourceStatus ? getResourceStatus(data) : null;\n const showHeading = props.icon || kind || resourceTitle || resourceStatus || badge || showActions;\n const showBreadcrumbs = breadcrumbs || (breadcrumbsFor && !_.isEmpty(data));\n return (\n <>\n {showBreadcrumbs && (\n <div className=\"pf-v5-c-page__main-breadcrumb\">\n <Split style={{ alignItems: 'baseline' }}>\n <SplitItem isFilled>\n <BreadCrumbs breadcrumbs={breadcrumbs || breadcrumbsFor(data)} />\n </SplitItem>\n {badge && (\n <SplitItem>{<span className=\"co-m-pane__heading-badge\">{badge}</span>}</SplitItem>\n )}\n </Split>\n </div>\n )}\n <div\n data-test-id={dataTestId}\n className={classNames(\n 'co-m-nav-title',\n { 'co-m-nav-title--detail': detail },\n { 'co-m-nav-title--logo': props.icon },\n { 'co-m-nav-title--breadcrumbs': showBreadcrumbs },\n className,\n )}\n style={style}\n >\n {showHeading && (\n <Text\n component={TextVariants.h1}\n className={classNames('co-m-pane__heading', {\n 'co-m-pane__heading--baseline': link,\n 'co-m-pane__heading--center': centerText,\n 'co-m-pane__heading--logo': props.icon,\n 'co-m-pane__heading--with-help-text': helpText,\n })}\n >\n {props.icon ? (\n <props.icon obj={data} />\n ) : (\n <div className=\"co-m-pane__name co-resource-item\">\n {kind && <ResourceIcon kind={kind} className=\"co-m-resource-icon--lg\" />}{' '}\n <span data-test-id=\"resource-title\" className=\"co-resource-item__resource-name\">\n {resourceTitle}\n {data?.metadata?.namespace && data?.metadata?.ownerReferences?.length && (\n <ManagedByOperatorLink obj={data} />\n )}\n </span>\n {resourceStatus && (\n <ResourceStatus additionalClassNames=\"hidden-xs\">\n <Status status={resourceStatus} />\n </ResourceStatus>\n )}\n </div>\n )}\n {!breadcrumbsFor && !breadcrumbs && badge && (\n <span className=\"co-m-pane__heading-badge\">{badge}</span>\n )}\n {link && <div className=\"co-m-pane__heading-link\">{link}</div>}\n {showActions && (\n <div className=\"co-actions\" data-test-id=\"details-actions\">\n {hasButtonActions && (\n <ActionButtons actionButtons={buttonActions.map((a) => a(kindObj, data))} />\n )}\n {hasMenuActions && (\n <ActionsMenu\n actions={\n _.isFunction(menuActions)\n ? menuActions(kindObj, data, extraResources, customData)\n : menuActions.map((a) => a(kindObj, data, extraResources, customData))\n }\n />\n )}\n {_.isFunction(customActionMenu)\n ? customActionMenu(kindObj, data)\n : customActionMenu}\n </div>\n )}\n </Text>\n )}\n {helpText && (\n <TextContent>\n <Text component={TextVariants.p} className=\"help-block co-m-pane__heading-help-text\">\n {helpText}\n </Text>\n </TextContent>\n )}\n {props.children}\n </div>\n </>\n );\n});\n\nexport const SectionHeading: React.SFC<SectionHeadingProps> = ({\n text,\n children,\n style,\n required,\n id,\n}) => (\n <h2 className=\"co-section-heading\" style={style} data-test-section-heading={text} id={id}>\n <span\n className={classNames({\n 'co-required': required,\n })}\n >\n {text}\n </span>\n {children}\n </h2>\n);\n\nexport const SidebarSectionHeading: React.SFC<SidebarSectionHeadingProps> = ({\n text,\n children,\n style,\n className,\n}) => (\n <h2 className={`sidebar__section-heading ${className}`} style={style}>\n {text}\n {children}\n </h2>\n);\n\nexport const ResourceOverviewHeading: React.SFC<ResourceOverviewHeadingProps> = ({\n kindObj,\n actions,\n resources,\n}) => {\n const { obj: resource, ...otherResources } = resources;\n const ns = useSelector((state: RootState) => getActiveNamespace(state));\n const { csvData } = useCsvWatchResource(ns);\n const isDeleting = !!resource.metadata.deletionTimestamp;\n return (\n <div className=\"overview__sidebar-pane-head resource-overview__heading\">\n <h1 className=\"co-m-pane__heading\">\n <div className=\"co-m-pane__name co-resource-item\">\n <ResourceIcon\n className=\"co-m-resource-icon--lg\"\n kind={kindObj.crd ? referenceForModel(kindObj) : resource.kind}\n />\n <Link\n to={resourcePath(\n kindObj.crd ? referenceForModel(kindObj) : resource.kind,\n resource.metadata.name,\n resource.metadata.namespace,\n )}\n className=\"co-resource-item__resource-name\"\n >\n {resource.metadata.name}\n </Link>\n {isDeleting && <ResourceItemDeleting />}\n </div>\n {!isDeleting && (\n <div className=\"co-actions\">\n <ActionsMenu\n actions={actions.map((a) => a(kindObj, resource, otherResources, { csvs: csvData }))}\n />\n </div>\n )}\n </h1>\n <HealthChecksAlert resource={resource} />\n </div>\n );\n};\n\nexport type ActionButtonsProps = {\n actionButtons: any[];\n};\n\nexport type BreadCrumbsProps = {\n breadcrumbs: { name: string; path: string }[];\n};\n\nexport type KebabOptionsCreator = (\n kindObj: K8sKind,\n data: K8sResourceKind,\n extraResources?: { [prop: string]: K8sResourceKind | K8sResourceKind[] },\n customData?: any,\n) => KebabOption[];\n\nexport type PageHeadingProps = {\n 'data-test'?: string;\n breadcrumbs?: { name: string; path: string }[];\n breadcrumbsFor?: (obj: K8sResourceKind) => { name: string; path: string }[];\n buttonActions?: any[];\n children?: React.ReactChildren;\n detail?: boolean;\n kind?: K8sResourceKindReference;\n kindObj?: K8sKind;\n menuActions?: Function[] | KebabOptionsCreator; // FIXME should be \"KebabAction[] |\" refactor pipeline-actions.tsx, etc.\n customActionMenu?:\n | React.ReactNode\n | ((kindObj: K8sKind, obj: K8sResourceKind) => React.ReactNode); // Renders a custom action menu.\n link?: React.ReactNode;\n obj?: FirehoseResult<K8sResourceKind>;\n resourceKeys?: string[];\n style?: object;\n title?: string | JSX.Element;\n titleFunc?: (obj: K8sResourceKind) => string | JSX.Element;\n customData?: any;\n badge?: React.ReactNode;\n icon?: React.ComponentType<{ obj?: K8sResourceKind }>;\n getResourceStatus?: (resource: K8sResourceKind) => string;\n className?: string;\n centerText?: boolean;\n helpText?: React.ReactNode;\n};\n\nexport type ResourceOverviewHeadingProps = {\n actions: KebabAction[];\n kindObj: K8sKind;\n resources?: OverviewItem;\n};\n\nexport type SectionHeadingProps = {\n children?: any;\n style?: any;\n text: string;\n required?: boolean;\n id?: string;\n};\n\nexport type SidebarSectionHeadingProps = {\n children?: any;\n style?: any;\n className?: string;\n text: string;\n};\n\nBreadCrumbs.displayName = 'BreadCrumbs';\nPageHeading.displayName = 'PageHeading';\nResourceOverviewHeading.displayName = 'ResourceOverviewHeading';\nSectionHeading.displayName = 'SectionHeading';\nSidebarSectionHeading.displayName = 'SidebarSectionHeading';\n","// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useSelector } from 'react-redux';\nimport { K8sModel } from '../../../api/common-types';\nimport {\n UseK8sModel,\n K8sResourceKindReference,\n K8sGroupVersionKind,\n} from '../../../extensions/console-types';\nimport { getGroupVersionKindForReference, transformGroupVersionKindToReference } from '../k8s-ref';\n\nexport const getK8sModel = (\n k8s,\n k8sGroupVersionKind?: K8sResourceKindReference | K8sGroupVersionKind,\n): K8sModel => {\n const kindReference = transformGroupVersionKindToReference(k8sGroupVersionKind);\n return kindReference\n ? k8s.getIn(['RESOURCES', 'models', kindReference]) ??\n k8s.getIn(['RESOURCES', 'models', getGroupVersionKindForReference(kindReference).kind])\n : undefined;\n};\n\n/**\n * Hook that retrieves the k8s model for provided K8sGroupVersionKind from redux.\n * @param groupVersionKind group, version, kind of k8s resource `K8sGroupVersionKind` is preferred alternatively can pass reference for group, version, kind which is deprecated i.e `group~version~kind` `K8sResourceKindReference`.\n * @returns An array with the first item as k8s model and second item as inFlight status\n * @example\n * ```ts\n * const Component: React.FC = () => {\n * const [model, inFlight] = useK8sModel({ group: 'app'; version: 'v1'; kind: 'Deployment' });\n * return ...\n * }\n * ```\n */\nexport const useK8sModel: UseK8sModel = (k8sGroupVersionKind) => [\n useSelector(({ k8s }) => getK8sModel(k8s, k8sGroupVersionKind)),\n useSelector(({ k8s }) => k8s.getIn(['RESOURCES', 'inFlight']) ?? false),\n];\n","import * as React from 'react';\nimport { createHash } from 'crypto-browserify';\n// FIXME upgrading redux types is causing many errors at this time\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useSelector } from 'react-redux';\nimport { UseUserSettings, getImpersonate, getUser } from '@console/dynamic-plugin-sdk';\nimport { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';\nimport { ConfigMapModel } from '@console/internal/models';\nimport { K8sResourceKind } from '@console/internal/module/k8s';\nimport { RootState } from '@console/internal/redux';\nimport {\n createConfigMap,\n deseralizeData,\n seralizeData,\n updateConfigMap,\n USER_SETTING_CONFIGMAP_NAMESPACE,\n} from '../utils/user-settings';\nimport { useUserSettingsLocalStorage } from './useUserSettingsLocalStorage';\n\nconst alwaysUseFallbackLocalStorage = window.SERVER_FLAGS.userSettingsLocation === 'localstorage';\nif (alwaysUseFallbackLocalStorage) {\n // eslint-disable-next-line no-console\n console.info('user-settings will be stored in localstorage instead of configmap.');\n}\n\nconst useCounterRef = (initialValue: number = 0): [boolean, () => void, () => void] => {\n const counterRef = React.useRef<number>(initialValue);\n const increment = React.useCallback(() => {\n counterRef.current += 1;\n }, []);\n const decrement = React.useCallback(() => {\n counterRef.current -= 1;\n }, []);\n return [counterRef.current !== initialValue, increment, decrement];\n};\n\nexport const useUserSettings: UseUserSettings = <T>(key, defaultValue, sync = false) => {\n // Mount status for safety state updates\n const mounted = React.useRef(true);\n React.useEffect(() => () => (mounted.current = false), []);\n\n // Keys and values\n const keyRef = React.useRef<string>(key?.replace(/[^-._a-zA-Z0-9]/g, '_'));\n const defaultValueRef = React.useRef<T>(defaultValue);\n\n // Settings\n const [settings, setSettingsUnsafe] = React.useState<T>();\n const setSettings: typeof setSettingsUnsafe = React.useCallback(\n (...args) => mounted.current && setSettingsUnsafe(...args),\n [setSettingsUnsafe],\n );\n const settingsRef = React.useRef<T>(settings);\n settingsRef.current = settings;\n\n // Loaded\n const [loaded, setLoadedUnsafe] = React.useState(false);\n const setLoaded: typeof setLoadedUnsafe = React.useCallback(\n (...args) => mounted.current && setLoadedUnsafe(...args),\n [setLoadedUnsafe],\n );\n\n // Request counter\n const [isRequestPending, increaseRequest, decreaseRequest] = useCounterRef();\n\n const hashNameOrKubeadmin = (name: string): string | null => {\n if (!name) {\n return null;\n }\n\n if (name === 'kube:admin') {\n return 'kubeadmin';\n }\n const hash = createHash('sha256');\n hash.update(name);\n return hash.digest('hex');\n };\n\n // User and impersonate\n const userUid = useSelector((state: RootState) => {\n const impersonateName = getImpersonate(state)?.name;\n const { uid, username } = getUser(state) ?? {};\n const hashName = hashNameOrKubeadmin(username);\n return impersonateName || uid || hashName || '';\n });\n\n const impersonate: boolean = useSelector((state: RootState) => !!getImpersonate(state));\n\n // Fallback\n const [fallbackLocalStorage, setFallbackLocalStorageUnsafe] = React.useState<boolean>(\n alwaysUseFallbackLocalStorage,\n );\n const setFallbackLocalStorage: typeof setFallbackLocalStorageUnsafe = React.useCallback(\n (...args) => mounted.current && setFallbackLocalStorageUnsafe(...args),\n [setFallbackLocalStorageUnsafe],\n );\n\n const isLocalStorage = fallbackLocalStorage || impersonate;\n const [lsData, setLsDataCallback] = useUserSettingsLocalStorage(\n alwaysUseFallbackLocalStorage && !impersonate\n ? 'console-user-settings'\n : `console-user-settings-${userUid}`,\n keyRef.current,\n defaultValueRef.current,\n isLocalStorage && sync,\n impersonate,\n );\n\n const configMapResource = React.useMemo(\n () =>\n !userUid || isLocalStorage\n ? null\n : {\n kind: ConfigMapModel.kind,\n namespace: USER_SETTING_CONFIGMAP_NAMESPACE,\n isList: false,\n name: `user-settings-${userUid}`,\n },\n [userUid, isLocalStorage],\n );\n const [cfData, cfLoaded, cfLoadError] = useK8sWatchResource<K8sResourceKind>(configMapResource);\n\n React.useEffect(() => {\n if (!userUid || isLocalStorage) {\n return;\n }\n if (\n // Expected load error (404 Not found) for kubeadmin or other admins,\n // who have access to the complete openshift-console-user-settings namespace.\n cfLoadError?.response?.status === 404 ||\n // Expected load error (403 Forbidden) for all other (restricted) users,\n // which have no access to non-existing ConfigMaps in openshift-console-user-settings namespace.\n cfLoadError?.response?.status === 403 ||\n (!cfData && cfLoaded)\n ) {\n (async () => {\n try {\n await createConfigMap();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('Could not create ConfigMap for user settings:', err);\n setFallbackLocalStorage(true);\n }\n })();\n } else if (\n /**\n * update settings if key is present in config map but data is not equal to settings\n */\n cfData &&\n cfLoaded &&\n cfData.data?.hasOwnProperty(keyRef.current) &&\n seralizeData(settings) !== cfData.data[keyRef.current]\n ) {\n setSettings(deseralizeData(cfData.data[keyRef.current]));\n setLoaded(true);\n } else if (\n /**\n * if key doesn't exist in config map send patch request to add the key with default value\n */\n defaultValueRef.current !== undefined &&\n cfData &&\n cfLoaded &&\n !cfData.data?.hasOwnProperty(keyRef.current)\n ) {\n // Trigger update also when unmounted\n increaseRequest();\n updateConfigMap(cfData, keyRef.current, seralizeData(defaultValueRef.current))\n .then(() => {\n decreaseRequest();\n })\n .catch(() => {\n decreaseRequest();\n });\n setSettings(defaultValueRef.current);\n setLoaded(true);\n } else if (cfLoaded && !cfLoadError) {\n setSettings(defaultValueRef.current);\n setLoaded(true);\n } else if (cfLoadError && cfLoadError.response?.status !== 404) {\n setFallbackLocalStorage(true);\n }\n // This effect should only be run on change of configmap data, status.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [cfLoadError, cfLoaded, isLocalStorage]);\n\n const callback = React.useCallback<React.Dispatch<React.SetStateAction<T>>>(\n (action: React.SetStateAction<T>) => {\n const previousSettings = settingsRef.current;\n const newState =\n typeof action === 'function' ? (action as (prevState: T) => T)(previousSettings) : action;\n setSettings(newState);\n if (cfLoaded) {\n increaseRequest();\n updateConfigMap(cfData, keyRef.current, seralizeData(newState))\n .then(() => {\n decreaseRequest();\n })\n .catch(() => {\n decreaseRequest();\n setSettings(previousSettings);\n });\n }\n },\n [cfData, cfLoaded, decreaseRequest, increaseRequest, setSettings],\n );\n\n const resultedSettings = React.useMemo(() => {\n if (sync && cfLoaded && cfData && !isRequestPending) {\n /**\n * If key is deleted from the config map then return default value\n */\n if (!cfData.data?.hasOwnProperty(keyRef.current) && settings !== undefined) {\n return defaultValueRef.current;\n }\n if (seralizeData(settingsRef.current) !== cfData?.data?.[keyRef.current]) {\n return deseralizeData(cfData?.data?.[keyRef.current]);\n }\n }\n return settings;\n }, [sync, isRequestPending, cfData, cfLoaded, settings]);\n settingsRef.current = resultedSettings;\n\n return isLocalStorage ? [lsData, setLsDataCallback, true] : [resultedSettings, callback, loaded];\n};\n","import { Map as ImmutableMap } from 'immutable';\nimport * as _ from 'lodash';\nimport {\n K8sModel,\n MatchExpression,\n MatchLabels,\n ModelDefinition,\n Selector,\n} from '../../api/common-types';\nimport { Options } from '../../api/internal-types';\nimport { QueryParams, K8sResourceKindReference } from '../../extensions/console-types';\nimport { Extension } from '../../types';\nimport { k8sBasePath } from './k8s';\nimport { getReferenceForModel } from './k8s-ref';\nimport { WSFactory, WSOptions } from './ws-factory';\n// eslint-disable-next-line\nconst staticModels = require('@console/internal/models');\n\nconst getK8sAPIPath = ({ apiGroup = 'core', apiVersion }: K8sModel): string => {\n const isLegacy = apiGroup === 'core' && apiVersion === 'v1';\n let p = isLegacy ? '/api/' : '/apis/';\n\n if (!isLegacy && apiGroup) {\n p += `${apiGroup}/`;\n }\n\n p += apiVersion;\n return p;\n};\n\nexport const getK8sResourcePath = (model: K8sModel, options: Options): string => {\n let u = getK8sAPIPath(model);\n\n if (options.ns) {\n u += `/namespaces/${options.ns}`;\n }\n u += `/${model.plural}`;\n if (options.name) {\n // Some resources like Users can have special characters in the name.\n u += `/${encodeURIComponent(options.name)}`;\n }\n if (options.path) {\n u += `/${options.path}`;\n }\n if (!_.isEmpty(options.queryParams)) {\n const q = _.map(options.queryParams, (v, k) => {\n return `${k}=${v}`;\n });\n u += `?${q.join('&')}`;\n }\n\n return u;\n};\n\nexport const resourceURL = (model: K8sModel, options: Options): string =>\n `${k8sBasePath}${getK8sResourcePath(model, options)}`;\n\nconst toArray = (value) => (Array.isArray(value) ? value : [value]);\n\nexport const requirementToString = (requirement: MatchExpression): string => {\n if (requirement.operator === 'Equals') {\n return `${requirement.key}=${requirement.values[0]}`;\n }\n\n if (requirement.operator === 'NotEquals') {\n return `${requirement.key}!=${requirement.values[0]}`;\n }\n\n if (requirement.operator === 'Exists') {\n return requirement.key;\n }\n\n if (requirement.operator === 'DoesNotExist') {\n return `!${requirement.key}`;\n }\n\n if (requirement.operator === 'In') {\n return `${requirement.key} in (${toArray(requirement.values).join(',')})`;\n }\n\n if (requirement.operator === 'NotIn') {\n return `${requirement.key} notin (${toArray(requirement.values).join(',')})`;\n }\n\n if (requirement.operator === 'GreaterThan') {\n return `${requirement.key} > ${requirement.values[0]}`;\n }\n\n if (requirement.operator === 'LessThan') {\n return `${requirement.key} < ${requirement.values[0]}`;\n }\n\n return '';\n};\n\nexport const createEquals = (key: string, value: string): MatchExpression => ({\n key,\n operator: 'Equals',\n values: [value],\n});\n\nconst isOldFormat = (selector: Selector | MatchLabels) =>\n !selector.matchLabels && !selector.matchExpressions;\n\nexport const toRequirements = (selector: Selector = {}): MatchExpression[] => {\n const requirements = [];\n const matchLabels = isOldFormat(selector) ? selector : selector.matchLabels;\n const { matchExpressions } = selector;\n\n Object.keys(matchLabels || {})\n .sort()\n .forEach((k) => {\n requirements.push(createEquals(k, matchLabels[k]));\n });\n\n (matchExpressions || []).forEach((me) => {\n requirements.push(me);\n });\n\n return requirements;\n};\n\nexport const selectorToString = (selector: Selector): string => {\n const requirements = toRequirements(selector);\n return requirements.map(requirementToString).join(',');\n};\n\nexport const k8sWatch = (\n kind: K8sModel,\n query: {\n labelSelector?: Selector;\n resourceVersion?: string;\n ns?: string;\n fieldSelector?: string;\n } = {},\n wsOptions: {\n [key: string]: any;\n } = {},\n) => {\n const queryParams: QueryParams = { watch: 'true' };\n const opts: {\n queryParams: QueryParams;\n ns?: string;\n } = { queryParams };\n const wsOptionsUpdated = Object.assign(\n {\n host: 'auto',\n reconnect: true,\n jsonParse: true,\n bufferFlushInterval: 500,\n bufferMax: 1000,\n },\n wsOptions,\n );\n\n const { labelSelector } = query;\n if (labelSelector) {\n const encodedSelector = encodeURIComponent(selectorToString(labelSelector));\n if (encodedSelector) {\n queryParams.labelSelector = encodedSelector;\n }\n }\n\n if (query.fieldSelector) {\n queryParams.fieldSelector = encodeURIComponent(query.fieldSelector);\n }\n\n if (query.ns) {\n opts.ns = query.ns;\n }\n\n if (query.resourceVersion) {\n queryParams.resourceVersion = encodeURIComponent(query.resourceVersion);\n }\n\n const path = resourceURL(kind, opts);\n wsOptionsUpdated.path = path;\n return new WSFactory(path, wsOptionsUpdated as WSOptions);\n};\n\ninterface PluginStore {\n getExtensionsInUse: () => Extension[];\n}\n\nlet pluginStore: PluginStore;\n\nexport const setPluginStore = (store: PluginStore): void => {\n pluginStore = store;\n};\n\nconst modelKey = (model: K8sModel): string => {\n // TODO: Use `referenceForModel` even for known API objects\n return model.crd ? getReferenceForModel(model) : model.kind;\n};\n\nexport const modelsToMap = (\n models: K8sModel[],\n): ImmutableMap<K8sResourceKindReference, K8sModel> => {\n return ImmutableMap<K8sResourceKindReference, K8sModel>().withMutations((map) => {\n models.forEach((model) => map.set(modelKey(model), model));\n });\n};\n\nexport const isModelDefinition = (e: Extension): e is ModelDefinition => {\n return e.type === 'ModelDefinition';\n};\n\n/**\n * Contains static resource definitions for Kubernetes objects.\n * Keys are of type `group:version:Kind`, but TypeScript doesn't support regex types (https://github.com/Microsoft/TypeScript/issues/6579).\n */\nlet k8sModels;\n\nconst getK8sModels = () => {\n if (!k8sModels) {\n // TODO this was migrated from console and is only used for the fallback API discovery and can likely be removed\n k8sModels = modelsToMap(_.values(staticModels));\n\n const hasModel = (model: K8sModel) => k8sModels.has(modelKey(model));\n\n k8sModels = k8sModels.withMutations((map) => {\n const pluginModels = _.flatMap(\n pluginStore\n .getExtensionsInUse()\n .filter(isModelDefinition)\n .map((md) => md.properties.models),\n );\n map.merge(modelsToMap(pluginModels.filter((model) => !hasModel(model))));\n });\n }\n return k8sModels;\n};\n\n// URL routes that can be namespaced\nlet namespacedResources;\n\n/**\n * Provides a synchronous way to acquire all statically-defined Kubernetes models.\n * NOTE: This will not work for CRDs defined at runtime, use `connectToModels` instead.\n */\nexport const allModels = getK8sModels;\n\nexport const getNamespacedResources = () => {\n if (!namespacedResources) {\n namespacedResources = new Set();\n allModels().forEach((v, k) => {\n if (!v.namespaced) {\n return;\n }\n if (v.crd) {\n namespacedResources.add(k);\n }\n if (!v.crd || v.legacyPluralURL) {\n namespacedResources.add(v.plural);\n }\n });\n }\n return namespacedResources;\n};\n","import { useContext } from 'react';\nimport { NamespaceContext } from '@console/app/src/components/detect-namespace/namespace';\nimport { UseActiveNamespace } from '@console/dynamic-plugin-sdk/src/extensions/console-types';\n\nexport const useActiveNamespace: UseActiveNamespace = () => {\n const { namespace, setNamespace } = useContext(NamespaceContext);\n return [namespace, setNamespace];\n};\n","import { ActionType, DashboardsAction } from '../actions/dashboards';\nimport { fromJS, Map as ImmutableMap } from 'immutable';\nimport { RequestMap } from '@console/dynamic-plugin-sdk/src/api/internal-types';\n\nexport enum RESULTS_TYPE {\n PROMETHEUS = 'PROMETHEUS',\n URL = 'URL',\n ALERTS = 'ALERTS',\n}\n\nexport const defaults = {\n [RESULTS_TYPE.PROMETHEUS]: fromJS({}),\n [RESULTS_TYPE.URL]: fromJS({}),\n};\n\nexport type DashboardsState = ImmutableMap<string, RequestMap<any>>;\n\nexport const isWatchActive = (state: DashboardsState, type: string, key: string): boolean =>\n state.getIn([type, key, 'active']) > 0 || state.getIn([type, key, 'inFlight']);\n\nexport const dashboardsReducer = (\n state: DashboardsState,\n action: DashboardsAction,\n): DashboardsState => {\n if (!state) {\n return ImmutableMap(defaults);\n }\n switch (action.type) {\n case ActionType.ActivateWatch: {\n const activePath = [action.payload.type, action.payload.key, 'active'];\n const active = state.hasIn(activePath) ? state.getIn(activePath) : 0;\n return state.setIn(activePath, active + 1);\n }\n case ActionType.UpdateWatchTimeout:\n return state.setIn(\n [action.payload.type, action.payload.key, 'timeout'],\n action.payload.timeout,\n );\n case ActionType.UpdateWatchInFlight:\n return state.setIn(\n [action.payload.type, action.payload.key, 'inFlight'],\n action.payload.inFlight,\n );\n case ActionType.StopWatch: {\n const active = state.getIn([action.payload.type, action.payload.key, 'active']);\n const newState = state.setIn([action.payload.type, action.payload.key, 'active'], active - 1);\n if (active === 1) {\n clearTimeout(state.getIn([action.payload.type, action.payload.key, 'timeout']));\n }\n return newState;\n }\n case ActionType.SetError:\n return state.setIn(\n [action.payload.type, action.payload.key, 'loadError'],\n action.payload.error,\n );\n case ActionType.SetData:\n return state.withMutations((s) =>\n s\n .setIn([action.payload.type, action.payload.key, 'data'], action.payload.data)\n .setIn([action.payload.type, action.payload.key, 'loadError'], null),\n );\n default:\n return state;\n }\n};\n","import * as React from 'react';\nimport { Icon } from '@patternfly/react-core';\nimport { ArrowCircleUpIcon } from '@patternfly/react-icons/dist/esm/icons/arrow-circle-up-icon';\nimport { ResourcesAlmostFullIcon } from '@patternfly/react-icons/dist/esm/icons/resources-almost-full-icon';\nimport { ResourcesFullIcon } from '@patternfly/react-icons/dist/esm/icons/resources-full-icon';\nimport { SyncAltIcon } from '@patternfly/react-icons/dist/esm/icons/sync-alt-icon';\nimport { UnknownIcon } from '@patternfly/react-icons/dist/esm/icons/unknown-icon';\nimport { ColoredIconProps } from '@console/dynamic-plugin-sdk';\n\nexport {\n GreenCheckCircleIcon,\n RedExclamationCircleIcon,\n YellowExclamationTriangleIcon,\n BlueInfoCircleIcon,\n} from '@console/dynamic-plugin-sdk';\n\nexport const GrayUnknownIcon: React.FC<ColoredIconProps> = ({ className, title, size }) => (\n <Icon size={size}>\n <UnknownIcon className={className} title={title} />\n </Icon>\n);\n\nexport const BlueSyncIcon: React.FC<ColoredIconProps> = ({ className, title, size }) => (\n <Icon status=\"info\" size={size}>\n <SyncAltIcon className={className} title={title} />\n </Icon>\n);\n\nexport const RedResourcesFullIcon: React.FC<ColoredIconProps> = ({ className, title, size }) => (\n <Icon status=\"danger\" size={size}>\n <ResourcesFullIcon className={className} title={title} />\n </Icon>\n);\n\nexport const YellowResourcesAlmostFullIcon: React.FC<ColoredIconProps> = ({\n className,\n title,\n size,\n}) => (\n <Icon status=\"warning\" size={size}>\n <ResourcesAlmostFullIcon className={className} title={title} />\n </Icon>\n);\n\nexport const BlueArrowCircleUpIcon: React.FC<ColoredIconProps> = ({ className, title, size }) => (\n <Icon status=\"info\" size={size}>\n <ArrowCircleUpIcon className={className} title={title} />\n </Icon>\n);\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport { TableGridBreakpoint, SortByDirection } from '@patternfly/react-table';\nimport {\n Table as PfTable,\n TableHeader as TableHeaderDeprecated,\n} from '@patternfly/react-table/deprecated';\nimport * as classNames from 'classnames';\nimport { AutoSizer, WindowScroller } from '@patternfly/react-virtualized-extension';\nimport { useNavigate } from 'react-router-dom-v5-compat';\nimport { VirtualizedTableFC, TableColumn, TableDataProps } from '@console/dynamic-plugin-sdk';\n\nimport VirtualizedTableBody from './VirtualizedTableBody';\nimport { StatusBox, WithScrollContainer, EmptyBox } from '../../utils';\nimport { sortResourceByValue } from './sort';\n\nconst BREAKPOINT_SM = 576;\nconst BREAKPOINT_MD = 768;\nconst BREAKPOINT_LG = 992;\nconst BREAKPOINT_XL = 1200;\nconst BREAKPOINT_XXL = 1400;\nconst MAX_COL_XS = 2;\nconst MAX_COL_SM = 4;\nconst MAX_COL_MD = 4;\nconst MAX_COL_LG = 6;\nconst MAX_COL_XL = 8;\n\nconst isColumnVisible = <D extends any>(\n widthInPixels: number,\n column: TableColumn<D>,\n columnIDs: string[],\n): boolean => {\n if (column.id === '') {\n return true;\n }\n const columnIndex = columnIDs.indexOf(column.id);\n if (widthInPixels < BREAKPOINT_SM) {\n return columnIndex < MAX_COL_XS;\n }\n if (widthInPixels < BREAKPOINT_MD) {\n return columnIndex < MAX_COL_SM;\n }\n if (widthInPixels < BREAKPOINT_LG) {\n return columnIndex < MAX_COL_MD;\n }\n if (widthInPixels < BREAKPOINT_XL) {\n return columnIndex < MAX_COL_LG;\n }\n if (widthInPixels < BREAKPOINT_XXL) {\n return columnIndex < MAX_COL_XL;\n }\n return true;\n};\n\nexport const TableData: React.FC<TableDataProps> = ({ className, id, activeColumnIDs, children }) =>\n (activeColumnIDs.has(id) || id === '') && (\n <td id={id} className={classNames('pf-v5-c-table__td', className)} role=\"gridcell\">\n {children}\n </td>\n );\nTableData.displayName = 'TableData';\n\nconst VirtualizedTable: VirtualizedTableFC = ({\n data,\n loaded,\n loadError,\n columns: allColumns,\n NoDataEmptyMsg,\n EmptyMsg,\n scrollNode,\n label,\n 'aria-label': ariaLabel,\n gridBreakPoint = TableGridBreakpoint.none,\n onSelect,\n Row,\n rowData,\n unfilteredData,\n mock = false,\n sortColumnIndex,\n sortDirection,\n}) => {\n const navigate = useNavigate();\n const columnShift = onSelect ? 1 : 0; //shift indexes by 1 if select provided\n const [sortBy, setSortBy] = React.useState<{\n index: number;\n direction: SortByDirection;\n }>({ index: sortColumnIndex || columnShift, direction: sortDirection || SortByDirection.asc });\n\n const [windowWidth, setWindowWidth] = React.useState(window.innerWidth);\n\n const columns = React.useMemo(() => {\n const colIDs = allColumns.map((c) => c.id);\n return allColumns.filter((col) => isColumnVisible(windowWidth, col, colIDs));\n }, [windowWidth, allColumns]);\n\n const applySort = React.useCallback(\n (index, direction) => {\n const url = new URL(window.location.href);\n const sp = new URLSearchParams(window.location.search);\n\n const sortColumn = columns[index - columnShift];\n if (sortColumn) {\n sp.set('orderBy', direction);\n sp.set('sortBy', sortColumn.title);\n navigate(`${url.pathname}?${sp.toString()}${url.hash}`, { replace: true });\n setSortBy({\n index,\n direction,\n });\n }\n },\n [columnShift, columns, navigate],\n );\n\n data = React.useMemo(() => {\n const sortColumn = columns[sortBy.index - columnShift];\n if (!sortColumn.sort) {\n return data;\n } else if (typeof sortColumn.sort === 'string') {\n return data.sort(\n sortResourceByValue(sortBy.direction, (obj) => _.get(obj, sortColumn.sort as string, '')),\n );\n }\n return sortColumn.sort(data, sortBy.direction);\n }, [columnShift, columns, data, sortBy.direction, sortBy.index]);\n\n React.useEffect(() => {\n const handleResize = _.debounce(() => setWindowWidth(window.innerWidth), 100);\n\n const sp = new URLSearchParams(window.location.search);\n const columnIndex = _.findIndex(columns, { title: sp.get('sortBy') });\n\n if (columnIndex > -1) {\n const sortOrder =\n sp.get('orderBy') === SortByDirection.desc.valueOf()\n ? SortByDirection.desc\n : SortByDirection.asc;\n setSortBy({\n index: columnIndex + columnShift,\n direction: sortOrder,\n });\n }\n\n // re-render after resize\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const onSort = React.useCallback(\n (event, index, direction) => {\n event.preventDefault();\n applySort(index, direction);\n },\n [applySort],\n );\n\n const renderVirtualizedTable = (scrollContainer) => (\n <WindowScroller scrollElement={scrollContainer}>\n {({ height, isScrolling, registerChild, onChildScroll, scrollTop }) => (\n <AutoSizer disableHeight>\n {({ width }) => (\n <div ref={registerChild}>\n <VirtualizedTableBody\n Row={Row}\n height={height}\n isScrolling={isScrolling}\n onChildScroll={onChildScroll}\n data={data}\n columns={columns}\n scrollTop={scrollTop}\n width={width}\n rowData={rowData}\n />\n </div>\n )}\n </AutoSizer>\n )}\n </WindowScroller>\n );\n\n return (\n <div className=\"co-m-table-grid co-m-table-grid--bordered\">\n {mock ? (\n <EmptyBox label={label} />\n ) : (\n <StatusBox\n skeleton={<div className=\"loading-skeleton--table\" />}\n data={data}\n loaded={loaded}\n loadError={loadError}\n unfilteredData={unfilteredData}\n label={label}\n NoDataEmptyMsg={NoDataEmptyMsg}\n EmptyMsg={EmptyMsg}\n >\n <div\n className=\"co-virtualized-table\"\n role=\"grid\"\n aria-label={ariaLabel}\n aria-rowcount={data?.length}\n >\n <PfTable\n cells={columns}\n rows={[]}\n gridBreakPoint={gridBreakPoint}\n onSort={onSort}\n onSelect={onSelect}\n sortBy={sortBy}\n className=\"pf-m-compact pf-m-border-rows\"\n role=\"presentation\"\n >\n <TableHeaderDeprecated />\n </PfTable>\n {scrollNode ? (\n renderVirtualizedTable(scrollNode)\n ) : (\n <WithScrollContainer>{renderVirtualizedTable}</WithScrollContainer>\n )}\n </div>\n </StatusBox>\n )}\n </div>\n );\n};\n\nexport default VirtualizedTable;\n","import * as _ from 'lodash-es';\nimport * as fuzzy from 'fuzzysearch';\nimport { nodeStatus, volumeSnapshotStatus } from '@console/app/src/status';\nimport { getNodeRoles, getLabelsAsString } from '@console/shared';\nimport { Alert, AnyRowFilter, FilterValue, Rule } from '@console/dynamic-plugin-sdk';\nimport { routeStatus } from '../routes';\nimport { secretTypeFilterReducer } from '../secret';\nimport { roleType } from '../RBAC';\nimport {\n K8sResourceKind,\n MachineKind,\n getClusterOperatorStatus,\n getTemplateInstanceStatus,\n VolumeSnapshotKind,\n CustomResourceDefinitionKind,\n} from '../../module/k8s';\nimport { alertDescription } from '../monitoring/utils';\n\nimport { Target } from '../monitoring/types';\nimport { requesterFilter } from '@console/shared/src/components/namespace';\n\nexport const fuzzyCaseInsensitive = (a: string, b: string): boolean =>\n fuzzy(_.toLower(a), _.toLower(b));\n\nexport const exactMatch = (a: string, b: string): boolean => !a || b?.includes(a);\n\nconst clusterServiceVersionDisplayName = (csv: K8sResourceKind): string =>\n csv?.spec?.displayName || csv?.metadata?.name;\n\n// TODO: Table filters are undocumented, stringly-typed, and non-obvious. We can change that.\nexport const tableFilters = (isExactSearch: boolean): FilterMap => {\n const matchFn: Function = isExactSearch ? exactMatch : fuzzyCaseInsensitive;\n return {\n name: (filter, obj) => matchFn(filter.selected?.[0], obj.metadata.name),\n\n 'catalog-source-name': (filter, obj) => matchFn(filter.selected?.[0], obj.name),\n requester: requesterFilter,\n\n 'resource-list-text': (filter, resource: Rule | Alert) => {\n if (matchFn(filter.selected?.[0], resource.labels?.alertname || (resource as Rule)?.name)) {\n return true;\n }\n\n // Search in alert description. Ignore case and whitespace, but don't use fuzzy since the\n // description can be long and will often match fuzzy searches that are not really relevant.\n const needle = _.toLower(filter.selected?.[0]?.replace(/\\s/g, ''));\n const haystack = _.toLower(alertDescription(resource)?.replace(/\\s/g, ''));\n return haystack.includes(needle);\n },\n\n alerts: (values, alert: Alert) => {\n if (!values.all) {\n return true;\n }\n const labels = getLabelsAsString(alert, 'labels');\n return !!values.all.every((v) => labels.includes(v));\n },\n\n 'observe-rules': (values, rule: Rule) => {\n if (!values.all) {\n return true;\n }\n const labels = getLabelsAsString(rule, 'labels');\n return !!values.all.every((v) => labels.includes(v));\n },\n\n 'observe-target-labels': (values, target: Target) =>\n !values.all || values.all.every((v) => getLabelsAsString(target, 'labels').includes(v)),\n\n // Filter role by role kind\n 'role-kind': (filter, role) =>\n filter.selected?.includes(roleType(role)) || filter.selected?.length === 0,\n\n // Filter role bindings by text match\n 'role-binding': (str, { metadata, roleRef, subject }) => {\n const isMatch = (val) => matchFn(str.selected?.[0], val);\n return [metadata.name, roleRef.name, subject.kind, subject.name].some(isMatch);\n },\n\n // Filter role bindings by roleRef name\n 'role-binding-roleRef-name': (name, binding) => binding.roleRef.name === name,\n\n // Filter role bindings by roleRef kind\n 'role-binding-roleRef-kind': (kind, binding) => binding.roleRef.kind === kind,\n\n // Filter role bindings by user name\n 'role-binding-user': (userName, { subject }) => subject.name === userName,\n\n // Filter role bindings by group name\n 'role-binding-group': (groupName, { subject }) => subject.name === groupName,\n\n labels: (values, obj) => {\n if (!values.all) {\n return true;\n }\n const labels = getLabelsAsString(obj);\n return !!values.all.every((v) => labels.includes(v));\n },\n\n 'node-status': (statuses, node) => {\n if (!statuses || !statuses.selected || !statuses.selected.length) {\n return true;\n }\n\n const status = nodeStatus(node);\n return statuses.selected.includes(status) || !_.includes(statuses.all, status);\n },\n\n 'node-role': (roles, node) => {\n if (!roles || !roles.selected || !roles.selected.length) {\n return true;\n }\n\n const roleList = getNodeRoles(node);\n return roles.selected.filter((elem) => roleList.includes(elem)).length > 0;\n },\n\n 'clusterserviceversion-resource-kind': (filters, resource) => {\n if (!filters || !filters.selected || !filters.selected.length) {\n return true;\n }\n return filters.selected.includes(resource.kind);\n },\n\n 'packagemanifest-name': (filter, pkg) =>\n matchFn(\n filter.selected?.[0],\n (pkg.status.defaultChannel\n ? pkg.status.channels.find((ch) => ch.name === pkg.status.defaultChannel)\n : pkg.status.channels[0]\n ).currentCSVDesc.displayName,\n ),\n\n 'build-status': (phases, build) => {\n if (!phases || !phases.selected || !phases.selected.length) {\n return true;\n }\n\n const phase = build.status.phase;\n return phases.selected.includes(phase) || !_.includes(phases.all, phase);\n },\n\n 'build-strategy': (strategies, buildConfig) => {\n if (!strategies || !strategies.selected || !strategies.selected.length) {\n return true;\n }\n\n const strategy = buildConfig.spec.strategy.type;\n return strategies.selected.includes(strategy) || !_.includes(strategies.all, strategy);\n },\n\n 'route-status': (statuses, route) => {\n if (!statuses || !statuses.selected || !statuses.selected.length) {\n return true;\n }\n\n const status = routeStatus(route);\n return statuses.selected.includes(status) || !_.includes(statuses.all, status);\n },\n\n 'secret-type': (types, secret) => {\n if (!types || !types.selected || !types.selected.length) {\n return true;\n }\n const type = secretTypeFilterReducer(secret);\n return types.selected.includes(type) || !_.includes(types.all, type);\n },\n\n 'project-name': (str, project: K8sResourceKind) => {\n const displayName = _.get(project, ['metadata', 'annotations', 'openshift.io/display-name']);\n return (\n matchFn(str.selected?.[0], project.metadata.name) || matchFn(str.selected?.[0], displayName)\n );\n },\n\n 'pvc-status': (phases, pvc) => {\n if (!phases || !phases.selected || !phases.selected.length) {\n return true;\n }\n\n const phase = pvc.status.phase;\n return phases.selected.includes(phase) || !_.includes(phases.all, phase);\n },\n\n 'cluster-operator-status': (statuses, operator) => {\n if (!statuses || !statuses.selected || !statuses.selected.length) {\n return true;\n }\n\n const status = getClusterOperatorStatus(operator);\n return statuses.selected.includes(status) || !_.includes(statuses.all, status);\n },\n\n 'template-instance-status': (statuses, instance) => {\n if (!statuses || !statuses.selected || !statuses.selected.length) {\n return true;\n }\n\n const status = getTemplateInstanceStatus(instance);\n return statuses.selected.includes(status) || !_.includes(statuses.all, status);\n },\n\n machine: (str, machine: MachineKind): boolean => {\n const node: string = _.get(machine, 'status.nodeRef.name');\n return (\n matchFn(str.selected?.[0], machine.metadata.name) ||\n (node && matchFn(str.selected?.[0], node))\n );\n },\n\n 'snapshot-status': (statuses, snapshot: VolumeSnapshotKind) => {\n if (!statuses || !statuses.selected || !statuses.selected.length) {\n return true;\n }\n\n const status = volumeSnapshotStatus(snapshot);\n return statuses.selected.includes(status) || !_.includes(statuses.all, status);\n },\n 'node-disk-name': (name, disks) => matchFn(name.selected?.[0], disks?.path),\n 'image-name': (str, imageManifestVuln) =>\n matchFn(str.selected?.[0], imageManifestVuln.spec.image),\n vulnerability: (str, imageVulnerability) =>\n matchFn(str.selected?.[0], imageVulnerability.vulnerability.name),\n\n // Filter cluster service version by displayName or name text match\n 'cluster-service-version': (str, csv) => {\n const value = clusterServiceVersionDisplayName(csv);\n return matchFn(str.selected?.[0], value);\n },\n 'custom-resource-definition-name': (str, crd: CustomResourceDefinitionKind) => {\n const displayName = _.get(crd, 'spec.names.kind');\n return (\n matchFn(str.selected?.[0], crd.metadata.name) || matchFn(str.selected?.[0], displayName)\n );\n },\n };\n};\nconst rowFiltersToFilterFuncs = (rowFilters: AnyRowFilter[]): FilterMap => {\n return (rowFilters || [])\n .filter((f) => f.type && _.isFunction(f.filter))\n .reduce((acc, f) => ({ ...acc, [f.type]: f.filter }), {} as FilterMap);\n};\n\nexport const getAllTableFilters = (\n rowFilters: AnyRowFilter[],\n isExactMatch?: boolean,\n): FilterMap => ({\n ...tableFilters(isExactMatch),\n ...rowFiltersToFilterFuncs(rowFilters),\n});\n\nexport type FilterMap = {\n [key: string]: (value: FilterValue, obj: any) => boolean;\n};\n","import { ApolloClient } from 'apollo-client';\nimport { HttpLink } from 'apollo-link-http';\nimport { SubscriptionClient } from 'subscriptions-transport-ws';\nimport { InMemoryCache } from 'apollo-cache-inmemory';\nimport { WebSocketLink } from 'apollo-link-ws';\nimport { split } from 'apollo-link';\n\nimport { getK8sResourcePath } from '@console/dynamic-plugin-sdk/src/utils/k8s/k8s-utils';\nimport { K8sKind, K8sResourceCommon } from '../module/k8s/types';\nimport { URLQuery } from './client.gql';\nimport { URLQueryType, URLQueryVariables } from '../../@types/console/generated/graphql-schema';\nimport { getConsoleRequestHeaders, coFetch } from '../co-fetch';\n\nlet wssErrors = 0;\n\nclass GraphQLReady {\n private callback: VoidFunction;\n private ready: boolean;\n private wasCalled: boolean;\n\n setReady() {\n this.ready = true;\n if (!this.wasCalled && this.callback) {\n this.wasCalled = true;\n this.callback();\n }\n }\n\n onReady(cb: VoidFunction) {\n this.callback = cb;\n if (this.ready && !this.wasCalled) {\n this.wasCalled = true;\n this.callback();\n }\n }\n}\n\nexport const graphQLReady = new GraphQLReady();\n\nexport const subsClient = new SubscriptionClient(\n `${location.protocol === 'https:' ? 'wss://' : 'ws://'}${location.host}${\n window.SERVER_FLAGS.graphqlBaseURL\n }`,\n {\n reconnect: true,\n connectionParams: getConsoleRequestHeaders,\n reconnectionAttempts: 5,\n connectionCallback: () => {\n graphQLReady.setReady();\n wssErrors = 0;\n },\n },\n);\n\nsubsClient.onError(() => {\n wssErrors++;\n if (wssErrors > 4) {\n graphQLReady.setReady();\n }\n});\n\nconst httpLink = new HttpLink({\n uri: window.SERVER_FLAGS.graphqlBaseURL,\n fetch: coFetch,\n});\n\nconst wsLink = new WebSocketLink(subsClient);\n\n// fallback to http connection if websocket connection was not successful\n// iOS does not allow wss with self signed certificate\nconst link = split(() => wssErrors > 4, httpLink, wsLink);\n\nconst client = new ApolloClient({\n link,\n cache: new InMemoryCache(),\n defaultOptions: {\n query: {\n fetchPolicy: 'network-only',\n },\n mutate: {\n fetchPolicy: 'network-only',\n },\n watchQuery: {\n fetchPolicy: 'network-only',\n },\n },\n});\n\nexport default client;\n\nexport const fetchURL = async <R = any>(url: string): Promise<R> => {\n try {\n const response = await client.query<URLQueryType, URLQueryVariables>({\n query: URLQuery,\n variables: { url },\n });\n return JSON.parse(response.data.fetchURL);\n } catch (err) {\n return Promise.reject({ response: err.graphQLErrors[0]?.extensions });\n }\n};\n\nexport const fetchK8s = <R extends K8sResourceCommon = K8sResourceCommon>(\n kind: K8sKind,\n name?: string,\n ns?: string,\n path?: string,\n queryParams?: { [key: string]: string },\n): Promise<R> => fetchURL<R>(getK8sResourcePath(kind, { ns, name, path, queryParams }));\n","export const TOUR_LOCAL_STORAGE_KEY = 'getting-started-tour';\n\nexport enum TourActions {\n initialize = 'initialize',\n start = 'start',\n next = 'next',\n back = 'back',\n complete = 'complete',\n}\n","import { SetFeatureFlag } from '@console/dynamic-plugin-sdk';\nimport { setFlag, handleError } from '@console/internal/actions/features';\nimport { fetchK8s } from '@console/internal/graphql/client';\nimport { InfrastructureModel } from '@console/internal/models';\nimport { K8sResourceKind } from '@console/internal/module/k8s';\nimport { FeatureDetector } from '@console/plugin-sdk';\nimport { getInfrastructurePlatform } from '@console/shared/src/selectors/infrastructure';\nimport { useMaintenanceCapability } from './hooks/useMaintenanceCapability';\nimport { ProvisioningModel } from './models';\n\nexport const BAREMETAL_FLAG = 'BAREMETAL';\nexport const NODE_MAINTENANCE_FLAG = 'NODE_MAINTENANCE';\nexport const NODE_MAINTENANCE_ENABLED_FLAG = 'NODE_MAINTENANCE_ENABLED';\nexport const BMO_ENABLED_FLAG = 'BMO_ENABLED';\nexport const NODE_MAINTENANCE_KV_BETA_FLAG = 'NODE_MAINTENANCE_KV_BETA';\nexport const NODE_MAINTENANCE_KV_ALPHA_FLAG = 'NODE_MAINTENANCE_KV_ALPHA';\n\nexport const detectBaremetalPlatform: FeatureDetector = (dispatch) =>\n fetchK8s<K8sResourceKind>(InfrastructureModel, 'cluster').then(\n (infra) => dispatch(setFlag(BAREMETAL_FLAG, getInfrastructurePlatform(infra) === 'BareMetal')),\n (err) => {\n err?.response?.status === 404\n ? dispatch(setFlag(BAREMETAL_FLAG, false))\n : handleError(err, BAREMETAL_FLAG, dispatch, detectBaremetalPlatform);\n },\n );\n\nexport const detectBMOEnabled: FeatureDetector = (dispatch) =>\n fetchK8s<K8sResourceKind>(ProvisioningModel, 'provisioning-configuration').then(\n () => dispatch(setFlag(BMO_ENABLED_FLAG, true)),\n (err) => {\n err?.response?.status === 404\n ? dispatch(setFlag(BMO_ENABLED_FLAG, false))\n : handleError(err, BMO_ENABLED_FLAG, dispatch, detectBMOEnabled);\n },\n );\n\nexport const useDetectNodeMaintenance = (setFeatureFlag: SetFeatureFlag) => {\n const [model, loading] = useMaintenanceCapability();\n if (!loading) {\n setFeatureFlag(NODE_MAINTENANCE_ENABLED_FLAG, !!model);\n }\n};\n","export * from './components';\n","import i18n from 'i18next';\nimport { initReactI18next } from 'react-i18next';\nimport detector from 'i18next-browser-languagedetector';\nimport httpBackend from 'i18next-http-backend';\nimport Pseudo from 'i18next-pseudo';\nimport { transformNamespace } from 'i18next-v4-format-converter';\nimport { getLastLanguage } from '@console/app/src/components/user-preferences/language/getLastLanguage';\n\nimport { pluginStore } from './plugins';\nimport { dateTimeFormatter, fromNow } from './components/utils/datetime';\n\nconst params = new URLSearchParams(window.location.search);\nconst pseudolocalizationEnabled = params.get('pseudolocalization') === 'true';\nconst language = params.get('lng');\n\nlet resolvedLoading;\n\nexport const loading = new Promise((resolve) => {\n resolvedLoading = resolve;\n});\n\nexport const init = () => {\n i18n\n .use(\n new Pseudo({ enabled: pseudolocalizationEnabled, languageToPseudo: language, wrapped: true }),\n )\n // fetch json files\n // learn more: https://github.com/i18next/i18next-http-backend\n .use(httpBackend)\n // detect user language\n // learn more: https://github.com/i18next/i18next-browser-languageDetector\n .use(detector)\n // pass the i18n instance to react-i18next.\n .use(initReactI18next)\n // init i18next\n // for all options read: https://www.i18next.com/overview/configuration-options\n .init({\n backend: {\n loadPath: `${window.SERVER_FLAGS.basePath}locales/resource.json?lng={{lng}}&ns={{ns}}`,\n parse: function (data, lng, ns) {\n const parsed = JSON.parse(data);\n // i18next-v4-format-converter functions differently for plurals in\n // 'en' compared to other languages. Therefore, two conversions are\n // needed: one in the correct language, then a second one in English\n // to catch the missing plural cases.\n if (ns?.startsWith('plugin__')) {\n const firstTransform = transformNamespace(lng, parsed);\n return transformNamespace('en', firstTransform);\n }\n return parsed;\n },\n },\n lng: getLastLanguage(),\n fallbackLng: 'en',\n load: 'languageOnly',\n debug: process.env.NODE_ENV === 'development',\n detection: { caches: [] },\n contextSeparator: '~',\n ns: [\n 'console-app',\n 'console-shared',\n 'console-telemetry-plugin',\n 'container-security',\n 'devconsole',\n 'git-service',\n 'gitops-plugin',\n 'helm-plugin',\n 'insights-plugin',\n 'knative-plugin',\n 'lso-plugin',\n 'metal3-plugin',\n 'notification-drawer',\n 'olm',\n 'olm-v1',\n 'pipelines-plugin',\n 'shipwright-plugin',\n 'public',\n 'rhoas-plugin',\n 'service-binding-plugin',\n 'topology',\n 'vsphere-plugin',\n 'webterminal-plugin',\n ...pluginStore.getI18nNamespaces(),\n ],\n defaultNS: 'public',\n nsSeparator: '~',\n keySeparator: false,\n postProcess: ['pseudo'],\n interpolation: {\n format: function (value, format, lng, options) {\n if (format === 'number') {\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat#Browser_compatibility\n return new Intl.NumberFormat(lng).format(value);\n }\n if (value instanceof Date) {\n if (format === 'fromNow') {\n return fromNow(value, null, options);\n }\n return dateTimeFormatter.format(value);\n }\n return value;\n },\n escapeValue: false, // not needed for react as it escapes by default\n },\n react: {\n useSuspense: true,\n wait: true,\n transSupportBasicHtmlNodes: true, // allow <br/> and simple html elements in translations\n },\n saveMissing: true,\n missingKeyHandler: function (lng, ns, key) {\n window.windowError = `Missing i18n key \"${key}\" in namespace \"${ns}\" and language \"${lng}.\"`;\n // eslint-disable-next-line no-console\n console.error(window.windowError);\n },\n })\n // Update loading promise and pass values and errors to the caller\n .then((value) => {\n resolvedLoading(true);\n return value;\n })\n .catch((error) => {\n resolvedLoading(false);\n throw error;\n });\n};\n\nif (process.env.NODE_ENV !== 'production') {\n // Expose i18next for debugging\n window.i18n = i18n;\n}\n\nexport default i18n;\n","import { Alert, PrometheusLabels, Silence } from '@console/dynamic-plugin-sdk';\n\nexport const enum AlertSource {\n Platform = 'platform',\n User = 'user',\n}\n\nexport type MonitoringResource = {\n abbr: string;\n kind: string;\n label: string;\n plural: string;\n};\n\nexport type Silences = {\n data: Silence[];\n loaded: boolean;\n loadError?: string | Error;\n};\n\nexport type Alerts = {\n data: Alert[];\n loaded: boolean;\n loadError?: string | Error;\n};\n\nexport type PrometheusAPIError = {\n json: {\n error?: string;\n };\n message?: string;\n response: {\n status: number;\n };\n};\n\nexport type Target = {\n discoveredLabels: PrometheusLabels;\n globalUrl: string;\n health: 'up' | 'down';\n labels: PrometheusLabels;\n lastError: string;\n lastScrape: string;\n lastScrapeDuration: number;\n scrapePool: string;\n scrapeUrl: string;\n};\n","import * as _ from 'lodash-es';\nimport * as semver from 'semver';\nimport i18next from 'i18next';\n\nimport { ClusterVersionModel, MachineConfigPoolModel } from '../../models';\nimport { referenceForModel } from './k8s-ref';\nimport {\n ClusterVersionCondition,\n ClusterVersionConditionType,\n ClusterVersionKind,\n ConditionalUpdate,\n k8sPatch,\n K8sResourceCondition,\n K8sResourceConditionStatus,\n UpdateHistory,\n VersionUpdate,\n} from '.';\nimport { MachineConfigPoolKind } from './types';\n\nexport enum ClusterUpdateStatus {\n UpToDate = 'Up to Date',\n UpdatesAvailable = 'Updates Available',\n Updating = 'Updating',\n Failing = 'Failing',\n UpdatingAndFailing = 'Updating and Failing',\n ErrorRetrieving = 'Error Retrieving',\n Invalid = 'Invalid Cluster Version',\n ReleaseNotAccepted = 'Release Not Accepted',\n}\n\nexport const clusterVersionReference = referenceForModel(ClusterVersionModel);\n\nconst getAvailableClusterUpdates = (cv: ClusterVersionKind): VersionUpdate[] =>\n cv?.status?.availableUpdates?.map((update) => _.pick(update, ['version', 'image'])) || [];\n\nexport const getSortedAvailableUpdates = (cv: ClusterVersionKind): VersionUpdate[] => {\n const available = getAvailableClusterUpdates(cv);\n try {\n return available.sort(({ version: left }, { version: right }) => semver.rcompare(left, right));\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('error sorting available cluster updates', e);\n return available;\n }\n};\n\nconst getConditionalClusterUpdates = (cv: ClusterVersionKind): ConditionalUpdate[] => {\n return (\n cv?.status?.conditionalUpdates?.map((update) => ({\n conditions: update.conditions,\n release: {\n image: update.release.image,\n version: update.release.version,\n },\n })) ?? []\n );\n};\n\nexport const getNotRecommendedUpdateCondition = (\n conditions: K8sResourceCondition[],\n): K8sResourceCondition => {\n return conditions?.find(\n (condition) => condition.type === 'Recommended' && condition.status !== 'True',\n );\n};\n\nconst getNotRecommendedUpdates = (cv: ClusterVersionKind): ConditionalUpdate[] => {\n return getConditionalClusterUpdates(cv).filter((update) =>\n getNotRecommendedUpdateCondition(update.conditions),\n );\n};\n\nexport const getSortedNotRecommendedUpdates = (cv: ClusterVersionKind): ConditionalUpdate[] => {\n const notRecommended = getNotRecommendedUpdates(cv);\n try {\n return notRecommended.sort(({ release: { version: left } }, { release: { version: right } }) =>\n semver.rcompare(left, right),\n );\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('error sorting conditional cluster updates', e);\n return notRecommended;\n }\n};\n\nexport const getNewerMinorVersionUpdate = (currentVersion, availableUpdates) => {\n const currentVersionParsed = semver.parse(currentVersion);\n if (!currentVersionParsed) {\n return;\n }\n return availableUpdates?.find(\n // find the next minor version update, which there should never be more than one\n (update) => {\n const updateParsed = semver.parse(update.version);\n return semver.gt(\n semver.coerce(`${updateParsed.major}.${updateParsed.minor}`),\n semver.coerce(`${currentVersionParsed.major}.${currentVersionParsed.minor}`),\n );\n },\n );\n};\n\nexport const isMinorVersionNewer = (currentVersion, otherVersion) => {\n const currentVersionParsed = semver.parse(currentVersion);\n const otherVersionParsed = semver.parse(otherVersion);\n return semver.gt(\n semver.coerce(`${otherVersionParsed?.major}.${otherVersionParsed?.minor}`),\n semver.coerce(`${currentVersionParsed?.major}.${currentVersionParsed?.minor}`),\n );\n};\n\nexport const getAvailableClusterChannels = (cv) => {\n return cv?.status?.desired?.channels || [];\n};\n\nexport const getDesiredClusterVersion = (cv: ClusterVersionKind): string => {\n return _.get(cv, 'status.desired.version');\n};\n\nexport const getClusterVersionChannel = (cv: ClusterVersionKind): string => cv?.spec?.channel;\n\nexport const splitClusterVersionChannel = (channel: string) => {\n const parsed = /^(.+)-(\\d\\.\\d+)$/.exec(channel);\n return parsed ? { prefix: parsed[1], version: parsed[2] } : null;\n};\n\nexport const getSimilarClusterVersionChannels = (cv, currentPrefix) => {\n return getAvailableClusterChannels(cv).filter((channel: string) => {\n return currentPrefix && splitClusterVersionChannel(channel)?.prefix === currentPrefix;\n });\n};\n\nexport const getNewerClusterVersionChannel = (similarChannels, currentChannel) => {\n return similarChannels.find(\n // find the next minor version, which there should never be more than one\n (channel) => semver.gt(semver.coerce(channel).version, semver.coerce(currentChannel).version),\n );\n};\n\nexport const getLastCompletedUpdate = (cv: ClusterVersionKind): string => {\n const history: UpdateHistory[] = _.get(cv, 'status.history', []);\n const lastCompleted: UpdateHistory = history.find((update) => update.state === 'Completed');\n return lastCompleted && lastCompleted.version;\n};\n\nexport const getClusterVersionCondition = (\n cv: ClusterVersionKind,\n type: ClusterVersionConditionType,\n status: K8sResourceConditionStatus = undefined,\n): ClusterVersionCondition => {\n const conditions: ClusterVersionCondition[] = _.get(cv, 'status.conditions');\n if (status) {\n return _.find(conditions, { type, status });\n }\n return _.find(conditions, { type });\n};\n\nexport const isProgressing = (cv: ClusterVersionKind): boolean => {\n return !_.isEmpty(\n getClusterVersionCondition(\n cv,\n ClusterVersionConditionType.Progressing,\n K8sResourceConditionStatus.True,\n ),\n );\n};\n\nexport const invalid = (cv: ClusterVersionKind): boolean => {\n return !_.isEmpty(\n getClusterVersionCondition(\n cv,\n ClusterVersionConditionType.Invalid,\n K8sResourceConditionStatus.True,\n ),\n );\n};\n\nexport const releaseNotAccepted = (cv: ClusterVersionKind): boolean => {\n return !_.isEmpty(\n getClusterVersionCondition(\n cv,\n ClusterVersionConditionType.ReleaseAccepted,\n K8sResourceConditionStatus.False,\n ),\n );\n};\n\nexport const failedToRetrieveUpdates = (cv: ClusterVersionKind): boolean => {\n return !_.isEmpty(\n getClusterVersionCondition(\n cv,\n ClusterVersionConditionType.RetrievedUpdates,\n K8sResourceConditionStatus.False,\n ),\n );\n};\n\nexport const updateFailing = (cv: ClusterVersionKind): boolean => {\n return !_.isEmpty(\n getClusterVersionCondition(\n cv,\n ClusterVersionConditionType.Failing,\n K8sResourceConditionStatus.True,\n ),\n );\n};\n\nexport const hasAvailableUpdates = (cv: ClusterVersionKind): boolean => {\n return !_.isEmpty(getAvailableClusterUpdates(cv));\n};\n\nexport const hasNotRecommendedUpdates = (cv: ClusterVersionKind): boolean => {\n return !_.isEmpty(getNotRecommendedUpdates(cv));\n};\n\nexport const getClusterUpdateStatus = (cv: ClusterVersionKind): ClusterUpdateStatus => {\n if (invalid(cv)) {\n return ClusterUpdateStatus.Invalid;\n }\n\n if (releaseNotAccepted(cv)) {\n return ClusterUpdateStatus.ReleaseNotAccepted;\n }\n\n if (isProgressing(cv) && updateFailing(cv)) {\n return ClusterUpdateStatus.UpdatingAndFailing;\n }\n\n if (updateFailing(cv)) {\n return ClusterUpdateStatus.Failing;\n }\n\n if (isProgressing(cv)) {\n return ClusterUpdateStatus.Updating;\n }\n\n if (failedToRetrieveUpdates(cv)) {\n return ClusterUpdateStatus.ErrorRetrieving;\n }\n\n return hasAvailableUpdates(cv)\n ? ClusterUpdateStatus.UpdatesAvailable\n : ClusterUpdateStatus.UpToDate;\n};\n\nexport const getK8sGitVersion = (k8sVersionResponse): string =>\n _.get(k8sVersionResponse, 'gitVersion');\n\nexport const getOpenShiftVersion = (cv: ClusterVersionKind): string => {\n const lastUpdate: UpdateHistory = _.get(cv, 'status.history[0]');\n if (!lastUpdate) {\n return null;\n }\n return lastUpdate.state === 'Partial' ? `Updating to ${lastUpdate.version}` : lastUpdate.version;\n};\n\nexport const getCurrentVersion = (cv: ClusterVersionKind): string => {\n return _.get(cv, 'status.history[0].version') || _.get(cv, 'spec.desiredUpdate.version');\n};\n\nexport const getReportBugLink = (\n cv: ClusterVersionKind,\n): { label: string; description: string; href: string } => {\n const version: string = getCurrentVersion(cv);\n const parsed = semver.parse(version);\n if (!parsed) {\n return null;\n }\n\n const { major, minor, prerelease } = parsed;\n let productName;\n switch (window.SERVER_FLAGS.branding) {\n case 'openshift':\n case 'ocp':\n productName = 'OpenShift Container Platform';\n break;\n case 'online':\n productName = 'OpenShift Online';\n break;\n case 'dedicated':\n productName = 'OpenShift Dedicated';\n break;\n case 'azure':\n productName = 'Azure Red Hat OpenShift';\n break;\n case 'rosa':\n productName = 'Red Hat OpenShift Service on AWS';\n break;\n default:\n productName = 'OKD';\n }\n\n // Do not show a link for OKD until the new OKD Jira project is ready.\n if (productName === 'OKD') {\n return null;\n }\n\n // Show a support case link for supported versions and a Jira link for prerelease versions.\n return _.isEmpty(prerelease)\n ? {\n label: i18next.t('public~Open a support case'),\n description: i18next.t('public~Get help from Red Hat support.'),\n href: `https://access.redhat.com/support/cases/#/case/new?product=${encodeURIComponent(\n productName,\n )}&version=${major}.${minor}&clusterId=${cv.spec.clusterID}`,\n }\n : {\n label: i18next.t('public~Report a bug'),\n description: i18next.t('public~Report a bug to Red Hat'),\n // It is not currently possible to pre-populate `component`, etc. per https://jira.atlassian.com/browse/JRASERVER-23590\n href: `https://issues.redhat.com/secure/CreateIssue.jspa?pid=12332330&issuetype=1`,\n };\n};\n\nexport const showReleaseNotes = (): boolean => {\n return window.SERVER_FLAGS.branding === 'ocp';\n};\n\n// example link: https://access.redhat.com/documentation/en-us/openshift_container_platform/4.9/html/release_notes/ocp-4-9-release-notes#ocp-4-9-4\nexport const getReleaseNotesLink = (version: string): string => {\n if (!showReleaseNotes()) {\n return null;\n }\n\n const parsed = semver.parse(version);\n if (!parsed) {\n return null;\n }\n\n const { major, minor, patch, prerelease } = parsed;\n if (major !== 4 || !_.isEmpty(prerelease)) {\n return null;\n }\n\n return `https://access.redhat.com/documentation/en-us/openshift_container_platform/${major}.${minor}/html/release_notes/ocp-${major}-${minor}-release-notes#ocp-${major}-${minor}-${patch}`;\n};\n\nexport const getClusterName = (): string => window.SERVER_FLAGS.kubeAPIServerURL || null;\n\nexport const getClusterID = (cv: ClusterVersionKind): string => _.get(cv, 'spec.clusterID');\n\nexport const getOCMLink = (clusterID: string): string =>\n `https://console.redhat.com/openshift/details/${clusterID}`;\n\nexport const getConditionUpgradeableFalse = (resource) =>\n resource.status?.conditions?.find(\n (c) => c.type === 'Upgradeable' && c.status === K8sResourceConditionStatus.False,\n );\n\nexport const getNotUpgradeableResources = (resources) =>\n resources.filter((resource) => getConditionUpgradeableFalse(resource));\n\nexport enum NodeTypes {\n master = 'master',\n worker = 'worker',\n}\n\n/**\n * Intentionally not translated as they are capitalized versions\n * of the Node names for display purposes\n */\nexport enum NodeTypeNames {\n Master = 'Control plane',\n Worker = 'Worker',\n}\n\nexport const isMCPMaster = (mcp: MachineConfigPoolKind) => mcp.metadata.name === NodeTypes.master;\n\nexport const isMCPWorker = (mcp: MachineConfigPoolKind) => mcp.metadata.name === NodeTypes.worker;\n\nexport const isMCPPaused = (mcp: MachineConfigPoolKind) => mcp.spec?.paused;\n\nexport const sortMCPsByCreationTimestamp = (a: MachineConfigPoolKind, b: MachineConfigPoolKind) =>\n a.metadata.creationTimestamp.localeCompare(b.metadata.creationTimestamp);\n\nexport const clusterIsUpToDateOrUpdateAvailable = (status: ClusterUpdateStatus) =>\n status === ClusterUpdateStatus.UpToDate || status === ClusterUpdateStatus.UpdatesAvailable;\n\nexport const getMCPsToPausePromises = (\n machineConfigPools: MachineConfigPoolKind[],\n paused: boolean,\n) =>\n machineConfigPools.map((mcp) => {\n const patch = [{ op: 'add', path: '/spec/paused', value: paused }];\n return k8sPatch(MachineConfigPoolModel, mcp, patch);\n });\n","import * as _ from 'lodash';\nimport { CatalogItem } from '@console/dynamic-plugin-sdk/src/extensions';\nimport { CatalogCategory, CatalogSubcategory } from './types';\n\nexport const NO_GROUPING = 'none';\nexport const ALL_CATEGORY = 'all';\nexport const OTHER_CATEGORY = 'other';\n\nexport const matchSubcategories = (\n category: CatalogCategory,\n item: CatalogItem,\n): (CatalogCategory | CatalogSubcategory)[] => {\n if (!category.subcategories) {\n if (!category.tags) {\n return [];\n }\n\n const intersection = [category.tags, item.tags || []].reduce((a, b) =>\n a.filter((c) => b.includes(c)),\n );\n if (!_.isEmpty(intersection)) {\n return [category];\n }\n\n return [];\n }\n\n const matchedSubcategories: (CatalogCategory | CatalogSubcategory)[] = [];\n _.each(category.subcategories, (subCategory) => {\n const valuesIntersection = [subCategory.tags, item.tags || []].reduce((a, b) =>\n a.filter((c) => b.includes(c)),\n );\n if (!_.isEmpty(valuesIntersection)) {\n matchedSubcategories.push(subCategory, ...matchSubcategories(subCategory, item));\n }\n });\n\n return matchedSubcategories;\n};\n\n// categorize item id under sub and main categories\nexport const addItem = (\n categorizedIds: Record<string, string[]>,\n itemId: string,\n categoryId: string,\n): void => {\n // Add the item to the category\n if (!categorizedIds[categoryId]) {\n categorizedIds[categoryId] = [itemId];\n } else if (!categorizedIds[categoryId].includes(itemId)) {\n categorizedIds[categoryId].push(itemId);\n }\n};\n\n/**\n * Creates an array of item Ids for each matching category and subcategory.\n * If no match, categorizes item id under 'Other' main category.\n */\nexport const categorize = (\n items: CatalogItem[],\n categories: CatalogCategory[],\n): Record<string, string[]> => {\n const categorizedIds = {};\n\n // Categorize each item\n _.each(items, (item) => {\n let itemCategorized = false;\n\n addItem(categorizedIds, item.uid, ALL_CATEGORY); // add each item to all category\n\n _.each(categories, (category: CatalogCategory) => {\n const matchedSubcategories = matchSubcategories(category, item);\n _.each(matchedSubcategories, (subcategory) => {\n addItem(categorizedIds, item.uid, category.id);\n addItem(categorizedIds, item.uid, subcategory.id);\n itemCategorized = true;\n });\n });\n\n if (!itemCategorized) {\n addItem(categorizedIds, item.uid, OTHER_CATEGORY); // add to Other category\n }\n });\n\n return categorizedIds;\n};\n\nexport const findActiveCategory = (\n activeId: string,\n categories: CatalogCategory[],\n): CatalogCategory => {\n let activeCategory = null;\n _.each(categories, (category) => {\n if (activeCategory) {\n return;\n }\n\n if (category.id === activeId) {\n activeCategory = category;\n } else if (category.subcategories) {\n activeCategory = findActiveCategory(activeId, category.subcategories);\n }\n });\n return activeCategory;\n};\n\nexport const hasActiveDescendant = (activeId: string, category: CatalogCategory): boolean => {\n if (_.has(category.subcategories, activeId)) {\n return true;\n }\n\n return _.some(category.subcategories, (subcategory) =>\n hasActiveDescendant(activeId, subcategory),\n );\n};\n\nexport const isActiveTab = (activeId: string, category: CatalogCategory): boolean => {\n return _.has(category.subcategories, activeId);\n};\n","/* eslint-disable @typescript-eslint/no-use-before-define, tsdoc/syntax */\nimport * as _ from 'lodash-es';\nimport * as React from 'react';\nimport * as classNames from 'classnames';\nimport * as PropTypes from 'prop-types';\nimport { Link, useParams } from 'react-router-dom-v5-compat';\nimport { Helmet } from 'react-helmet';\nimport { Button, ButtonSize, ButtonVariant, Chip, ChipGroup } from '@patternfly/react-core';\nimport { Trans, useTranslation } from 'react-i18next';\n\nimport { namespaceProptype } from '../propTypes';\nimport { ResourceListDropdown } from './resource-dropdown';\nimport { TextFilter } from './factory';\nimport {\n apiGroupForReference,\n isGroupVersionKind,\n kindForReference,\n referenceFor,\n watchURL,\n} from '../module/k8s';\nimport { withStartGuide } from './start-guide';\nimport { WSFactory } from '../module/ws-factory';\nimport { EventModel, NodeModel } from '../models';\nimport { connectToFlags } from '../reducers/connectToFlags';\nimport { FLAGS } from '@console/shared/src/constants';\nimport {\n Box,\n Dropdown,\n Loading,\n PageHeading,\n ResourceIcon,\n ResourceLink,\n resourcePathFromModel,\n Timestamp,\n TogglePlay,\n} from './utils';\nimport { EventStreamList } from './utils/event-stream';\nimport { ActionMenu, ActionMenuVariant, ActionServiceProvider } from '@console/shared';\nimport ActionMenuItem from '@console/shared/src/components/actions/menu/ActionMenuItem';\n\nconst maxMessages = 500;\nconst flushInterval = 500;\n\n// We have to check different properties depending on whether events were\n// created with the core/v1 events API or the new events.k8s.io API.\nconst getFirstTime = (event) => event.firstTimestamp || event.eventTime;\nexport const getLastTime = (event) => {\n const lastObservedTime = event.series ? event.series.lastObservedTime : null;\n return event.lastTimestamp || lastObservedTime || event.eventTime;\n};\nexport const sortEvents = (events) => {\n return _.orderBy(events, [getLastTime, getFirstTime, 'name'], ['desc', 'desc', 'asc']);\n};\n\n// Predicate function to filter by event \"type\" (normal, warning, or all)\nexport const typeFilter = (eventType, event) => {\n if (eventType === 'all') {\n return true;\n }\n const { type = 'normal' } = event;\n return type.toLowerCase() === eventType;\n};\n\nconst kindFilter = (reference, { involvedObject }) => {\n if (!reference) {\n return true;\n }\n const kinds = reference.split(',');\n return kinds.some((ref) => {\n if (!isGroupVersionKind(ref)) {\n return involvedObject.kind === ref;\n }\n // Use `referenceFor` to resolve `apiVersion` when missing from `involvedObject`.\n // We need `apiVersion` to get the group.\n const involvedObjectRef = referenceFor(involvedObject);\n if (!involvedObjectRef) {\n return false;\n }\n // Only check the group and kind, not the API version, so that we catch\n // events for the same resource under a different API version.\n return (\n involvedObject.kind === kindForReference(ref) &&\n apiGroupForReference(involvedObjectRef) === apiGroupForReference(ref)\n );\n });\n};\n\nconst Actions = ({ actions, options, list, cache, index }) => {\n React.useEffect(() => {\n // Actions contents will render after the initial row height calculation,\n // so recompute the row height.\n cache.clear(index);\n list?.recomputeRowHeights(index);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <div className=\"co-sysevent__actions\">\n {actions.length === 1 ? (\n <ActionMenuItem\n action={actions[0]}\n component={(props) => (\n <Button variant={ButtonVariant.secondary} size={ButtonSize.sm} {...props} />\n )}\n />\n ) : (\n <ActionMenu actions={actions} options={options} variant={ActionMenuVariant.DROPDOWN} />\n )}\n </div>\n );\n};\n\nconst Inner = connectToFlags(FLAGS.CAN_LIST_NODE)((props) => {\n const { t } = useTranslation();\n const { event, flags, list, cache, index } = props;\n const { involvedObject: obj, source, message, reason, series, reportingComponent } = event;\n\n const tooltipMsg = `${reason} (${obj.kind})`;\n const isWarning = typeFilter('warning', event);\n const firstTime = getFirstTime(event);\n const lastTime = getLastTime(event);\n const count = series ? series.count : event.count;\n\n // Events in v1beta1 apiVersion store the information about the reporting component\n // in the 'source.component' field. Events in v1 apiVersion are storing the information\n // in the `reportingComponent` field.\n // Unfortunatelly we cannot determine which field to use based on the apiVersion since\n // v1beta1 is internally converted to v1.\n const component = source.component ? source.component : reportingComponent;\n\n return (\n <div\n className={classNames('co-sysevent', {\n 'co-sysevent--warning': isWarning,\n })}\n data-test={isWarning ? 'event-warning' : 'event'}\n >\n <div className=\"co-sysevent__icon-box\">\n <i className=\"co-sysevent-icon\" title={tooltipMsg} />\n <div className=\"co-sysevent__icon-line\" />\n </div>\n <div className=\"co-sysevent__box\" role=\"gridcell\">\n <div className=\"co-sysevent__header\">\n <div className=\"co-sysevent__subheader\">\n <ResourceLink\n className=\"co-sysevent__resourcelink\"\n kind={referenceFor(obj)}\n namespace={obj.namespace}\n name={obj.name}\n />\n {obj.namespace && (\n <ResourceLink\n className=\"co-sysevent__resourcelink hidden-xs\"\n kind=\"Namespace\"\n name={obj.namespace}\n />\n )}\n {lastTime && <Timestamp className=\"co-sysevent__timestamp\" timestamp={lastTime} />}\n </div>\n <div className=\"co-sysevent__details\">\n <small className=\"co-sysevent__source\">\n {component !== 'kubelet' &&\n t('public~Generated from {{ sourceComponent }}', {\n sourceComponent: component,\n })}\n {component === 'kubelet' && flags[FLAGS.CAN_LIST_NODE] && (\n <Trans ns=\"public\">\n Generated from {{ sourceComponent: component }} on{' '}\n <Link to={resourcePathFromModel(NodeModel, source.host)}>\n {{ sourceHost: source.host }}\n </Link>\n </Trans>\n )}\n {component === 'kubelet' &&\n !flags[FLAGS.CAN_LIST_NODE] &&\n t('public~Generated from {{ sourceComponent }} on {{ sourceHost }}', {\n sourceComponent: component,\n sourceHost: source.host,\n })}\n </small>\n <div className=\"co-sysevent__count-and-actions\">\n {count > 1 && firstTime && (\n <Trans ns=\"public\">\n <small className=\"co-sysevent__count text-secondary\">\n {{ eventCount: count }} times in the last{' '}\n <Timestamp timestamp={firstTime} simple={true} omitSuffix={true} />\n </small>\n </Trans>\n )}\n {count > 1 && !firstTime && (\n <Trans ns=\"public\">\n <small className=\"co-sysevent__count text-secondary\">\n {{ eventCount: count }} times\n </small>\n </Trans>\n )}\n <ActionServiceProvider context={{ [referenceFor(event)]: event }}>\n {({ actions, options, loaded }) =>\n loaded &&\n actions.length > 0 && (\n <Actions\n actions={actions}\n options={options}\n list={list}\n cache={cache}\n index={index}\n />\n )\n }\n </ActionServiceProvider>\n </div>\n </div>\n </div>\n <div className=\"co-sysevent__message\">{message}</div>\n </div>\n </div>\n );\n});\n\nexport const EventsList = (props) => {\n const { t } = useTranslation();\n const [type, setType] = React.useState('all');\n const [textFilter, setTextFilter] = React.useState('');\n const { ns } = useParams();\n const [selected, setSelected] = React.useState(new Set([]));\n const eventTypes = {\n all: t('public~All types'),\n normal: t('public~Normal'),\n warning: t('public~Warning'),\n };\n\n const toggleSelected = (selection) => {\n setSelected((prev) => {\n const updateItems = new Set(prev);\n updateItems.has(selection) ? updateItems.delete(selection) : updateItems.add(selection);\n return updateItems;\n });\n };\n\n const removeResource = (selection) => {\n setSelected((prev) => {\n const updateItems = new Set(prev);\n updateItems.delete(selection);\n return updateItems;\n });\n };\n\n const clearSelection = () => {\n setSelected(new Set());\n };\n\n return (\n <>\n <PageHeading detail={true} title={props.title}>\n <div className=\"co-search-group\">\n <ResourceListDropdown\n onChange={toggleSelected}\n selected={Array.from(selected)}\n clearSelection={clearSelection}\n className=\"co-search-group__resource\"\n />\n <Dropdown\n className=\"co-search-group__resource\"\n items={eventTypes}\n onChange={(v) => setType(v)}\n selectedKey={type}\n title={t('public~All types')}\n />\n <TextFilter\n autoFocus={props.autoFocus}\n label={t('public~Events by name or message')}\n onChange={(_event, val) => setTextFilter(val || '')}\n />\n </div>\n <div className=\"form-group\">\n {selected.size > 0 && (\n <ChipGroup\n key=\"resources-category\"\n categoryName={t('public~Resource')}\n defaultIsOpen={false}\n collapsedText={t('public~{{numRemaining}} more', { numRemaining: '${remaining}' })}\n expandedText={t('public~Show less')}\n isClosable\n onClick={clearSelection}\n >\n {[...selected].map((chip) => {\n return (\n <Chip key={chip} onClick={() => removeResource(chip)}>\n <ResourceIcon kind={chip} />\n {kindForReference(chip)}\n </Chip>\n );\n })}\n </ChipGroup>\n )}\n </div>\n </PageHeading>\n <EventStream\n {...props}\n namespace={ns}\n key={[...selected].join(',')}\n type={type}\n kind={[...selected].join(',')}\n mock={props.mock}\n textFilter={textFilter}\n />\n </>\n );\n};\n\nexport const NoEvents = () => {\n const { t } = useTranslation();\n return (\n <Box className=\"co-sysevent-stream__status-box-empty\">\n <div className=\"pf-v5-u-text-align-center cos-status-box__detail\">\n {t('public~No events')}\n </div>\n </Box>\n );\n};\n\nexport const NoMatchingEvents = ({ allCount }) => {\n const { t } = useTranslation();\n return (\n <Box className=\"co-sysevent-stream__status-box-empty\">\n <div className=\"cos-status-box__title\">{t('public~No matching events')}</div>\n <div className=\"pf-v5-u-text-align-center cos-status-box__detail\">\n {allCount >= maxMessages\n ? t('public~{{count}}+ event exist, but none match the current filter', {\n count: maxMessages,\n })\n : t('public~{{count}} event exist, but none match the current filter', {\n count: allCount,\n })}\n </div>\n </Box>\n );\n};\n\nexport const ErrorLoadingEvents = () => {\n const { t } = useTranslation();\n return (\n <Box>\n <div className=\"cos-status-box__title cos-error-title\">\n {t('public~Error loading events')}\n </div>\n <div className=\"cos-status-box__detail pf-v5-u-text-align-center\">\n {t('public~An error occurred during event retrieval. Attempting to reconnect...')}\n </div>\n </Box>\n );\n};\n\nexport const EventStreamPage = withStartGuide(({ noProjectsAvailable, ...rest }) => {\n const { t } = useTranslation();\n const title = t('public~Events');\n return (\n <>\n <Helmet>\n <title>{title}</title>\n </Helmet>\n <EventsList\n {...rest}\n autoFocus={!noProjectsAvailable}\n mock={noProjectsAvailable}\n title={title}\n />\n </>\n );\n});\n\nconst EventStream = ({\n namespace,\n fieldSelector,\n mock,\n resourceEventStream,\n kind,\n type,\n filter,\n textFilter,\n}) => {\n const { t } = useTranslation();\n const [active, setActive] = React.useState(true);\n const [sortedEvents, setSortedEvents] = React.useState([]);\n const [error, setError] = React.useState(null);\n const [loading, setLoading] = React.useState(true);\n const ws = React.useRef(null);\n\n const filteredEvents = React.useMemo(() => {\n return filterEvents(sortedEvents, { kind, type, filter, textFilter }).slice(0, maxMessages);\n }, [sortedEvents, kind, type, filter, textFilter]);\n\n // Handle websocket setup and teardown when dependent props change\n React.useEffect(() => {\n ws.current?.destroy();\n if (!mock) {\n const webSocketID = `${namespace || 'all'}-sysevents`;\n const watchURLOptions = {\n ...(namespace ? { ns: namespace } : {}),\n ...(fieldSelector\n ? {\n queryParams: {\n fieldSelector: encodeURIComponent(fieldSelector),\n },\n }\n : {}),\n };\n const path = watchURL(EventModel, watchURLOptions);\n const webSocketOptions = {\n host: 'auto',\n reconnect: true,\n path,\n jsonParse: true,\n bufferFlushInterval: flushInterval,\n bufferMax: maxMessages,\n };\n\n ws.current = new WSFactory(webSocketID, webSocketOptions)\n .onbulkmessage((messages) => {\n // Make one update to state per batch of events.\n setSortedEvents((currentSortedEvents) => {\n const topEvents = currentSortedEvents.slice(0, maxMessages);\n const batch = messages.reduce((acc, { object, type: eventType }) => {\n const uid = object.metadata.uid;\n switch (eventType) {\n case 'ADDED':\n case 'MODIFIED':\n if (acc[uid] && acc[uid].count > object.count) {\n // We already have a more recent version of this message stored, so skip this one\n return acc;\n }\n return { ...acc, [uid]: object };\n case 'DELETED':\n return _.omit(acc, uid);\n default:\n // eslint-disable-next-line no-console\n console.error(`UNHANDLED EVENT: ${eventType}`);\n return acc;\n }\n }, _.keyBy(topEvents, 'metadata.uid'));\n return sortEvents(batch);\n });\n })\n .onopen(() => {\n setError(false);\n setLoading(false);\n })\n .onclose((evt) => {\n if (evt?.wasClean === false) {\n setError(evt.reason || t('public~Connection did not close cleanly.'));\n }\n })\n .onerror(() => {\n setError(true);\n });\n }\n return () => {\n ws.current?.destroy();\n };\n }, [namespace, fieldSelector, mock, t]);\n\n // Pause/unpause the websocket when the active state changes\n React.useEffect(() => {\n if (active) {\n ws.current?.unpause();\n } else {\n ws.current?.pause();\n }\n }, [active]);\n\n const toggleStream = () => {\n setActive((prev) => !prev);\n };\n\n const count = filteredEvents.length;\n const allCount = sortedEvents.length;\n const noEvents = allCount === 0;\n const noMatches = allCount > 0 && count === 0;\n let sysEventStatus, statusBtnTxt;\n\n if (noEvents || mock || (noMatches && resourceEventStream)) {\n sysEventStatus = <NoEvents />;\n }\n if (noMatches && !resourceEventStream) {\n sysEventStatus = <NoMatchingEvents allCount={allCount} />;\n }\n\n if (error) {\n statusBtnTxt = (\n <span className=\"co-sysevent-stream__connection-error\">\n {_.isString(error)\n ? t('public~Error connecting to event stream: { error }', {\n error,\n })\n : t('public~Error connecting to event stream')}\n </span>\n );\n sysEventStatus = <ErrorLoadingEvents />;\n } else if (loading) {\n statusBtnTxt = <span>{t('public~Loading events...')}</span>;\n sysEventStatus = <Loading />;\n } else if (active) {\n statusBtnTxt = <span>{t('public~Streaming events...')}</span>;\n } else {\n statusBtnTxt = <span>{t('public~Event stream is paused.')}</span>;\n }\n\n const klass = classNames('co-sysevent-stream__timeline', {\n 'co-sysevent-stream__timeline--empty': !allCount || !count,\n });\n const messageCount =\n count < maxMessages\n ? t('public~Showing {{count}} event', { count })\n : t('public~Showing most recent {{count}} event', { count });\n\n return (\n <div className=\"co-m-pane__body\">\n <div className=\"co-sysevent-stream\">\n <div className=\"co-sysevent-stream__status\">\n <div className=\"co-sysevent-stream__timeline__btn-text\">{statusBtnTxt}</div>\n <div className=\"co-sysevent-stream__totals text-secondary\" data-test=\"event-totals\">\n {messageCount}\n </div>\n </div>\n\n <div className={klass}>\n <TogglePlay\n active={active}\n onClick={toggleStream}\n className=\"co-sysevent-stream__timeline__btn\"\n />\n <div className=\"co-sysevent-stream__timeline__end-message\">\n {t('public~Older events are not stored.')}\n </div>\n </div>\n {count > 0 && <EventStreamList events={filteredEvents} EventComponent={Inner} />}\n {sysEventStatus}\n </div>\n </div>\n );\n};\n\nEventStream.defaultProps = {\n type: 'all',\n kind: '',\n mock: false,\n};\n\nEventStream.propTypes = {\n type: PropTypes.string,\n filter: PropTypes.array,\n kind: PropTypes.string.isRequired,\n mock: PropTypes.bool,\n namespace: namespaceProptype,\n showTitle: PropTypes.bool,\n textFilter: PropTypes.string,\n};\n\nconst filterEvents = (messages, { kind, type, filter, textFilter }) => {\n // Don't use `fuzzy` because it results in some surprising matches in long event messages.\n // Instead perform an exact substring match on each word in the text filter.\n const words = _.uniq(_.toLower(textFilter).match(/\\S+/g)).sort((a, b) => {\n // Sort the longest words first.\n return b.length - a.length;\n });\n\n const textMatches = (obj) => {\n if (_.isEmpty(words)) {\n return true;\n }\n const name = _.get(obj, 'involvedObject.name', '');\n const message = _.toLower(obj.message);\n return _.every(words, (word) => name.indexOf(word) !== -1 || message.indexOf(word) !== -1);\n };\n\n const f = (obj) => {\n if (type && !typeFilter(type, obj)) {\n return false;\n }\n if (kind && !kindFilter(kind, obj)) {\n return false;\n }\n if (filter && !filter.some((flt) => flt(obj.involvedObject, obj))) {\n return false;\n }\n if (!textMatches(obj)) {\n return false;\n }\n return true;\n };\n\n return _.filter(messages, f);\n};\n\nexport const ResourceEventStream_ = ({\n obj: {\n kind,\n metadata: { name, namespace, uid },\n },\n}) => (\n <EventStream\n fieldSelector={`involvedObject.uid=${uid},involvedObject.name=${name},involvedObject.kind=${kind}`}\n namespace={namespace}\n resourceEventStream\n />\n);\n\nexport { ResourceEventStream_ as ResourceEventStream };\n\nexport const ResourcesEventStream = ({ filters, namespace }) => (\n <EventStream filter={filters} resourceEventStream namespace={namespace} />\n);\n\n/**\n * @typedef {import('@console/dynamic-plugin-sdk/src/extensions').ResourceEventStreamProps} ResourceEventStreamProps\n * @augments React.FC<ResourceEventStreamProps>\n */\nexport const WrappedResourceEventStream = ({ resource }) => <ResourceEventStream_ obj={resource} />;\n\nexport default ResourceEventStream_;\n","import * as _ from 'lodash-es';\n\nimport { BuildModel, BuildConfigModel } from '../../models';\nimport { k8sCreate } from './';\nimport { formatPrometheusDuration } from '@openshift-console/plugin-shared/src/datetime/prometheus';\n\nconst BUILD_NUMBER_ANNOTATION = 'openshift.io/build.number';\n\nexport enum BuildPhase {\n Cancelled = 'Cancelled',\n Complete = 'Complete',\n Error = 'Error',\n Failed = 'Failed',\n New = 'New',\n Pending = 'Pending',\n Running = 'Running',\n}\n\nconst createBuildRequest = (obj, model, subresource) => {\n const req = {\n kind: 'BuildRequest',\n apiVersion: 'build.openshift.io/v1',\n metadata: _.pick(obj.metadata, ['name', 'namespace']),\n };\n const opts = {\n name: obj.metadata.name,\n path: subresource,\n };\n return k8sCreate(model, req, opts);\n};\n\nexport const startBuild = (buildConfig) => {\n return createBuildRequest(buildConfig, BuildConfigModel, 'instantiate');\n};\n\nexport const cloneBuild = (build) => {\n return createBuildRequest(build, BuildModel, 'clone');\n};\n\nexport const isFinished = (build) => !!_.get(build, 'status.completionTimestamp');\n\n// Formats duration for finished builds.\nexport const formatBuildDuration = (build) => {\n if (!isFinished(build)) {\n return '';\n }\n\n const duration = _.get(build, 'status.duration');\n if (!_.isFinite(duration)) {\n return '';\n }\n\n // Duration in the build is returned as nanoseconds. Convert to milliseconds.\n const ms = Math.floor(duration / 1000 / 1000);\n return formatPrometheusDuration(ms);\n};\n\nexport const getBuildNumber = (build) => {\n const buildNumber = _.get(build, ['metadata', 'annotations', BUILD_NUMBER_ANNOTATION]);\n return !!buildNumber && parseInt(buildNumber, 10);\n};\n","import * as React from 'react';\nimport * as classNames from 'classnames';\nimport * as _ from 'lodash-es';\n\nimport { getReference } from '@console/dynamic-plugin-sdk/src/utils/k8s';\nimport { ResourceIconProps } from '@console/dynamic-plugin-sdk';\nimport { K8sResourceKindReference } from '../../module/k8s';\nimport { modelFor } from '../../module/k8s/k8s-models';\nimport { kindToAbbr } from '../../module/k8s/get-resources';\n\nconst MEMO = {};\n\nexport const ResourceIcon: React.SFC<ResourceIconProps> = ({\n className,\n groupVersionKind,\n kind,\n}) => {\n // if no kind or groupVersionKind, return null so an empty icon isn't rendered\n if (!kind && !groupVersionKind) {\n return null;\n }\n const kindReference = kind || getReference(groupVersionKind);\n const memoKey = className ? `${kindReference}/${className}` : kindReference;\n if (MEMO[memoKey]) {\n return MEMO[memoKey];\n }\n const kindObj = modelFor(kindReference);\n const kindStr = kindObj?.kind ?? kindReference;\n const backgroundColor = _.get(kindObj, 'color', undefined);\n const klass = classNames(`co-m-resource-icon co-m-resource-${kindStr.toLowerCase()}`, className);\n const iconLabel = (kindObj && kindObj.abbr) || kindToAbbr(kindStr);\n\n const rendered = (\n <>\n <span className=\"pf-v5-u-screen-reader\">{kindStr}</span>\n <span className={klass} title={kindStr} style={{ backgroundColor }}>\n {iconLabel}\n </span>\n </>\n );\n if (kindObj) {\n MEMO[memoKey] = rendered;\n }\n\n return rendered;\n};\n\nexport type ResourceNameProps = {\n kind: K8sResourceKindReference;\n name: string;\n};\n\nexport const ResourceName: React.SFC<ResourceNameProps> = (props) => (\n <span className=\"co-resource-item\">\n <ResourceIcon kind={props.kind} />{' '}\n <span className=\"co-resource-item__resource-name\">{props.name}</span>\n </span>\n);\n\nResourceName.displayName = 'ResourceName';\n","import { LAST_LANGUAGE_LOCAL_STORAGE_KEY } from './const';\n\nexport const getLastLanguage = (): string =>\n localStorage.getItem(LAST_LANGUAGE_LOCAL_STORAGE_KEY) ?? navigator.language;\n","import * as _ from 'lodash';\nimport { Map as ImmutableMap } from 'immutable';\nimport { Board, MONITORING_DASHBOARDS_VARIABLE_ALL_OPTION_KEY } from './types';\nimport { getQueryArgument } from '../../utils';\n\nexport const DEFAULT_GRAPH_SAMPLES = 60;\n\nexport const getActivePerspective = (namespace: string): string => (namespace ? 'dev' : 'admin');\n\nexport const getAllVariables = (boards: Board[], newBoardName: string, namespace: string) => {\n const data = _.find(boards, { name: newBoardName })?.data;\n\n const allVariables = {};\n _.each(data?.templating?.list, (v) => {\n if (v.type === 'query' || v.type === 'interval') {\n // Look for query param that is equal to the variable name\n let value = getQueryArgument(v.name);\n\n // Look for an option that should be selected by default\n if (value === null) {\n value = _.find(v.options, { selected: true })?.value;\n }\n\n // If no default option was found, default to \"All\" (if present)\n if (value === undefined && v.includeAll) {\n value = MONITORING_DASHBOARDS_VARIABLE_ALL_OPTION_KEY;\n }\n\n allVariables[v.name] = ImmutableMap({\n datasource: v.datasource,\n includeAll: !!v.includeAll,\n isHidden: namespace && v.name === 'namespace' ? true : v.hide !== 0,\n isLoading: namespace ? v.type === 'query' && !namespace : v.type === 'query',\n options: _.map(v.options, 'value'),\n query: v.type === 'query' ? v.query : undefined,\n value: namespace && v.name === 'namespace' ? namespace : value || v.options?.[0]?.value,\n });\n }\n });\n\n return allVariables;\n};\n","import { CustomError } from './custom-error';\n\n/**\n * Http error\n *\n * Usage: throw HttpError.fromCode(404)\n */\nexport class HttpError extends CustomError {\n protected static messages = {\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 402: 'Payment Required',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 406: 'Not Acceptable',\n 407: 'Proxy Authentication Required', // RFC 7235\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 411: 'Length Required',\n 412: 'Precondition Failed', // RFC 7232\n 413: 'Payload Too Large', // RFC 7231\n 414: 'URI Too Long', // RFC 7231\n 415: 'Unsupported Media Type',\n 416: 'Range Not Satisfiable', // RFC 7233\n 417: 'Expectation Failed',\n 418: \"I'm a teapot\", // RFC 2324\n 421: 'Misdirected Request', // RFC 7540\n 426: 'Upgrade Required',\n 428: 'Precondition Required', // RFC 6585\n 429: 'Too Many Requests', // RFC 6585\n 431: 'Request Header Fields Too Large', // RFC 6585\n 451: 'Unavailable For Legal Reasons', // RFC 7725\n 500: 'Internal Server Error',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n 505: 'HTTP Version Not Supported',\n 506: 'Variant Also Negotiates', // RFC 2295\n 510: 'Not Extended', // RFC 2774\n 511: 'Network Authentication Required', // RFC 6585\n };\n\n public constructor(\n message: string,\n public code?: number,\n public response?: Response,\n public json?: any,\n ) {\n super(message);\n }\n\n public static fromCode(code: number) {\n return new HttpError(HttpError.messages[code], code);\n }\n}\n\nexport class TimeoutError extends CustomError {\n public constructor(public url: string, public ms: number) {\n super(`Call to ${url} timed out after ${ms}ms.`);\n }\n}\n\nexport class IncompleteDataError extends CustomError {\n public constructor(public labels: string[]) {\n super(`Could not fetch all data. This data are missing: ${labels.join(', ')}.`);\n }\n}\n\nexport class RetryError extends CustomError {}\n","import * as React from 'react';\nimport { connect } from 'react-redux';\nimport { getName, getNamespace } from '@console/shared/src/selectors/common';\nimport {\n checkAccess,\n impersonateStateToProps,\n ImpersonateKind,\n useAccessReviewAllowed,\n useAccessReview as useAccReview,\n} from '@console/dynamic-plugin-sdk';\nimport {\n AccessReviewResourceAttributes,\n K8sKind,\n K8sResourceKind,\n K8sVerb,\n} from '../../module/k8s';\n\nexport { checkAccess };\n\n/** @deprecated - Use useAccessReview from \\@console/dynamic-plugin-sdk instead. */\nexport const useAccessReview2 = (\n resourceAttributes: AccessReviewResourceAttributes,\n impersonate?: ImpersonateKind,\n) => useAccReview(resourceAttributes, impersonate);\n\n/** @deprecated - Use useAccessReview from \\@console/dynamic-plugin-sdk instead. */\nexport const useAccessReview = (\n resourceAttributes: AccessReviewResourceAttributes,\n impersonate?: ImpersonateKind,\n) => useAccessReviewAllowed(resourceAttributes, impersonate);\n\nexport const useMultipleAccessReviews = (\n multipleResourceAttributes: AccessReviewResourceAttributes[],\n impersonate?: ImpersonateKind,\n): [AccessReviewsResult[], boolean] => {\n const [loading, setLoading] = React.useState(true);\n const [allowedArr, setAllowedArr] = React.useState<AccessReviewsResult[]>([]);\n\n React.useEffect(() => {\n const promises = multipleResourceAttributes.map((resourceAttributes) =>\n checkAccess(resourceAttributes, impersonate),\n );\n\n Promise.all(promises)\n .then((values) => {\n setLoading(false);\n const updatedAllowedArr = values.map<AccessReviewsResult>((result) => ({\n resourceAttributes: result.spec.resourceAttributes,\n allowed: result.status.allowed,\n }));\n setAllowedArr(updatedAllowedArr);\n })\n .catch((e) => {\n // eslint-disable-next-line no-console\n console.warn('SelfSubjectAccessReview failed', e);\n setLoading(false);\n });\n }, [impersonate, multipleResourceAttributes]);\n\n return [allowedArr, loading];\n};\n\nconst RequireCreatePermission_: React.FC<RequireCreatePermissionProps> = ({\n model,\n namespace,\n impersonate,\n children,\n}) => {\n const isAllowed = useAccessReviewAllowed(\n {\n group: model?.apiGroup,\n resource: model?.plural,\n verb: 'create',\n namespace,\n },\n impersonate,\n );\n return isAllowed ? <>{children}</> : null;\n};\nexport const RequireCreatePermission = connect(impersonateStateToProps)(RequireCreatePermission_);\nRequireCreatePermission.displayName = 'RequireCreatePermission';\n\ntype RequireCreatePermissionProps = {\n model: K8sKind;\n namespace?: string;\n impersonate?: ImpersonateKind;\n children: React.ReactNode;\n};\n\ntype AccessReviewsResult = {\n resourceAttributes: AccessReviewResourceAttributes;\n allowed: boolean;\n};\n\nexport const asAccessReview = (\n kindObj: K8sKind,\n obj: K8sResourceKind,\n verb: K8sVerb,\n subresource?: string,\n): AccessReviewResourceAttributes => {\n if (!obj) {\n console.warn('review obj should not be null'); // eslint-disable-line no-console\n return null;\n }\n return {\n group: kindObj.apiGroup,\n resource: kindObj.plural,\n name: getName(obj),\n namespace: getNamespace(obj),\n verb,\n subresource,\n };\n};\n","import * as React from 'react';\nimport { LaunchModal, ModalContext } from './ModalProvider';\n\ntype UseModalLauncher = () => LaunchModal;\n\n/**\n * A hook to launch Modals.\n * @example\n *```tsx\n * const AppPage: React.FC = () => {\n * const launchModal = useModal();\n * const onClick = () => launchModal(ModalComponent);\n * return (\n * <Button onClick={onClick}>Launch a Modal</Button>\n * )\n * }\n * ```\n */\nexport const useModal: UseModalLauncher = () => {\n const { launchModal } = React.useContext(ModalContext);\n return launchModal;\n};\n","import * as React from 'react';\nimport classNames from 'classnames';\nimport { StatusComponentProps } from '../../../extensions/console-types';\nimport { DASH } from '../../constants';\nimport CamelCaseWrap from '../utils/camel-case-wrap';\n\ntype StatusIconAndTextProps = StatusComponentProps & {\n icon?: React.ReactElement;\n spin?: boolean;\n};\n\n/**\n * Component for displaying a status icon and text\n * @param {string} [title] - (optional) status text\n * @param {boolean} [iconOnly] - (optional) if true, only displays icon\n * @param {boolean} [noTooltip] - (optional) if true, tooltip won't be displayed\n * @param {string} [className] - (optional) additional class name for the component\n * @param {React.ReactElement} [icon] - (optional) icon to be displayed\n * @param {boolean} [spin] - (optional) if true, icon rotates\n * @example\n * ```tsx\n * <StatusIconAndText title={title} icon={renderIcon} />\n * ```\n */\nconst StatusIconAndText: React.FC<StatusIconAndTextProps> = ({\n icon,\n title,\n spin,\n iconOnly,\n noTooltip,\n className,\n}) => {\n if (!title) {\n return <>{DASH}</>;\n }\n\n return (\n <span\n className={classNames('co-icon-and-text', className)}\n title={iconOnly && !noTooltip ? title : undefined}\n >\n {icon &&\n React.cloneElement(icon, {\n className: classNames(\n spin && 'fa-spin',\n icon.props.className,\n !iconOnly && 'co-icon-and-text__icon co-icon-flex-child',\n ),\n })}\n {!iconOnly && <CamelCaseWrap value={title} dataTest=\"status-text\" />}\n </span>\n );\n};\n\nexport default StatusIconAndText;\n","export { useK8sModel } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks';\n","export enum InventoryStatusGroup {\n WARN = 'WARN',\n ERROR = 'ERROR',\n PROGRESS = 'PROGRESS',\n NOT_MAPPED = 'NOT_MAPPED',\n UNKNOWN = 'UNKNOWN',\n}\n","import * as _ from 'lodash';\nimport { K8sResourceCommon } from '@console/internal/module/k8s';\n\nexport const hasLabel = (obj: K8sResourceCommon, label: string): boolean =>\n _.has(obj, ['metadata', 'labels', label]);\nexport const getName = <A extends K8sResourceCommon = K8sResourceCommon>(value: A) =>\n _.get(value, 'metadata.name') as K8sResourceCommon['metadata']['name'];\nexport const getNamespace = <A extends K8sResourceCommon = K8sResourceCommon>(value: A) =>\n _.get(value, 'metadata.namespace') as K8sResourceCommon['metadata']['namespace'];\nexport const getUID = <A extends K8sResourceCommon = K8sResourceCommon>(value: A) =>\n _.get(value, 'metadata.uid') as K8sResourceCommon['metadata']['uid'];\nexport const getDeletetionTimestamp = <A extends K8sResourceCommon = K8sResourceCommon>(value: A) =>\n _.get(value, 'metadata.deletionTimestamp') as K8sResourceCommon['metadata']['deletionTimestamp'];\nexport const getCreationTimestamp = <A extends K8sResourceCommon = K8sResourceCommon>(value: A) =>\n _.get(value, 'metadata.creationTimestamp') as K8sResourceCommon['metadata']['creationTimestamp'];\nexport const getAPIVersion = <A extends K8sResourceCommon = K8sResourceCommon>(value: A) =>\n _.get(value, 'apiVersion') as K8sResourceCommon['apiVersion'];\nexport const getKind = <A extends K8sResourceCommon = K8sResourceCommon>(value: A) =>\n _.get(value, 'kind') as K8sResourceCommon['kind'];\nexport const getOwnerReferences = <A extends K8sResourceCommon = K8sResourceCommon>(value: A) =>\n _.get(value, 'metadata.ownerReferences') as K8sResourceCommon['metadata']['ownerReferences'];\nexport const getLabels = <A extends K8sResourceCommon = K8sResourceCommon>(\n value: A,\n defaultValue?: K8sResourceCommon['metadata']['labels'],\n) => (_.has(value, 'metadata.labels') ? value.metadata.labels : defaultValue);\nexport const getLabel = <A extends K8sResourceCommon = K8sResourceCommon>(\n value: A,\n label: string,\n defaultValue?: string,\n) => (_.has(value, 'metadata.labels') ? value.metadata.labels[label] : defaultValue);\nexport const getAnnotations = <A extends K8sResourceCommon = K8sResourceCommon>(\n value: A,\n defaultValue?: K8sResourceCommon['metadata']['annotations'],\n) => (_.has(value, 'metadata.annotations') ? value.metadata.annotations : defaultValue);\n","import * as _ from 'lodash-es';\nimport { PluginStore } from '@console/plugin-sdk/src/store';\nimport { ActivePlugin } from '@console/plugin-sdk/src/typings';\nimport { getURLSearchParams } from './components/utils/link';\n\nconst getEnabledDynamicPluginNames = () => {\n const allPluginNames = window.SERVER_FLAGS.consolePlugins;\n const disabledPlugins = getURLSearchParams()['disable-plugins'];\n\n if (disabledPlugins === '') {\n return [];\n } else if (!disabledPlugins) {\n return allPluginNames;\n }\n\n const disabledPluginNames = _.compact(disabledPlugins.split(','));\n return allPluginNames.filter((pluginName) => !disabledPluginNames.includes(pluginName));\n};\n\nconst getI18nNamespaces = () => {\n return window.SERVER_FLAGS.i18nNamespaces;\n};\n\n// The '@console/active-plugins' module is generated during a webpack build,\n// so we use dynamic require() instead of the usual static import statement.\nconst activePlugins =\n process.env.NODE_ENV !== 'test'\n ? (require('@console/active-plugins').default as ActivePlugin[])\n : [];\n\nconst dynamicPluginNames = getEnabledDynamicPluginNames();\nconst i18nNamespaces = getI18nNamespaces();\n\nexport const pluginStore = new PluginStore(activePlugins, dynamicPluginNames, i18nNamespaces);\n\nif (process.env.NODE_ENV !== 'production') {\n // Expose Console plugin store for debugging\n window.pluginStore = pluginStore;\n}\n\nif (process.env.NODE_ENV !== 'test') {\n // eslint-disable-next-line no-console\n console.info(`Static plugins: [${activePlugins.map((p) => p.name).join(', ')}]`);\n // eslint-disable-next-line no-console\n console.info(`Dynamic plugins: [${dynamicPluginNames.join(', ')}]`);\n}\n","import { NavExtension, isNavSection, K8sModel } from '@console/dynamic-plugin-sdk';\nimport { LoadedExtension } from '@console/dynamic-plugin-sdk/src/types';\nimport { getReferenceForModel } from '@console/dynamic-plugin-sdk/src/utils/k8s';\nimport { stripBasePath } from '@console/internal/components/utils';\nimport { startsWithSome } from '@console/shared';\n\nconst toArray = (val) => (val ? (Array.isArray(val) ? val : [val]) : []);\n\nconst itemDependsOnItem = (s1: NavExtension, s2: NavExtension): boolean => {\n if (!s1.properties.insertBefore && !s1.properties.insertAfter) {\n return false;\n }\n const before = toArray(s1.properties.insertBefore);\n const after = toArray(s1.properties.insertAfter);\n return before.includes(s2.properties.id) || after.includes(s2.properties.id);\n};\n\nconst isPositioned = (item: NavExtension, allItems: NavExtension[]): boolean =>\n !!allItems.find((i) => itemDependsOnItem(item, i));\n\nconst findInsertBeforeIndex = (item: NavExtension, allItems: NavExtension[]): number => {\n return toArray(item.properties.insertBefore).reduce((index, currentItem) => {\n // take only the first index found\n if (index < 0) {\n return allItems.findIndex((i) => i.properties.id === currentItem);\n }\n return index;\n }, -1);\n};\n\nconst findInsertAfterIndex = (item: NavExtension, allItems: NavExtension[]): number => {\n return toArray(item.properties.insertAfter).reduce((index, currentItem) => {\n if (index < 0) {\n const newIndex = allItems.findIndex((i) => i.properties.id === currentItem);\n if (newIndex >= 0) {\n return newIndex + 1;\n }\n }\n return index;\n }, -1);\n};\n\nconst findIndexForItem = (item: NavExtension, allItems: NavExtension[]) => {\n const insertBeforeIndex = findInsertBeforeIndex(item, allItems);\n if (insertBeforeIndex >= 0) {\n return insertBeforeIndex;\n }\n return findInsertAfterIndex(item, allItems);\n};\n\nconst insertItem = (\n item: LoadedExtension<NavExtension>,\n currentItems: LoadedExtension<NavExtension>[],\n): void => {\n const index = findIndexForItem(item, currentItems);\n if (index >= 0) {\n currentItems.splice(index, 0, item);\n } else {\n currentItems.push(item);\n }\n};\n\nconst insertPositionedItems = (\n insertItems: LoadedExtension<NavExtension>[],\n currentItems: LoadedExtension<NavExtension>[],\n): void => {\n if (insertItems.length === 0) {\n return;\n }\n\n const sortedItems = insertItems.filter((item) => !isPositioned(item, insertItems));\n const positionedItems = insertItems.filter((item) => isPositioned(item, insertItems));\n\n if (sortedItems.length === 0) {\n // Circular dependencies\n positionedItems.forEach((i) => insertItem(i, currentItems));\n return;\n }\n\n sortedItems.forEach((i) => insertItem(i, currentItems));\n insertPositionedItems(positionedItems, currentItems);\n};\n\nexport const getSortedNavExtensions = (\n navItems: LoadedExtension<NavExtension>[],\n): LoadedExtension<NavExtension>[] => {\n const sortedItems = navItems.filter((item) => !isPositioned(item, navItems));\n const positionedItems = navItems.filter((item) => isPositioned(item, navItems));\n insertPositionedItems(positionedItems, sortedItems);\n return sortedItems;\n};\n\nexport const sortExtensionItems = <E extends NavExtension>(\n extensionItems: LoadedExtension<E>[],\n): LoadedExtension<E>[] => {\n // Mapped by item id\n const mappedIds = extensionItems.reduce((mem, i) => {\n mem[i.properties.id] = i;\n return mem;\n }, {});\n\n // determine all dependencies for a given id\n const dependencies = (id: string, currentDependencies: string[] = []): string[] => {\n if (currentDependencies.includes(id)) {\n return [];\n }\n const { insertBefore, insertAfter } = mappedIds[id].properties;\n const before = toArray(insertBefore);\n const after = toArray(insertAfter);\n const dependencyIds = [...before, ...after].filter(\n (i) => i !== id && !currentDependencies.includes(i),\n );\n return dependencyIds.reduce((acc, dependencyId) => {\n if (dependencyId) {\n // Add this dependency and its dependencies\n // eslint-disable-next-line no-param-reassign\n acc = [...acc, dependencyId, ...dependencies(dependencyId, [...acc, dependencyId])];\n }\n return acc;\n }, []);\n };\n\n const sortItems = (preSorted: NavExtension[], itemsToSort: NavExtension[]): NavExtension[] => {\n if (itemsToSort.length < 2) {\n preSorted.push(...itemsToSort);\n return;\n }\n\n let sortedItem = false;\n const remainingItems = [];\n itemsToSort.forEach((item) => {\n const deps = dependencies(item.properties.id);\n // If not dependant on any items to be sorted, ok to add it in\n if (!deps.find((id) => itemsToSort.find((i) => i.properties.id === id))) {\n sortedItem = true;\n preSorted.push(item);\n } else {\n // Still has a dependency\n remainingItems.push(item);\n }\n });\n\n if (remainingItems.length) {\n // If nothing changed, just add the remaining items\n if (!sortedItem) {\n preSorted.push(...remainingItems);\n return;\n }\n // Sort the remaining items\n sortItems(preSorted, remainingItems);\n }\n };\n\n const sortedItems = [];\n sortItems(sortedItems, extensionItems);\n\n return sortedItems;\n};\n\n// Strips '/<basePath>/k8s/cluster/', '/<basePath>/k8s/ns/<namespace>/', and\n// '/<basePath>/k8s/all-namespaces/' from the beginning a given path\nexport const stripScopeFromPath = (path: string) =>\n stripBasePath(path)?.replace(\n /^\\/?(?:k8s\\/cluster\\/|k8s\\/all-namespaces\\/|k8s\\/ns\\/[^/]*\\/)?(.*?)\\/?$/,\n '$1',\n );\n\nexport const navItemHrefIsActive = (\n location: string,\n href: string,\n startsWith?: string[],\n): boolean => {\n const scopelessLocation = stripScopeFromPath(location);\n const scopelessHref = stripScopeFromPath(href);\n const locationSegments = scopelessLocation.split('/');\n const hrefSegments = scopelessHref.split('/');\n const hrefMatch = hrefSegments.every((segment, i) => segment === locationSegments?.[i]);\n return hrefMatch || startsWithSome(scopelessLocation, ...(startsWith ?? []));\n};\n\nexport const navItemResourceIsActive = (\n location: string,\n k8sModel: K8sModel,\n startsWith?: string[],\n): boolean => {\n const scopelessPath = stripScopeFromPath(location);\n const [firstSegment] = scopelessPath.split('/');\n const resourceMatches =\n k8sModel &&\n firstSegment &&\n [getReferenceForModel(k8sModel), k8sModel.plural].includes(firstSegment);\n return resourceMatches || startsWithSome(scopelessPath, ...(startsWith ?? []));\n};\n\nexport const isTopLevelNavItem = (e: LoadedExtension<NavExtension>) =>\n isNavSection(e) || !e.properties.section;\n","import { action, ActionType as Action } from 'typesafe-actions';\nimport { Dispatch } from 'react-redux';\n\nimport { coFetchJSON } from '../co-fetch';\nimport { k8sBasePath } from '../module/k8s/k8s';\nimport { isWatchActive, RESULTS_TYPE } from '../reducers/dashboards';\nimport { RootState } from '../redux';\nimport { getPrometheusURL, PrometheusEndpoint } from '../components/graphs/helpers';\nimport { PrometheusResponse } from '../components/graphs';\nimport { URL_POLL_DEFAULT_DELAY } from '../components/utils/url-poll-hook';\nimport { Fetch, RequestMap } from '@console/dynamic-plugin-sdk/src/api/internal-types';\n\nexport enum ActionType {\n StopWatch = 'stopWatch',\n SetData = 'setData',\n ActivateWatch = 'activateWatch',\n UpdateWatchTimeout = 'updateWatchTimeout',\n UpdateWatchInFlight = 'updateWatchInFlight',\n SetError = 'setError',\n}\n\nexport const stopWatch = (type: RESULTS_TYPE, key: string) =>\n action(ActionType.StopWatch, { type, key });\nexport const setData = (type: RESULTS_TYPE, key: string, data) =>\n action(ActionType.SetData, { type, key, data });\nexport const activateWatch = (type: RESULTS_TYPE, key: string) =>\n action(ActionType.ActivateWatch, { type, key });\nexport const updateWatchTimeout = (type: RESULTS_TYPE, key: string, timeout: NodeJS.Timer) =>\n action(ActionType.UpdateWatchTimeout, { type, key, timeout });\nexport const updateWatchInFlight = (type: RESULTS_TYPE, key: string, inFlight: boolean) =>\n action(ActionType.UpdateWatchInFlight, { type, key, inFlight });\nexport const setError = (type: RESULTS_TYPE, key: string, error) =>\n action(ActionType.SetError, { type, key, error });\n\nconst dashboardsActions = {\n stopWatch,\n setData,\n activateWatch,\n updateWatchTimeout,\n updateWatchInFlight,\n setError,\n};\n\nexport const getQueryKey = (query: string, timespan?: number): string =>\n timespan ? `${query}@${timespan}` : query;\n\nexport const getPrometheusQueryResponse = (\n prometheusResults: RequestMap<PrometheusResponse>,\n query: string,\n timespan?: number,\n): [PrometheusResponse, any] => {\n const queryKey = getQueryKey(query, timespan);\n const data = prometheusResults.getIn([queryKey, 'data']);\n const loadError = prometheusResults.getIn([queryKey, 'loadError']);\n return [data, loadError];\n};\n\nconst fetchPeriodically: FetchPeriodically = async (\n dispatch,\n type,\n key,\n getURL,\n getState,\n fetch,\n) => {\n if (!isWatchActive(getState().dashboards, type, key)) {\n return;\n }\n try {\n dispatch(updateWatchInFlight(type, key, true));\n const data = await fetch(getURL());\n dispatch(setData(type, key, data));\n dispatch(setError(type, key, null));\n } catch (error) {\n dispatch(setError(type, key, error));\n dispatch(setData(type, key, null));\n } finally {\n dispatch(updateWatchInFlight(type, key, false));\n const timeout = setTimeout(\n () => fetchPeriodically(dispatch, type, key, getURL, getState, fetch),\n URL_POLL_DEFAULT_DELAY,\n );\n dispatch(updateWatchTimeout(type, key, timeout));\n }\n};\n\nexport const watchPrometheusQuery: WatchPrometheusQueryAction = (query, namespace, timespan) => (\n dispatch,\n getState,\n) => {\n const queryKey = getQueryKey(query, timespan);\n const isActive = isWatchActive(getState().dashboards, RESULTS_TYPE.PROMETHEUS, queryKey);\n dispatch(activateWatch(RESULTS_TYPE.PROMETHEUS, queryKey));\n if (!isActive) {\n const prometheusBaseURL = namespace\n ? window.SERVER_FLAGS.prometheusTenancyBaseURL\n : window.SERVER_FLAGS.prometheusBaseURL;\n if (!prometheusBaseURL) {\n dispatch(\n setError(RESULTS_TYPE.PROMETHEUS, queryKey, new Error('Prometheus URL is not available')),\n );\n } else {\n const url = () =>\n getPrometheusURL({\n endpoint: timespan ? PrometheusEndpoint.QUERY_RANGE : PrometheusEndpoint.QUERY,\n namespace,\n query,\n timespan,\n });\n fetchPeriodically(dispatch, RESULTS_TYPE.PROMETHEUS, queryKey, url, getState, coFetchJSON);\n }\n }\n};\n\nexport const watchURL: WatchURLAction = (url, fetch = coFetchJSON) => (dispatch, getState) => {\n const isActive = isWatchActive(getState().dashboards, RESULTS_TYPE.URL, url);\n dispatch(activateWatch(RESULTS_TYPE.URL, url));\n if (!isActive) {\n const k8sURL = () => `${k8sBasePath}/${url}`;\n fetchPeriodically(dispatch, RESULTS_TYPE.URL, url, k8sURL, getState, fetch);\n }\n};\n\nexport const stopWatchPrometheusQuery: StopWatchPrometheusAction = (query, timespan) =>\n stopWatch(RESULTS_TYPE.PROMETHEUS, getQueryKey(query, timespan));\nexport const stopWatchURL = (url: string) => stopWatch(RESULTS_TYPE.URL, url);\n\ntype ThunkAction = (dispatch: Dispatch, getState: () => RootState) => void;\n\nexport type WatchURLAction = (url: string, fetch?: Fetch) => ThunkAction;\nexport type WatchPrometheusQueryAction = (\n query: string,\n namespace?: string,\n timespan?: number,\n) => ThunkAction;\nexport type StopWatchURLAction = (url: string) => void;\nexport type StopWatchPrometheusAction = (query: string, timespan?: number) => void;\n\ntype FetchPeriodically = (\n dispatch: Dispatch,\n type: RESULTS_TYPE,\n key: string,\n getURL: () => string,\n getState: () => RootState,\n fetch: Fetch,\n) => void;\n\nexport type DashboardsAction = Action<typeof dashboardsActions>;\n","import * as _ from 'lodash-es';\nimport { Map as ImmutableMap } from 'immutable';\n\nimport { ActionType, UIAction } from '../actions/ui';\nimport { ALL_APPLICATIONS_KEY, ALL_NAMESPACES_KEY } from '@console/shared/src/constants';\nimport { getNamespace } from '../components/utils/link';\nimport { OverviewSpecialGroup } from '../components/overview/constants';\nimport { RootState } from '../redux';\nimport { getUser } from '@console/dynamic-plugin-sdk';\n\nexport type UIState = ImmutableMap<string, any>;\n\nexport default (state: UIState, action: UIAction): UIState => {\n if (!state) {\n const { pathname } = window.location;\n return ImmutableMap({\n activeNavSectionId: 'workloads',\n location: pathname,\n showOperandsInAllNamespaces: true,\n activeNamespace: ALL_NAMESPACES_KEY,\n activeApplication: ALL_APPLICATIONS_KEY,\n createProjectMessage: '',\n serviceLevel: ImmutableMap({\n level: '',\n daysRemaining: null,\n trialDateEnd: null,\n hasSecretAccess: false,\n clusterID: '',\n }),\n overview: ImmutableMap({\n metrics: {},\n resources: ImmutableMap({}),\n selectedDetailsTab: 'Resources',\n selectedUID: '',\n selectedGroup: OverviewSpecialGroup.GROUP_BY_APPLICATION,\n groupOptions: ImmutableMap(),\n filterValue: '',\n }),\n user: {},\n utilizationDuration: ImmutableMap({\n duration: null,\n endTime: null,\n selectedKey: null,\n }),\n deprecatedOperator: ImmutableMap({\n package: null,\n channel: null,\n version: null,\n }),\n });\n }\n\n switch (action.type) {\n case ActionType.SetActiveApplication:\n return state.set('activeApplication', action.payload.application);\n\n case ActionType.SetActiveNamespace:\n if (!action.payload.namespace) {\n // eslint-disable-next-line no-console\n console.warn('setActiveNamespace: Not setting to falsy!');\n return state;\n }\n\n return state\n .set('activeApplication', ALL_APPLICATIONS_KEY)\n .set('activeNamespace', action.payload.namespace);\n\n case ActionType.SetCurrentLocation: {\n state = state.set('location', action.payload.location);\n const ns = getNamespace(action.payload.location);\n if (_.isUndefined(ns)) {\n return state;\n }\n return state.set('activeNamespace', ns);\n }\n case ActionType.SetServiceLevel:\n return state.set('serviceLevel', {\n level: action.payload.serviceLevel,\n daysRemaining: action.payload.daysRemaining,\n clusterID: action.payload.clusterID,\n trialDateEnd: action.payload.trialDateEnd,\n hasSecretAccess: action.payload.hasSecretAccess,\n });\n\n case ActionType.SortList:\n return state.mergeIn(\n ['listSorts', action.payload.listId],\n _.pick(action.payload, ['field', 'func', 'orderBy']),\n );\n\n case ActionType.SetCreateProjectMessage:\n return state.set('createProjectMessage', action.payload.message);\n\n case ActionType.SetClusterID:\n return state.set('clusterID', action.payload.clusterID);\n\n case ActionType.NotificationDrawerToggleExpanded:\n return state.setIn(\n ['notifications', 'isExpanded'],\n !state.getIn(['notifications', 'isExpanded']),\n );\n\n case ActionType.SelectOverviewItem:\n return state.setIn(['overview', 'selectedUID'], action.payload.uid);\n\n case ActionType.SelectOverviewDetailsTab:\n return state.setIn(['overview', 'selectedDetailsTab'], action.payload.tab);\n\n case ActionType.DismissOverviewDetails:\n return state.mergeIn(['overview'], { selectedUID: '', selectedDetailsTab: '' });\n\n case ActionType.UpdateOverviewMetrics:\n return state.setIn(['overview', 'metrics'], action.payload.metrics);\n\n case ActionType.UpdateOverviewResources: {\n const newResources = ImmutableMap(_.keyBy(action.payload.resources, 'obj.metadata.uid'));\n return state.setIn(['overview', 'resources'], newResources);\n }\n\n case ActionType.UpdateOverviewSelectedGroup: {\n return state.setIn(['overview', 'selectedGroup'], action.payload.group);\n }\n\n case ActionType.UpdateOverviewLabels: {\n return state.setIn(['overview', 'labels'], action.payload.labels);\n }\n\n case ActionType.UpdateOverviewFilterValue: {\n return state.setIn(['overview', 'filterValue'], action.payload.value);\n }\n case ActionType.UpdateTimestamps:\n return state.set('lastTick', action.payload.lastTick);\n\n case ActionType.SetPodMetrics:\n return state.setIn(['metrics', 'pod'], action.payload.podMetrics);\n\n case ActionType.SetNamespaceMetrics:\n return state.setIn(['metrics', 'namespace'], action.payload.namespaceMetrics);\n case ActionType.SetNodeMetrics:\n return state.setIn(['metrics', 'node'], action.payload.nodeMetrics);\n case ActionType.SetPVCMetrics:\n return state.setIn(['metrics', 'pvc'], action.payload.pvcMetrics);\n case ActionType.SetUtilizationDuration:\n return state.setIn(['utilizationDuration', 'duration'], action.payload.duration);\n case ActionType.SetUtilizationDurationSelectedKey:\n return state.setIn(['utilizationDuration', 'selectedKey'], action.payload.key);\n case ActionType.SetUtilizationDurationEndTime:\n return state.setIn(['utilizationDuration', 'endTime'], action.payload.endTime);\n case ActionType.SetShowOperandsInAllNamespaces:\n return state.set('showOperandsInAllNamespaces', action.payload.value);\n case ActionType.SetDeprecatedPackage:\n return state.setIn(['deprecatedOperator', 'package'], action.payload.value);\n case ActionType.SetDeprecatedChannel:\n return state.setIn(['deprecatedOperator', 'channel'], action.payload.value);\n case ActionType.SetDeprecatedVersion:\n return state.setIn(['deprecatedOperator', 'version'], action.payload.value);\n default:\n break;\n }\n return state;\n};\n\nexport const createProjectMessageStateToProps = ({ UI }: RootState) => {\n return { createProjectMessage: UI.get('createProjectMessage') as string };\n};\n\nexport const userStateToProps = (state: RootState) => {\n return { user: getUser(state) };\n};\n\nexport const getActiveNamespace = ({ UI }: RootState): string => UI.get('activeNamespace');\n\nexport const getActiveApplication = ({ UI }: RootState): string => UI.get('activeApplication');\n","export * from './models';\nexport * from './components';\nexport * from './types';\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from 'react-router-dom-v5-compat';\nimport {\n InventoryItemTitleProps,\n InventoryItemBodyProps,\n InventoryItemStatusProps,\n} from '@console/dynamic-plugin-sdk';\n\nconst InventoryItem: React.FC = ({ children }) => (\n <div className=\"co-inventory-card__item\">{children}</div>\n);\n\nexport const InventoryItemLoading: React.FC = () => <div className=\"skeleton-inventory\" />;\n\nexport const InventoryItemTitle: React.FC<InventoryItemTitleProps> = ({ children }) => (\n <div className=\"co-inventory-card__item-title\">{children}</div>\n);\n\nexport const InventoryItemBody: React.FC<InventoryItemBodyProps> = ({ error, children }) => {\n const { t } = useTranslation();\n return (\n <div className=\"co-inventory-card__item-status\">\n {error ? (\n <div className=\"co-dashboard-text--small text-secondary\">\n {t('console-shared~Not available')}\n </div>\n ) : (\n children\n )}\n </div>\n );\n};\n\nexport const InventoryItemStatus: React.FC<InventoryItemStatusProps> = ({\n count,\n icon,\n linkTo,\n}) => {\n const body = (\n <>\n <span>{count}</span>\n <span className=\"co-dashboard-icon co-icon-space-l\">{icon}</span>\n </>\n );\n return (\n <div className=\"co-inventory-card__status\">\n {linkTo ? <Link to={linkTo}>{body}</Link> : body}\n </div>\n );\n};\n\nexport default InventoryItem;\n","export * from './actions';\nexport * from './add-actions';\nexport * from './alerts';\nexport * from './breadcrumbs';\nexport * from './catalog';\nexport * from './cluster-configuration';\nexport * from './cluster-overview';\nexport * from './cluster-settings';\nexport * from './console-types';\nexport * from './context-providers';\nexport * from './create-resource';\nexport * from './dashboard-types';\nexport * from './dashboards';\nexport * from './details-item';\nexport * from './feature-flags';\nexport * from './file-upload';\nexport * from './horizontal-nav-tabs';\nexport * from './import-environments';\nexport * from './navigation';\nexport * from './notification-alert';\nexport * from './pages';\nexport * from './perspectives';\nexport * from './project-overview';\nexport * from './pvc';\nexport * from './redux';\nexport * from './resource-metadata';\nexport * from './storage-class-provisioner';\nexport * from './storage-provider';\nexport * from './telemetry';\nexport * from './topology-details';\nexport * from './topology';\nexport * from './user-preferences';\nexport * from './yaml-templates';\nexport * from './node';\nexport * from './create-project-modal';\n","import * as React from 'react';\nimport { deseralizeData } from '../utils/user-settings';\nimport { useUserSettings } from './useUserSettings';\n\nexport const useUserSettingsCompatibility = <T>(\n key: string,\n storageKey: string,\n defaultValue?: T,\n sync: boolean = false,\n): [T, React.Dispatch<React.SetStateAction<T>>, boolean] => {\n const [settings, setSettings, loaded] = useUserSettings<T>(\n key,\n localStorage.getItem(storageKey) !== null\n ? deseralizeData(localStorage.getItem(storageKey))\n : defaultValue,\n sync,\n );\n\n React.useEffect(\n () => () => {\n if (loaded) {\n localStorage.removeItem(storageKey);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [loaded],\n );\n\n return [settings, setSettings, loaded];\n};\n","import * as _ from 'lodash';\nimport { ImpersonateKind } from '@console/dynamic-plugin-sdk';\nimport { checkAccess } from '@console/internal/components/utils/rbac';\nimport {\n K8sResourceKind,\n K8sKind,\n SelfSubjectAccessReviewKind,\n AccessReviewResourceAttributes,\n} from '@console/internal/module/k8s';\nimport { podColor, AllPodStatus, DEPLOYMENT_STRATEGY, DEPLOYMENT_PHASE } from '../constants';\nimport { PodControllerOverviewItem, DeploymentStrategy } from '../types';\nimport { ExtPodKind, PodRCData } from '../types/pod';\n\nexport const podStatus = Object.keys(podColor);\n\nconst isContainerFailedFilter = (containerStatus) => {\n return containerStatus.state.terminated && containerStatus.state.terminated.exitCode !== 0;\n};\n\nexport const isContainerLoopingFilter = (containerStatus) => {\n return (\n containerStatus.state.waiting && containerStatus.state.waiting.reason === 'CrashLoopBackOff'\n );\n};\n\nconst numContainersReadyFilter = (pod) => {\n const {\n status: { containerStatuses },\n } = pod;\n let numReady = 0;\n _.forEach(containerStatuses, (status) => {\n if (status.ready) {\n numReady++;\n }\n });\n return numReady;\n};\n\nconst isReady = (pod) => {\n const {\n spec: { containers },\n } = pod;\n const numReady = numContainersReadyFilter(pod);\n const total = _.size(containers);\n\n return numReady === total;\n};\n\nconst podWarnings = (pod) => {\n const {\n status: { phase, containerStatuses },\n } = pod;\n if (phase === AllPodStatus.Running && containerStatuses) {\n return _.map(containerStatuses, (containerStatus) => {\n if (!containerStatus.state) {\n return null;\n }\n\n if (isContainerFailedFilter(containerStatus)) {\n if (_.has(pod, ['metadata', 'deletionTimestamp'])) {\n return AllPodStatus.Failed;\n }\n return AllPodStatus.Warning;\n }\n if (isContainerLoopingFilter(containerStatus)) {\n return AllPodStatus.CrashLoopBackOff;\n }\n return null;\n }).filter((x) => x);\n }\n return null;\n};\n\nexport const getPodStatus = (pod) => {\n if (_.has(pod, ['metadata', 'deletionTimestamp'])) {\n return AllPodStatus.Terminating;\n }\n const warnings = podWarnings(pod);\n if (warnings !== null && warnings.length) {\n if (warnings.includes(AllPodStatus.CrashLoopBackOff)) {\n return AllPodStatus.CrashLoopBackOff;\n }\n if (warnings.includes(AllPodStatus.Failed)) {\n return AllPodStatus.Failed;\n }\n return AllPodStatus.Warning;\n }\n const phase = _.get(pod, ['status', 'phase'], AllPodStatus.Unknown);\n if (phase === AllPodStatus.Running && !isReady(pod)) {\n return AllPodStatus.NotReady;\n }\n return phase;\n};\n\nexport const calculateRadius = (size: number) => {\n const radius = size / 2;\n const podStatusStrokeWidth = (8 / 104) * size;\n const podStatusInset = (5 / 104) * size;\n const podStatusOuterRadius = radius - podStatusInset;\n const podStatusInnerRadius = podStatusOuterRadius - podStatusStrokeWidth;\n const decoratorRadius = radius * 0.25;\n\n return {\n radius,\n podStatusInnerRadius,\n podStatusOuterRadius,\n decoratorRadius,\n podStatusStrokeWidth,\n podStatusInset,\n };\n};\n\nexport const checkPodEditAccess = (\n resource: K8sResourceKind,\n resourceKind: K8sKind,\n impersonate: ImpersonateKind,\n subresource?: string,\n): Promise<SelfSubjectAccessReviewKind> => {\n if (_.isEmpty(resource) || !resourceKind) {\n return Promise.resolve(null);\n }\n const { name, namespace } = resource.metadata;\n const resourceAttributes: AccessReviewResourceAttributes = {\n group: resourceKind.apiGroup,\n resource: resourceKind.plural,\n subresource,\n verb: 'patch',\n name,\n namespace,\n };\n return checkAccess(resourceAttributes, impersonate);\n};\n\n/**\n * check if config is knative serving resource.\n * @param configRes\n * @param properties\n */\nexport const isKnativeServing = (configRes: K8sResourceKind, properties: string): boolean => {\n const deploymentsLabels = _.get(configRes, properties) || {};\n return !!deploymentsLabels['serving.knative.dev/configuration'];\n};\n\n/**\n * check if the deployment/deploymentconfig is idled.\n * @param deploymentConfig\n */\nexport const isIdled = (deploymentConfig: K8sResourceKind): boolean => {\n return !!_.get(\n deploymentConfig,\n 'metadata.annotations[\"idling.alpha.openshift.io/idled-at\"]',\n false,\n );\n};\n\nconst getScalingUp = (dc: K8sResourceKind): ExtPodKind => {\n return {\n ..._.pick(dc, 'metadata'),\n status: {\n phase: AllPodStatus.ScalingUp,\n },\n };\n};\n\nexport const podDataInProgress = (\n dc: K8sResourceKind,\n current: PodControllerOverviewItem,\n isRollingOut: boolean,\n): boolean => {\n const strategy: DeploymentStrategy = dc?.spec?.strategy?.type;\n return (\n current?.phase !== DEPLOYMENT_PHASE.complete &&\n (strategy === DEPLOYMENT_STRATEGY.recreate || strategy === DEPLOYMENT_STRATEGY.rolling) &&\n isRollingOut\n );\n};\n\nexport const getPodData = (\n podRCData: PodRCData,\n): { inProgressDeploymentData: ExtPodKind[] | null; completedDeploymentData: ExtPodKind[] } => {\n const strategy: DeploymentStrategy = _.get(podRCData.obj, ['spec', 'strategy', 'type'], null);\n const currentDeploymentphase = podRCData.current && podRCData.current.phase;\n const currentPods = podRCData.current && podRCData.current.pods;\n const previousPods = podRCData.previous && podRCData.previous.pods;\n // DaemonSets and StatefulSets\n if (!strategy) return { inProgressDeploymentData: null, completedDeploymentData: podRCData.pods };\n\n // Scaling no. of pods\n if (currentDeploymentphase === DEPLOYMENT_PHASE.complete) {\n return { inProgressDeploymentData: null, completedDeploymentData: currentPods };\n }\n\n // Deploy - Rolling - Recreate\n if (\n (strategy === DEPLOYMENT_STRATEGY.recreate ||\n strategy === DEPLOYMENT_STRATEGY.rolling ||\n strategy === DEPLOYMENT_STRATEGY.rollingUpdate) &&\n podRCData.isRollingOut\n ) {\n return {\n inProgressDeploymentData: currentPods,\n completedDeploymentData: previousPods,\n };\n }\n // if build is not finished show `Scaling Up` on pod phase\n if (!podRCData.current && !podRCData.previous) {\n return {\n inProgressDeploymentData: null,\n completedDeploymentData: [getScalingUp(podRCData.obj)],\n };\n }\n return { inProgressDeploymentData: null, completedDeploymentData: podRCData.pods };\n};\n","import * as yup from 'yup';\n\ntype AdvancedOptions = {\n timeout?: {\n limit?: number;\n unit?: string;\n };\n image?: string;\n};\n\nexport type CloudShellSetupFormData = {\n namespace?: string;\n newNamespace?: string;\n createNamespace?: boolean;\n advancedOptions?: AdvancedOptions;\n};\n\nexport const CREATE_NAMESPACE_KEY = '#CREATE_NAMESPACE_KEY#';\nconst projectNameRegex = /^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/;\n\nexport const newNamespaceValidationSchema = yup.string().when('namespace', {\n is: CREATE_NAMESPACE_KEY,\n then: yup\n .string()\n .matches(\n projectNameRegex,\n \"Name must consist of lower case alphanumeric characters or '-' and must start and end with an alphanumeric character.\",\n )\n .required('Required'),\n});\n\nexport const advancedOptionsValidationSchema = yup.object().shape({\n image: yup.string(),\n});\n\nexport const cloudShellSetupValidationSchema = () =>\n yup.object().shape({\n namespace: yup.string().required('Required'),\n newNamespace: newNamespaceValidationSchema,\n advancedOptions: advancedOptionsValidationSchema,\n });\n\nexport const getCloudShellTimeout = (limit: number, unit: string): string | null =>\n unit && limit && limit > 0 ? `${limit}${unit}` : null;\n","export const MONITORING_DASHBOARDS_DEFAULT_TIMESPAN = 30 * 60 * 1000;\n\nexport const MONITORING_DASHBOARDS_VARIABLE_ALL_OPTION_KEY = 'ALL_OPTION_KEY';\n\nexport type ColumnStyle = {\n alias?: string;\n decimals?: number;\n unit?: string;\n pattern: string;\n type: string;\n};\n\ntype ValueMap = {\n op: string;\n text: string;\n value: string;\n};\n\ntype YAxis = {\n format: string;\n};\n\nexport type Panel = {\n breakpoint?: string;\n datasource?: DataSource;\n decimals?: number;\n format?: string;\n gridPos?: {\n h: number;\n w: number;\n x: number;\n y: number;\n };\n id: string;\n legend?: {\n show: boolean;\n };\n options?: {\n fieldOptions: {\n thresholds: {\n color?: string;\n value: number;\n }[];\n };\n };\n panels: Panel[];\n postfix?: string;\n postfixFontSize?: string;\n prefix?: string;\n prefixFontSize?: string;\n span: number;\n stack: boolean;\n styles?: ColumnStyle[];\n targets: Array<{\n expr: string;\n legendFormat?: string;\n refId: string;\n }>;\n title: string;\n transform?: string;\n type: string;\n units?: string;\n valueFontSize?: string;\n valueMaps?: ValueMap[];\n yaxes: YAxis[];\n};\n\nexport type TemplateVariable = {\n datasource: DataSource;\n hide: number;\n includeAll: boolean;\n name: string;\n options: { selected: boolean; value: string }[];\n query: string;\n type: string;\n};\n\nexport type Row = {\n collapse?: boolean;\n panels: Panel[];\n showTitle?: boolean;\n title?: string;\n};\n\nexport type Board = {\n data: {\n panels: Panel[];\n rows: Row[];\n templating: {\n list: TemplateVariable[];\n };\n tags: string[];\n title: string;\n };\n name: string;\n};\n\nexport type TimeDropdownsProps = {\n namespace?: string;\n};\n\nexport type DataSource = {\n name: string;\n type: string;\n};\n","import * as React from 'react';\nimport classNames from 'classnames';\nimport { OverviewProps } from '@console/dynamic-plugin-sdk';\nimport './dashboard.scss';\n\nconst Dashboard: React.FC<OverviewProps> = ({ className, children }) => (\n <div data-test-id=\"dashboard\" className={classNames('co-dashboard-body', className)}>\n {children}\n </div>\n);\n\nexport default Dashboard;\n","import { connect } from 'react-redux';\n\nimport {\n K8sKind,\n K8sResourceKindReference,\n GroupVersionKind,\n isGroupVersionKind,\n allModels,\n getGroupVersionKind,\n} from './module/k8s';\nimport { RootState } from './redux';\nimport { getK8sModel } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sModel';\n\nexport const connectToModel = connect(\n ({ k8s }: RootState, props: { kind: K8sResourceKindReference } & any) => {\n const kind: string = props.kind || props.match?.params?.plural || props.params?.plural;\n return {\n kindObj: getK8sModel(k8s, kind),\n kindsInFlight: k8s.getIn(['RESOURCES', 'inFlight']),\n } as any;\n },\n);\n\ntype WithPluralProps = {\n kindObj?: K8sKind;\n modelRef?: K8sResourceKindReference;\n kindsInFlight?: boolean;\n};\n\nexport type ConnectToPlural = <P extends WithPluralProps>(\n C: React.ComponentType<P>,\n) => React.ComponentType<Omit<P, keyof WithPluralProps>> & {\n WrappedComponent: React.ComponentType<P>;\n};\n\n/**\n * @deprecated TODO(alecmerdler): `plural` is not a unique lookup key, remove uses of this.\n * FIXME(alecmerdler): Not returning correctly typed `WrappedComponent`\n */\nexport const connectToPlural: ConnectToPlural = connect(\n (\n { k8s }: RootState,\n props: {\n plural?: GroupVersionKind | string;\n match?: any;\n params?: any;\n },\n ) => {\n const plural = props.plural || props.params?.plural || props.match?.params?.plural;\n const groupVersionKind = getGroupVersionKind(plural);\n\n let kindObj: K8sKind = null;\n if (groupVersionKind) {\n const [group, version, kind] = groupVersionKind;\n kindObj = allModels().find(\n (model) =>\n (model.apiGroup ?? 'core') === group &&\n model.apiVersion === version &&\n model.kind === kind,\n );\n\n if (!kindObj) {\n kindObj = getK8sModel(k8s, plural);\n }\n } else {\n kindObj = allModels().find(\n (model) => model.plural === plural && (!model.crd || model.legacyPluralURL),\n );\n }\n\n const modelRef = isGroupVersionKind(plural) ? plural : kindObj?.kind;\n\n return { kindObj, modelRef, kindsInFlight: k8s.getIn(['RESOURCES', 'inFlight']) };\n },\n);\n","import * as _ from 'lodash';\nimport { K8sModel } from '../../api/common-types';\nimport { Options } from '../../api/internal-types';\nimport { K8sResourceCommon, Patch, QueryParams } from '../../extensions/console-types';\nimport { consoleFetchJSON as coFetchJSON } from '../fetch';\nimport { selectorToString, resourceURL } from './k8s-utils';\n\ntype BaseOptions = {\n name?: string;\n ns?: string;\n path?: string;\n queryParams?: QueryParams;\n};\n\ntype AdapterFunc = <D extends BaseOptions>(\n func: Function,\n knownArgs: string[],\n) => (options: D) => Promise<any>;\n\n/**\n * An adapter function to call the underlying APIs with provided options.\n * @param func The function to be called.\n * @param knownArgs The list of arguments to be provided to underlying API in order.\n * @returns The function called with provided arguments.\n */\nconst adapterFunc: AdapterFunc = (func: Function, knownArgs: string[]) => {\n return (options) => {\n const args = knownArgs.map((arg) => {\n // forming opts to match underlying API signature if it's there in knownArgs\n if (arg === 'opts') {\n const { name, ns, path, queryParams } = options || {};\n return {\n ...(name && { name }),\n ...(ns && { ns }),\n ...(path && { path }),\n ...(queryParams && { queryParams }),\n };\n }\n return options[arg];\n });\n return func(...args);\n };\n};\n\n/**\n * @deprecated Use {@link k8sGetResource} instead. Support for k8sGet will be removed in a future release.\n * It fetches a resource from the cluster, based on the provided model, name, namespace.\n * If the name is provided it returns one resource else it returns all the resources matching the model.\n * @param model Kubernetes model\n * @param name The name of the resource, if not provided then it'll look for all the resources matching the model.\n * @param ns The namespace to look into, should not be specified for cluster-scoped resources.\n * @param opts The options to pass\n * @param requestInit The fetch init object to use. This can have request headers, method, redirect, etc.\n * See more at https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules_typedoc_node_modules_typescript_lib_lib_dom_d_.requestinit.html\n * @returns A promise that resolves to the response as JSON object with a resource if the name is provided\n * else it returns all the resouces matching the model. In case of failure, the promise gets rejected with HTTP error response.\n */\nexport const k8sGet = (\n model: K8sModel,\n name: string,\n ns?: string,\n opts?: Options,\n requestInit?: RequestInit,\n) => coFetchJSON(resourceURL(model, Object.assign({ ns, name }, opts)), 'GET', requestInit, null);\n\ntype OptionsGet = BaseOptions & {\n model: K8sModel;\n requestInit?: RequestInit;\n};\n\ntype K8sGetResource = <R extends K8sResourceCommon>(options: OptionsGet) => Promise<R>;\n\n/**\n * It fetches a resource from the cluster, based on the provided options.\n * If the name is provided it returns resource, else it returns all the resources matching the model.\n * @param options Which are passed as key-value pairs in the map\n * @param options.model - Kubernetes model\n * @param options.name - The name of the resource, if not provided then it looks for all the resources matching the model.\n * @param options.ns - The namespace to look into, should not be specified for cluster-scoped resources.\n * @param options.path - Appends as subpath if provided\n * @param options.queryParams - The query parameters to be included in the URL.\n * @param options.requestInit - The fetch init object to use. This can have request headers, method, redirect, etc. See more https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules_typedoc_node_modules_typescript_lib_lib_dom_d_.requestinit.html\n * @returns A promise that resolves to the response as JSON object with a resource if the name is provided, else it returns all the resources matching the model. In case of failure, the promise gets rejected with HTTP error response.\n */\nexport const k8sGetResource: K8sGetResource = adapterFunc(k8sGet, [\n 'model',\n 'name',\n 'ns',\n 'opts',\n 'requestInit',\n]);\n\n/**\n * @deprecated Use {@link k8sCreateResource} instead. Support for k8sCreate will be removed in a future release.\n * It creates a resource in the cluster, based on the provided model and payload.\n * @param model Kubernetes model\n * @param data The payload for the resource to be created.\n * @param opts The options to pass.\n * @returns A promise that resolves to the response of the resource created.\n * In case of failure promise gets rejected with HTTP error response.\n */\nexport const k8sCreate = <R extends K8sResourceCommon>(\n model: K8sModel,\n data: R,\n opts: Options = {},\n) => {\n return coFetchJSON.post(\n resourceURL(model, Object.assign({ ns: data?.metadata?.namespace }, opts)),\n data,\n null,\n null,\n );\n};\n\ntype OptionsCreate<R> = BaseOptions & {\n model: K8sModel;\n data: R;\n};\n\ntype K8sCreateResource = <R extends K8sResourceCommon>(options: OptionsCreate<R>) => Promise<R>;\n\n/**\n * It creates a resource in the cluster, based on the provided options.\n * @param options Which are passed as key-value pairs in the map\n * @param options.model - Kubernetes model\n * @param options.data - payload for the resource to be created\n * @param options.path - Appends as subpath if provided\n * @param options.queryParams - The query parameters to be included in the URL.\n * @returns A promise that resolves to the response of the resource created.\n * In case of failure, the promise gets rejected with HTTP error response.\n */\nexport const k8sCreateResource: K8sCreateResource = adapterFunc(k8sCreate, [\n 'model',\n 'data',\n 'opts',\n]);\n\n/**\n * @deprecated Use {@link k8sUpdateResource} instead. Support for k8sUpdate will be removed in a future release.\n * It updates the entire resource in the cluster, based on the provided model, data, name, namespace.\n * When a client needs to replace an existing resource entirely, they can use k8sUpdate.\n * Alternatively can use k8sPatch to perform the partial update.\n * @param model Kubernetes model\n * @param data payload for the resource to be updated.\n * @param ns namespace to look into, it should not be specified for cluster-scoped resources.\n * @param name resource name to be updated.\n * @param opts The options to pass\n * @returns A promise that resolves to the response of the resource updated.\n * In case of failure promise gets rejected with HTTP error response.\n */\nexport const k8sUpdate = <R extends K8sResourceCommon>(\n model: K8sModel,\n data: R,\n ns?: string,\n name?: string,\n opts?: Options,\n): Promise<R> =>\n coFetchJSON.put(\n resourceURL(model, {\n ns: ns || data.metadata?.namespace,\n name: name || data.metadata?.name,\n ...opts,\n }),\n data,\n null,\n null,\n );\n\ntype OptionsUpdate<R> = BaseOptions & {\n model: K8sModel;\n data: R;\n};\n\ntype K8sUpdateResource = <R extends K8sResourceCommon>(options: OptionsUpdate<R>) => Promise<R>;\n/**\n * It updates the entire resource in the cluster, based on the provided options.\n * When a client needs to replace an existing resource entirely, the client can use k8sUpdate.\n * Alternatively, the client can use k8sPatch to perform the partial update.\n * @param options which are passed as key-value pair in the map\n * @param options.model - Kubernetes model\n * @param options.data - payload for the Kubernetes resource to be updated\n * @param options.ns - namespace to look into, it should not be specified for cluster-scoped resources.\n * @param options.name - resource name to be updated.\n * @param options.path - appends as subpath if provided.\n * @param options.queryParams - The query parameters to be included in the URL.\n * @returns A promise that resolves to the response of the resource updated.\n * In case of failure promise gets rejected with HTTP error response.\n */\nexport const k8sUpdateResource: K8sUpdateResource = adapterFunc(k8sUpdate, [\n 'model',\n 'data',\n 'ns',\n 'name',\n 'opts',\n]);\n\n/**\n * @deprecated Use {@link k8sPatchResource} instead. Support for k8sPatch will be removed in a future release.\n * It patches any resource in the cluster, based on provided model, resource, data.\n * When a client needs to perform the partial update, they can use k8sPatch.\n * Alternatively can use k8sUpdate to replace an existing resource entirely.\n * See more https://datatracker.ietf.org/doc/html/rfc6902\n * @param model Kubernetes model\n * @param resource The resource to be patched\n * @param data Only the data to be patched on existing resource with the operation, path, and value\n * @param opts The options to pass\n * @returns A promise that resolves to the response of the resource patched.\n * In case of failure promise gets rejected with HTTP error response.\n */\nexport const k8sPatch = <R extends K8sResourceCommon>(\n model: K8sModel,\n resource: R,\n data: Patch[],\n opts: Options = {},\n) => {\n const patches = _.compact(data);\n\n if (_.isEmpty(patches)) {\n return Promise.resolve(resource);\n }\n\n return coFetchJSON.patch(\n resourceURL(\n model,\n Object.assign(\n {\n ns: resource.metadata.namespace,\n name: resource.metadata.name,\n },\n opts,\n ),\n ),\n patches,\n null,\n null,\n );\n};\n\ntype OptionsPatch<R> = BaseOptions & {\n model: K8sModel;\n resource: R;\n data: Patch[];\n};\n\ntype K8sPatchResource = <R extends K8sResourceCommon>(options: OptionsPatch<R>) => Promise<R>;\n\n/**\n * It patches any resource in the cluster, based on the provided options.\n * When a client needs to perform the partial update, the client can use k8sPatch.\n * Alternatively, the client can use k8sUpdate to replace an existing resource entirely.\n * See more https://datatracker.ietf.org/doc/html/rfc6902\n * @param options Which are passed as key-value pairs in the map.\n * @param options.model - Kubernetes model\n * @param options.resource - The resource to be patched.\n * @param options.data - Only the data to be patched on existing resource with the operation, path, and value.\n * @param options.path - Appends as subpath if provided.\n * @param options.queryParams - The query parameters to be included in the URL.\n * @returns A promise that resolves to the response of the resource patched.\n * In case of failure promise gets rejected with HTTP error response.\n */\nexport const k8sPatchResource: K8sPatchResource = adapterFunc(k8sPatch, [\n 'model',\n 'resource',\n 'data',\n 'opts',\n]);\n\n/**\n * @deprecated Use {@link k8sDeleteResource} instead. Support for k8sKill will be removed in a future release.\n * It deletes resources from the cluster, based on the provided model, resource.\n * The garbage collection works based on 'Foreground' | 'Background', can be configured with propagationPolicy property in provided model or passed in json.\n * See more https://kubernetes.io/docs/concepts/architecture/garbage-collection/\n * @param model Kubernetes model\n * @param resource The resource to be deleted.\n * @param opts The Options to pass\n * @param requestInit The fetch init object to use. This can have request headers, method, redirect, etc.\n * See more https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules_typedoc_node_modules_typescript_lib_lib_dom_d_.requestinit.html\n * @param options.json - Can control garbage collection of resource explicitly if provided else will default to model's \"propagationPolicy\".\n * @example\n * { kind: 'DeleteOptions', apiVersion: 'v1', propagationPolicy }\n * @returns A promise that resolves to the response of kind Status.\n * In case of failure promise gets rejected with HTTP error response.\n */\nexport const k8sKill = <R extends K8sResourceCommon>(\n model: K8sModel,\n resource: R,\n opts: Options = {},\n requestInit: RequestInit = {},\n json: Record<string, any> = null,\n) => {\n const { propagationPolicy } = model;\n const jsonData =\n json ?? (propagationPolicy && { kind: 'DeleteOptions', apiVersion: 'v1', propagationPolicy });\n return coFetchJSON.delete(\n resourceURL(\n model,\n Object.assign({ ns: resource.metadata.namespace, name: resource.metadata.name }, opts),\n ),\n jsonData,\n requestInit,\n null,\n );\n};\n\ntype OptionsDelete<R> = BaseOptions & {\n model: K8sModel;\n resource: R;\n requestInit?: RequestInit;\n json?: Record<string, any>;\n};\n\ntype K8sDeleteResource = <R extends K8sResourceCommon>(options: OptionsDelete<R>) => Promise<R>;\n\n/**\n * It deletes resources from the cluster, based on the provided model and resource.\n * The garbage collection works based on 'Foreground' | 'Background', can be configured with `propagationPolicy` property in provided model or passed in json.\n * @param options which are passed as key-value pair in the map.\n * @param options.model - Kubernetes model\n * @param options.resource - The resource to be deleted.\n * @param options.path - Appends as subpath if provided.\n * @param options.queryParams - The query parameters to be included in the URL.\n * @param options.requestInit - The fetch init object to use. This can have request headers, method, redirect, etc. See more https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules_typedoc_node_modules_typescript_lib_lib_dom_d_.requestinit.html\n * @param options.json - Can control garbage collection of resources explicitly if provided else will default to model's `propagationPolicy`.\n * @example\n * ```\n * { kind: 'DeleteOptions', apiVersion: 'v1', propagationPolicy }\n * ```\n * @returns A promise that resolves to the response of kind Status.\n * In case of failure promise gets rejected with HTTP error response.\n * */\nexport const k8sDeleteResource: K8sDeleteResource = adapterFunc(k8sKill, [\n 'model',\n 'resource',\n 'opts',\n 'requestInit',\n 'json',\n]);\n\n/**\n * @deprecated Use {@link k8sListResource} instead. Support for k8sList will be removed in a future release.\n * It lists the resources as an array in the cluster, based on the provided model, queryParams(label selector).\n * @param model Kubernetes model\n * @param queryParams The query parameters to be included in the URL and can pass label selector's as well with key \"labelSelector\".\n * @param raw If true then returns raw data i.e if the query is for Pod then resolved resources will not be in an array but a resource will be returned of kind PodList\n * and it will have a key \"item\" which will be an array of Pod kind.\n * @param requestInit The fetch init object to use. This can have request headers, method, redirect, etc.\n * See more https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules_typedoc_node_modules_typescript_lib_lib_dom_d_.requestinit.html\n * @returns A promise that resolves to the response with the resources in an array.\n * In case of failure promise gets rejected with HTTP error response.\n * */\nexport const k8sList = (\n model: K8sModel,\n queryParams: { [key: string]: any } = {},\n raw = false,\n requestInit: RequestInit = {},\n) => {\n const query = _.map(_.omit(queryParams, 'ns'), (v, k) => {\n let newVal;\n if (k === 'labelSelector') {\n newVal = selectorToString(v);\n }\n return `${encodeURIComponent(k)}=${encodeURIComponent(newVal ?? v)}`;\n }).join('&');\n\n const listURL = resourceURL(model, { ns: queryParams.ns });\n return coFetchJSON(`${listURL}?${query}`, 'GET', requestInit, null).then((result) => {\n const typedItems = result.items?.map((i) => ({\n kind: model.kind,\n apiVersion: result.apiVersion,\n ...i,\n }));\n return raw ? { ...result, items: typedItems } : typedItems;\n });\n};\n\ntype OptionsList = {\n model: K8sModel;\n queryParams: { [key: string]: any };\n requestInit?: RequestInit;\n};\n\ntype K8sListResource = <R extends K8sResourceCommon>(\n options: OptionsList,\n) => Promise<R[] | (K8sResourceCommon & { items: R[] })>;\n\n/**\n * It lists the resources as an array in the cluster, based on the provided options.\n * @param options Which are passed as key-value pairs in the map.\n * @param options.model - Kubernetes model\n * @param options.queryParams - The query parameters to be included in the URL. It can also pass label selectors by using the `labelSelector` key.\n * @param options.requestInit - The fetch init object to use. This can have request headers, method, redirect, and so forth. See more https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules_typedoc_node_modules_typescript_lib_lib_dom_d_.requestinit.html\n * @returns A promise that resolves to the response\n */\nexport const k8sListResource: K8sListResource = adapterFunc(k8sList, [\n 'model',\n 'queryParams',\n 'raw',\n 'requestInit',\n]);\n\n/**\n * Same interface as k8sListResource but returns the sub items.\n * @see K8sListResource\n */\nexport const k8sListResourceItems = <R extends K8sResourceCommon>(\n options: OptionsList,\n): Promise<R[]> =>\n k8sListResource<R>(options).then((response) => {\n if (Array.isArray(response)) {\n return response;\n }\n return response.items;\n });\n","import { RootState } from '@console/internal/redux';\n\nexport const cloudShellReducerName = 'cloudShell';\n\nexport const isCloudShellExpanded = (state: RootState): boolean =>\n !!state.plugins?.console?.[cloudShellReducerName]?.isExpanded;\n\nexport const isCloudShellActive = (state: RootState): boolean =>\n !!state.plugins?.console?.[cloudShellReducerName]?.isActive;\n\nexport const getCloudShellCommand = (state: RootState): string | null =>\n state.plugins?.console?.[cloudShellReducerName]?.command ?? null;\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport i18n from 'i18next';\nimport {\n Chart,\n ChartArea,\n ChartAxis,\n ChartThemeColor,\n ChartVoronoiContainer,\n getCustomTheme,\n ChartGroup,\n ChartAreaProps,\n} from '@patternfly/react-charts';\nimport { global_warning_color_100 as warningColor } from '@patternfly/react-tokens/dist/js/global_warning_color_100';\nimport { global_danger_color_100 as dangerColor } from '@patternfly/react-tokens/dist/js/global_danger_color_100';\nimport { processFrame, ByteDataTypes } from '@console/shared/src/graph-helper/data-utils';\nimport { timeFormatter } from '../utils/datetime';\nimport { humanizeNumber, useRefWidth, Humanize } from '../utils';\nimport { PrometheusEndpoint } from './helpers';\nimport { PrometheusGraph, PrometheusGraphLink } from './prometheus-graph';\nimport { usePrometheusPoll } from './prometheus-poll-hook';\nimport { areaTheme } from './themes';\nimport {\n DataPoint,\n CursorVoronoiContainer,\n DEFAULT_PROMETHEUS_SAMPLES,\n DEFAULT_PROMETHEUS_TIMESPAN,\n} from './';\nimport { mapLimitsRequests } from './utils';\nimport { GraphEmpty } from './graph-empty';\nimport { ChartLegendTooltip } from './tooltip';\n\nconst DEFAULT_HEIGHT = 180;\nconst DEFAULT_TICK_COUNT = 2;\n\nexport enum AreaChartStatus {\n ERROR = 'ERROR',\n WARNING = 'WARNING',\n}\n\nexport const chartStatusColors = {\n [AreaChartStatus.ERROR]: dangerColor.value,\n [AreaChartStatus.WARNING]: warningColor.value,\n};\n\n// @ts-ignore\nexport const AreaChart: React.FC<AreaChartProps> = ({\n className,\n data = [],\n formatDate = timeFormatter.format,\n height = DEFAULT_HEIGHT,\n humanize = humanizeNumber,\n loading = true,\n padding,\n query,\n tickCount = DEFAULT_TICK_COUNT,\n title,\n ariaChartLinkLabel,\n ariaChartTitle,\n xAxis = true,\n yAxis = true,\n chartStyle,\n byteDataType = '',\n showAllTooltip,\n mainDataName,\n ...rest\n}) => {\n // Note: Victory incorrectly typed ThemeBaseProps.padding as number instead of PaddingProps\n // @ts-ignore\n const theme = getCustomTheme(ChartThemeColor.blue, areaTheme);\n const [containerRef, width] = useRefWidth();\n const { processedData, unit } = React.useMemo(() => {\n const nonEmptyDataSets = data.filter((dataSet) => dataSet?.length);\n if (byteDataType) {\n return processFrame(nonEmptyDataSets, byteDataType);\n }\n return { processedData: nonEmptyDataSets, unit: '' };\n }, [byteDataType, data]);\n\n // If every data point of every data set is 0, force y-domain to [0,1]\n const allZero = React.useMemo(\n () => _.every(processedData, (dataSet) => _.every(dataSet, ({ y }) => y === 0)),\n [processedData],\n );\n\n const xTickFormat = React.useCallback((tick) => formatDate(tick), [formatDate]);\n const yTickFormat = React.useCallback((tick) => `${humanize(tick, unit, unit).string}`, [\n humanize,\n unit,\n ]);\n\n const domain = React.useMemo<AreaChartProps['domain']>(\n () => ({\n ...(allZero && { y: [0, 1] }),\n ...(rest.domain ?? {}),\n }),\n [allZero, rest.domain],\n );\n\n const getLabel = React.useCallback(\n (prop: { datum: DataPoint<Date> }, includeDate = true) => {\n const { x, y } = prop.datum;\n const value = humanize(y, unit, unit).string;\n const date = formatDate(x);\n return includeDate ? i18n.t('public~{{value}} at {{date}}', { value, date }) : value;\n },\n [humanize, unit, formatDate],\n );\n\n const multiLine = processedData?.length > 1;\n\n const container = React.useMemo(() => {\n if (multiLine) {\n const legendData = processedData.map((d) => ({\n childName: d[0].description,\n name: d[0].description,\n symbol: d[0].symbol,\n }));\n return (\n <CursorVoronoiContainer\n activateData={false}\n cursorDimension=\"x\"\n labels={(props) => getLabel(props, false)}\n mouseFollowTooltips\n labelComponent={\n <ChartLegendTooltip\n stack={showAllTooltip}\n legendData={legendData}\n getLabel={getLabel}\n formatDate={(d) => formatDate(d[0].x)}\n mainDataName={mainDataName}\n />\n }\n voronoiDimension=\"x\"\n />\n );\n }\n return <ChartVoronoiContainer voronoiDimension=\"x\" labels={getLabel} activateData={false} />;\n }, [formatDate, getLabel, mainDataName, multiLine, processedData, showAllTooltip]);\n\n return (\n <PrometheusGraph className={className} ref={containerRef} title={title}>\n <PrometheusGraphLink query={query} ariaChartLinkLabel={ariaChartLinkLabel}>\n {processedData?.length ? (\n <Chart\n ariaTitle={ariaChartTitle || title}\n containerComponent={container}\n domainPadding={{ y: 20 }}\n height={height}\n width={width}\n theme={theme}\n scale={{ x: 'time', y: 'linear' }}\n padding={padding}\n domain={domain}\n >\n {xAxis && <ChartAxis tickCount={tickCount} tickFormat={xTickFormat} />}\n {yAxis && <ChartAxis dependentAxis tickCount={tickCount} tickFormat={yTickFormat} />}\n <ChartGroup>\n {processedData.map((datum, index) => (\n <ChartArea\n key={index}\n data={datum}\n style={chartStyle && chartStyle[index]}\n name={datum[0]?.description}\n />\n ))}\n </ChartGroup>\n </Chart>\n ) : (\n <GraphEmpty height={height} loading={loading} />\n )}\n </PrometheusGraphLink>\n </PrometheusGraph>\n );\n};\n\nexport const Area: React.FC<AreaProps> = ({\n endTime = Date.now(),\n namespace,\n query,\n limitQuery,\n requestedQuery,\n samples = DEFAULT_PROMETHEUS_SAMPLES,\n timeout,\n timespan = DEFAULT_PROMETHEUS_TIMESPAN,\n ...rest\n}) => {\n const prometheusPollProps = {\n endpoint: PrometheusEndpoint.QUERY_RANGE,\n endTime,\n namespace,\n samples,\n timeout,\n timespan,\n };\n\n const [utilization, , utilizationLoading] = usePrometheusPoll({\n query,\n ...prometheusPollProps,\n });\n const [limit, , limitLoading] = usePrometheusPoll({\n query: limitQuery,\n ...prometheusPollProps,\n });\n const [requested, , requestedLoading] = usePrometheusPoll({\n query: requestedQuery,\n ...prometheusPollProps,\n });\n\n const loading = utilizationLoading && limitLoading && requestedLoading;\n const { data, chartStyle } = mapLimitsRequests(utilization, limit, requested);\n\n return (\n <AreaChart\n chartStyle={chartStyle}\n data={data}\n loading={loading}\n query={[query, limitQuery, requestedQuery]}\n mainDataName=\"usage\"\n {...rest}\n />\n );\n};\n\nexport type AreaChartProps = {\n className?: string;\n domain?: ChartAreaProps['domain'];\n formatDate?: (date: Date, showSeconds?: boolean) => string;\n humanize?: Humanize;\n height?: number;\n loading?: boolean;\n query?: string | string[];\n theme?: any; // TODO figure out the best way to import VictoryThemeDefinition\n tickCount?: number;\n title?: string;\n ariaChartLinkLabel?: string;\n ariaChartTitle?: string;\n data?: DataPoint[][];\n xAxis?: boolean;\n yAxis?: boolean;\n padding?: object;\n chartStyle?: object[];\n byteDataType?: ByteDataTypes; //Use this to process the whole data frame at once\n showAllTooltip?: boolean;\n mainDataName?: string;\n};\n\ntype AreaProps = AreaChartProps & {\n endTime?: number;\n namespace?: string;\n query: string;\n samples?: number;\n timeout?: string;\n timespan?: number;\n byteDataType?: ByteDataTypes;\n limitQuery?: string;\n requestedQuery?: string;\n};\n","/**\n * Allows to easily extend a base class to create custom applicative errors.\n *\n * example:\n * ```\n * class HttpError extends CustomError {\n * \tpublic constructor(\n * \t\tpublic code: number,\n * \t\tmessage?: string,\n * \t) {\n * \t\tsuper(message)\n * \t}\n * }\n *\n * new HttpError(404, 'Not found')\n * ```\n */\nexport class CustomError extends Error {\n name: string;\n\n constructor(message?: string) {\n super(message);\n // set error name as constructor name, make it not enumerable to keep native Error behavior\n // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new.target#new.target_in_constructors\n Object.defineProperty(this, 'name', {\n value: new.target.name,\n enumerable: false,\n configurable: true,\n });\n // Use captureStackTrace when available to remove contructor from stack trace\n // Add message to the stack trace\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = new Error(message).stack;\n }\n // fix the extended error prototype chain\n // because typescript __extends implementation can't\n // see https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ErrorWithCause extends CustomError {\n constructor(message: string, readonly cause?: unknown) {\n super(message);\n }\n}\n","import * as _ from 'lodash';\nimport { CatalogItem } from '@console/dynamic-plugin-sdk/src/extensions';\nimport { keywordCompare } from './catalog-utils';\nimport { CatalogFilter, CatalogFilterCounts, CatalogFilters } from './types';\n\nexport const filterByGroup = (\n items: CatalogItem[],\n filters: CatalogFilters,\n): Record<string, CatalogItem[]> => {\n // Filter items by each filter group\n return _.reduce(\n filters,\n (filtered, group, key) => {\n // Only apply active filters\n const activeFilters = _.filter(group, 'active');\n if (activeFilters.length) {\n const values = _.reduce(\n activeFilters,\n (filterValues, filter) => {\n filterValues.push(filter.value);\n return filterValues;\n },\n [],\n );\n\n filtered[key] = _.filter(items, (item) => {\n const filterValue = item[key] || item.attributes?.[key];\n if (Array.isArray(filterValue)) {\n return filterValue.some((f) => values.includes(f));\n }\n return values.includes(filterValue);\n });\n }\n\n return filtered;\n },\n {},\n );\n};\n\nexport const filterByAttributes = (\n items: CatalogItem[],\n filters: CatalogFilters,\n): CatalogItem[] => {\n if (_.isEmpty(filters)) {\n return items;\n }\n\n // Apply each filter property individually. Example:\n // filteredByGroup = {\n // provider: [/*array of items filtered by provider*/],\n // healthIndex: [/*array of items filtered by healthIndex*/],\n // };\n const filteredByGroup = filterByGroup(items, filters);\n\n // Intersection of individually applied filters is all filters\n // In the case no filters are active, returns items filteredByKeyword\n return [..._.values(filteredByGroup), items].reduce((a, b) => a.filter((c) => b.includes(c)));\n};\n\nexport const filterBySearchKeyword = (\n items: CatalogItem[],\n searchKeyword: string,\n): CatalogItem[] => {\n return keywordCompare(searchKeyword, items);\n};\n\nexport const filterByCategory = (\n items: CatalogItem[],\n categoryId: string,\n categorizedIds: Record<string, string[]>,\n): CatalogItem[] => {\n return categoryId !== 'all'\n ? items.filter((item) => categorizedIds[categoryId]?.includes(item.uid))\n : items;\n};\n\nexport const determineAvailableFilters = (\n initialFilters: CatalogFilters,\n items: CatalogItem[],\n filterGroups: string[],\n): CatalogFilters => {\n const filters = _.cloneDeep(initialFilters);\n\n _.each(filterGroups, (field) => {\n _.each(items, (item) => {\n const value = item[field] || item.attributes?.[field];\n if (value) {\n _.set(filters, [field, value], {\n label: value,\n value,\n active: false,\n });\n }\n });\n });\n\n return filters;\n};\n\nexport const getActiveFilters = (attributeFilters, activeFilters): CatalogFilters => {\n _.forOwn(attributeFilters, (filterValues, filterType) => {\n // removing default and localstore filters if Filters are present over URL\n _.each(_.keys(activeFilters[filterType]), (key) =>\n _.set(activeFilters, [filterType, key, 'active'], false),\n );\n _.each(filterValues, (filterValue) => {\n _.set(activeFilters, [filterType, filterValue, 'active'], true);\n });\n });\n\n return activeFilters;\n};\n\nexport const getFilterGroupCounts = (\n items: CatalogItem[],\n activeFilters: CatalogFilters,\n filterGroups: string[],\n): CatalogFilterCounts => {\n const newFilterCounts = {};\n\n if (_.isEmpty(activeFilters)) {\n return newFilterCounts;\n }\n\n _.each(filterGroups, (filterGroup) => {\n _.each(_.keys(activeFilters[filterGroup]), (key) => {\n const filterValues = [activeFilters[filterGroup]?.[key]?.value];\n\n const matchedItems = _.filter(items, (item) => {\n const filterValue = item[filterGroup] || item.attributes?.[filterGroup];\n if (Array.isArray(filterValue)) {\n return filterValue.some((f) => filterValues.includes(f));\n }\n\n return filterValues.includes(filterValue);\n });\n\n _.set(newFilterCounts, [filterGroup, key], _.size(matchedItems));\n });\n });\n\n return newFilterCounts;\n};\n\nexport const getFilterSearchParam = (groupFilter: CatalogFilter): string => {\n const activeValues = _.reduce(\n _.keys(groupFilter),\n (result, typeKey) => {\n return groupFilter[typeKey].active ? result.concat(typeKey) : result;\n },\n [],\n );\n\n return _.isEmpty(activeValues) ? '' : JSON.stringify(activeValues);\n};\n","import * as _ from 'lodash';\nimport { Alert } from '@console/dynamic-plugin-sdk';\nimport { alertMessageResources } from '@console/internal/components/monitoring/alerting';\nimport { Alerts } from '@console/internal/components/monitoring/types';\nimport {\n ReplicationControllerModel,\n ReplicaSetModel,\n StatefulSetModel,\n JobModel,\n DeploymentConfigModel,\n} from '@console/internal/models';\nimport {\n K8sResourceKind,\n K8sResourceCommon,\n LabelSelector,\n PodKind,\n CronJobKind,\n PodTemplate,\n RouteKind,\n apiVersionForModel,\n K8sKind,\n JobKind,\n} from '@console/internal/module/k8s';\nimport { getBuildNumber } from '@console/internal/module/k8s/builds';\nimport {\n DEPLOYMENT_REVISION_ANNOTATION,\n DEPLOYMENT_CONFIG_LATEST_VERSION_ANNOTATION,\n TRIGGERS_ANNOTATION,\n DEPLOYMENT_PHASE_ANNOTATION,\n CONTAINER_WAITING_STATE_ERROR_REASONS,\n DEPLOYMENT_STRATEGY,\n DEPLOYMENT_PHASE,\n AllPodStatus,\n} from '../constants';\nimport {\n BuildConfigOverviewItem,\n OverviewItemAlerts,\n PodControllerOverviewItem,\n OverviewItem,\n ExtPodKind,\n LimitsData,\n} from '../types';\nimport { doesHpaMatch } from './hpa-utils';\nimport { isKnativeServing, isIdled } from './pod-utils';\n\nexport const WORKLOAD_TYPES = [\n 'deployments',\n 'deploymentConfigs',\n 'daemonSets',\n 'statefulSets',\n 'jobs',\n 'cronJobs',\n 'pods',\n];\n\nexport const MONITORABLE_KINDS = ['Deployment', 'DeploymentConfig', 'StatefulSet', 'DaemonSet'];\n\ntype ResourceItem = {\n [key: string]: K8sResourceKind[];\n};\n\nexport type ResourceUtil = (obj: K8sResourceKind, props: any) => ResourceItem | undefined;\n\nexport const getResourcePausedAlert = (resource: K8sResourceKind): OverviewItemAlerts => {\n if (!resource?.spec?.paused) {\n return {};\n }\n return {\n [`${resource.metadata.uid}--Paused`]: {\n severity: 'info',\n message: `${resource.metadata.name} is paused.`,\n },\n };\n};\n\nexport const getBuildAlerts = (buildConfigs: BuildConfigOverviewItem[]): OverviewItemAlerts => {\n const buildAlerts = {};\n const addAlert = (build: K8sResourceKind, buildPhase: string) =>\n _.set(buildAlerts, `${build.metadata.uid}--build${buildPhase}`, {\n severity: `build${buildPhase}`,\n message: _.get(build, ['status', 'message'], buildPhase),\n });\n\n _.each(buildConfigs, (bc) => {\n let seenComplete = false;\n // Requires builds to be sorted by most recent first.\n _.each(bc.builds, (build: K8sResourceKind) => {\n const buildPhase = _.get(build, ['status', 'phase']);\n switch (buildPhase) {\n case 'Complete':\n seenComplete = true;\n break;\n case 'Failed':\n case 'Error':\n if (!seenComplete) {\n // show failure/error\n addAlert(build, buildPhase);\n }\n break;\n case 'New':\n case 'Pending':\n case 'Running':\n // show new/pending/running\n addAlert(build, buildPhase);\n break;\n default:\n break;\n }\n });\n });\n\n return buildAlerts;\n};\n\nexport const getOwnedResources = <T extends K8sResourceKind>(\n obj: K8sResourceKind,\n resources: T[],\n): T[] => {\n const uid = obj?.metadata?.uid;\n if (!uid) {\n return [];\n }\n return _.filter(resources, ({ metadata: { ownerReferences } }) => {\n return _.some(ownerReferences, {\n uid,\n controller: true,\n });\n });\n};\n\nconst sortByRevision = (\n replicators: K8sResourceKind[],\n getRevision: Function,\n descending: boolean = true,\n): K8sResourceKind[] => {\n const compare = (left, right) => {\n const leftVersion = getRevision(left);\n const rightVersion = getRevision(right);\n if (!_.isFinite(leftVersion) && !_.isFinite(rightVersion)) {\n const leftName = _.get(left, 'metadata.name', '');\n const rightName = _.get(right, 'metadata.name', '');\n if (descending) {\n return rightName.localeCompare(leftName);\n }\n return leftName.localeCompare(rightName);\n }\n\n if (!leftVersion) {\n return descending ? 1 : -1;\n }\n\n if (!rightVersion) {\n return descending ? -1 : 1;\n }\n\n if (descending) {\n return rightVersion - leftVersion;\n }\n\n return leftVersion - rightVersion;\n };\n\n return _.toArray(replicators).sort(compare);\n};\n\nconst getAnnotation = (obj: K8sResourceCommon, annotation: string): string => {\n return obj?.metadata?.annotations?.[annotation];\n};\n\nexport const getDeploymentRevision = (obj: K8sResourceCommon): number => {\n const revision = getAnnotation(obj, DEPLOYMENT_REVISION_ANNOTATION);\n return revision && parseInt(revision, 10);\n};\n\nexport const getDeploymentConfigVersion = (obj: K8sResourceCommon): number => {\n const version = getAnnotation(obj, DEPLOYMENT_CONFIG_LATEST_VERSION_ANNOTATION);\n return version && parseInt(version, 10);\n};\n\nexport const getOwnerNameByKind = (obj: K8sResourceCommon, kind: K8sKind): string => {\n return obj?.metadata?.ownerReferences?.find(\n (ref) =>\n ref.kind === kind.kind &&\n ((!kind.apiGroup && ref.apiVersion === 'v1') ||\n ref.apiVersion?.startsWith(`${kind.apiGroup}/`)),\n )?.name;\n};\n\nexport const sortReplicaSetsByRevision = (replicaSets: K8sResourceKind[]): K8sResourceKind[] => {\n return sortByRevision(replicaSets, getDeploymentRevision);\n};\n\nconst sortReplicationControllersByRevision = (\n replicationControllers: K8sResourceKind[],\n): K8sResourceKind[] => {\n return sortByRevision(replicationControllers, getDeploymentConfigVersion);\n};\n\nexport const sortBuilds = (builds: K8sResourceKind[]): K8sResourceKind[] => {\n const byCreationTime = (left, right) => {\n const leftCreationTime = new Date(_.get(left, 'metadata.creationTimestamp', Date.now()));\n const rightCreationTime = new Date(_.get(right, 'metadata.creationTimestamp', Date.now()));\n return rightCreationTime.getMilliseconds() - leftCreationTime.getMilliseconds();\n };\n\n const byBuildNumber = (left, right) => {\n const leftBuildNumber = getBuildNumber(left);\n const rightBuildNumber = getBuildNumber(right);\n if (!_.isFinite(leftBuildNumber) || !_.isFinite(rightBuildNumber)) {\n return byCreationTime(left, right);\n }\n return rightBuildNumber - leftBuildNumber;\n };\n\n return [...builds].sort(byBuildNumber);\n};\n\n// FIXME use parseJSONAnnotation helper\nconst getAnnotatedTriggers = (obj: K8sResourceKind) => {\n const triggersJSON = getAnnotation(obj, TRIGGERS_ANNOTATION) || '[]';\n try {\n return JSON.parse(triggersJSON);\n } catch (e) {\n /* eslint-disable-next-line no-console */\n console.error('Error parsing triggers annotation', e);\n return [];\n }\n};\n\nconst getDeploymentPhase = (rc: K8sResourceKind): DEPLOYMENT_PHASE =>\n _.get(rc, ['metadata', 'annotations', DEPLOYMENT_PHASE_ANNOTATION]);\n\n// Only show an alert once if multiple pods have the same error for the same owner.\nconst podAlertKey = (alert: any, pod: K8sResourceKind, containerName: string = 'all'): string => {\n const id = _.get(pod, 'metadata.ownerReferences[0].uid', pod.metadata.uid);\n return `${alert}--${id}--${containerName}`;\n};\n\nconst getPodAlerts = (pod: K8sResourceKind): OverviewItemAlerts => {\n const alerts = {};\n const statuses = [\n ..._.get(pod, 'status.initContainerStatuses', []),\n ..._.get(pod, 'status.containerStatuses', []),\n ];\n statuses.forEach((status) => {\n const { name, state } = status;\n const waitingReason = _.get(state, 'waiting.reason');\n if (CONTAINER_WAITING_STATE_ERROR_REASONS.includes(waitingReason)) {\n const key = podAlertKey(waitingReason, pod, name);\n const message = state.waiting.message || waitingReason;\n alerts[key] = { severity: 'error', message };\n }\n });\n\n _.get(pod, 'status.conditions', []).forEach((condition) => {\n const { type, status, reason, message } = condition;\n if (type === 'PodScheduled' && status === 'False' && reason === 'Unschedulable') {\n // eslint-disable-next-line\n const key = podAlertKey(reason, pod);\n alerts[key] = {\n severity: 'error',\n message: `${reason}: ${message}`,\n };\n }\n });\n\n return alerts;\n};\n\nconst combinePodAlerts = (pods: K8sResourceKind[]): OverviewItemAlerts =>\n _.reduce(\n pods,\n (acc, pod) => ({\n ...acc,\n ...getPodAlerts(pod),\n }),\n {},\n );\n\nexport const getReplicationControllerAlerts = (rc: K8sResourceKind): OverviewItemAlerts => {\n const phase = getDeploymentPhase(rc);\n const version = getDeploymentConfigVersion(rc);\n const name = getOwnerNameByKind(rc, DeploymentConfigModel);\n const label = _.isFinite(version) ? `${name} #${version}` : rc.metadata.name;\n const key = `${rc.metadata.uid}--Rollout${phase}`;\n switch (phase) {\n case 'Cancelled':\n return {\n [key]: {\n severity: 'info',\n message: `Rollout ${label} was cancelled.`,\n },\n };\n case 'Failed':\n return {\n [key]: {\n severity: 'error',\n message: `Rollout ${label} failed.`,\n },\n };\n default:\n return {};\n }\n};\n\nconst getAutoscaledPods = (rc: K8sResourceKind): ExtPodKind[] => {\n return [\n {\n ..._.pick(rc, 'metadata', 'status', 'spec'),\n status: { phase: AllPodStatus.AutoScaledTo0 },\n },\n ];\n};\n\nconst getIdledStatus = (\n rc: PodControllerOverviewItem,\n dc: K8sResourceKind,\n): PodControllerOverviewItem => {\n const { pods } = rc;\n if (pods && !pods.length && isIdled(dc)) {\n return {\n ...rc,\n // FIXME: This is not a PodKind.\n pods: [\n {\n ..._.pick(rc.obj, 'metadata', 'status', 'spec'),\n status: { phase: AllPodStatus.Idle },\n },\n ],\n };\n }\n return rc;\n};\n\nexport const getRolloutStatus = (\n dc: K8sResourceKind,\n current: PodControllerOverviewItem,\n previous: PodControllerOverviewItem,\n): boolean => {\n const strategy = dc?.spec?.strategy?.type;\n const phase = current && current.phase;\n const currentRC = current && current.obj;\n const notFailedOrCancelled =\n phase !== DEPLOYMENT_PHASE.cancelled && phase !== DEPLOYMENT_PHASE.failed;\n if (strategy === DEPLOYMENT_STRATEGY.recreate) {\n return (\n notFailedOrCancelled &&\n getDeploymentConfigVersion(currentRC) > 1 &&\n phase !== DEPLOYMENT_PHASE.complete\n );\n }\n return notFailedOrCancelled && previous && previous.pods.length > 0;\n};\n\nconst isDeploymentInProgressOrCompleted = (resource: K8sResourceKind): boolean => {\n return (\n [\n DEPLOYMENT_PHASE.new,\n DEPLOYMENT_PHASE.pending,\n DEPLOYMENT_PHASE.running,\n DEPLOYMENT_PHASE.complete,\n ].indexOf(getDeploymentPhase(resource)) > -1\n );\n};\n\nconst isReplicationControllerVisible = (resource: K8sResourceKind): boolean => {\n return !!_.get(resource, ['status', 'replicas'], isDeploymentInProgressOrCompleted(resource));\n};\n\nexport const getPodsForResource = (resource: K8sResourceKind, resources: any): PodKind[] => {\n const { pods } = resources;\n return getOwnedResources(resource, pods?.data);\n};\n\nexport const toReplicationControllerItem = (\n rc: K8sResourceKind,\n resources: any,\n): PodControllerOverviewItem => {\n const pods = getPodsForResource(rc, resources);\n const alerts = {\n ...combinePodAlerts(pods),\n ...getReplicationControllerAlerts(rc),\n };\n const phase = getDeploymentPhase(rc);\n const revision = getDeploymentConfigVersion(rc);\n const obj = {\n ...rc,\n apiVersion: apiVersionForModel(ReplicationControllerModel),\n kind: ReplicationControllerModel.kind,\n };\n return {\n alerts,\n obj,\n phase,\n pods,\n revision,\n };\n};\n\nexport const getReplicationControllersForResource = (\n resource: K8sResourceKind,\n resources: any,\n): {\n mostRecentRC: K8sResourceKind;\n visibleReplicationControllers: PodControllerOverviewItem[];\n} => {\n const { replicationControllers } = resources;\n if (!replicationControllers?.data?.length) {\n return {\n mostRecentRC: null,\n visibleReplicationControllers: [],\n };\n }\n const ownedRC = getOwnedResources(resource, replicationControllers.data);\n const sortedRCs = sortReplicationControllersByRevision(ownedRC);\n // get the most recent RCs included failed or canceled to show warnings\n const [mostRecentRC] = sortedRCs;\n // get the visible RCs except failed/canceled\n const visibleReplicationControllers = _.filter(sortedRCs, isReplicationControllerVisible);\n return {\n mostRecentRC,\n visibleReplicationControllers: visibleReplicationControllers.map((rc) =>\n getIdledStatus(toReplicationControllerItem(rc, resources), resource),\n ),\n };\n};\n\nconst toResourceItem = (\n rs: K8sResourceKind,\n model: K8sKind,\n resources: any,\n): PodControllerOverviewItem => {\n const obj = {\n ...rs,\n apiVersion: apiVersionForModel(model),\n kind: `${model.kind}`,\n };\n const isKnative = isKnativeServing(rs, 'metadata.labels');\n const podData = getPodsForResource(rs, resources);\n const pods = podData && !podData.length && isKnative ? getAutoscaledPods(rs) : podData;\n const alerts = combinePodAlerts(pods);\n return {\n alerts,\n obj,\n pods,\n revision: getDeploymentRevision(rs),\n };\n};\n\nconst getActiveStatefulSets = (ss: K8sResourceKind, resources: any): K8sResourceKind[] => {\n const { statefulSets } = resources;\n const ownedRS = _.filter(statefulSets?.data, (f) => f.metadata.name === ss?.metadata?.name);\n return _.filter(ownedRS, (rs) => _.get(rs, 'status.replicas'));\n};\n\nexport const getStatefulSetsResource = (\n ss: K8sResourceKind,\n resources: any,\n): PodControllerOverviewItem[] => {\n const activeStatefulSets = getActiveStatefulSets(ss, resources);\n return activeStatefulSets.map((pss) =>\n getIdledStatus(toResourceItem(pss, StatefulSetModel, resources), ss),\n );\n};\n\nexport const getActiveReplicaSets = (\n deployment: K8sResourceKind,\n resources: any,\n): K8sResourceKind[] => {\n const { replicaSets } = resources;\n const currentRevision = getDeploymentRevision(deployment);\n const ownedRS = getOwnedResources(deployment, replicaSets?.data);\n return _.filter(\n ownedRS,\n (rs) => _.get(rs, 'status.replicas') || getDeploymentRevision(rs) === currentRevision,\n );\n};\n\nexport const getReplicaSetsForResource = (\n deployment: K8sResourceKind,\n resources: any,\n): PodControllerOverviewItem[] => {\n const replicaSets = getActiveReplicaSets(deployment, resources);\n return sortReplicaSetsByRevision(replicaSets).map((rs) =>\n getIdledStatus(toResourceItem(rs, ReplicaSetModel, resources), deployment),\n );\n};\n\nexport const getJobsForCronJob = (cronJobUid: string, resources: any): JobKind[] => {\n if (!resources?.jobs?.data?.length) {\n return [];\n }\n return resources.jobs.data\n .filter((job) => job.metadata?.ownerReferences?.find((ref) => ref.uid === cronJobUid))\n .map((job) => ({\n ...job,\n apiVersion: apiVersionForModel(JobModel),\n kind: JobModel.kind,\n }));\n};\n\nexport const getBuildsForResource = (\n buildConfig: K8sResourceKind,\n resources: any,\n): K8sResourceKind[] => {\n const { builds } = resources;\n return getOwnedResources(buildConfig, builds.data);\n};\n\nexport const getBuildConfigsForCronJob = (\n cronJob: CronJobKind,\n resources: any,\n): BuildConfigOverviewItem[] => {\n const buildConfigs = resources?.buildConfigs?.data ?? [];\n const currentNamespace = cronJob.metadata.namespace;\n const containers = cronJob.spec?.jobTemplate?.spec?.template?.spec?.containers ?? [];\n return _.reduce(\n buildConfigs,\n (acc, buildConfig) => {\n const targetImageNamespace = buildConfig?.spec?.output?.to?.namespace ?? currentNamespace;\n const targetImageName = buildConfig?.spec?.output?.to?.name;\n if (\n currentNamespace === targetImageNamespace &&\n containers.find((container) => container.image?.endsWith(targetImageName))\n ) {\n const builds = getBuildsForResource(buildConfig, resources);\n return [\n ...acc,\n {\n ...buildConfig,\n builds: sortBuilds(builds),\n },\n ];\n }\n return acc;\n },\n [],\n );\n};\n\nexport const getBuildConfigsForResource = (\n resource: K8sResourceKind,\n resources: any,\n): BuildConfigOverviewItem[] => {\n if (resource.kind === 'CronJob') {\n return getBuildConfigsForCronJob(resource as CronJobKind, resources);\n }\n const NAME_LABEL = 'app.kubernetes.io/name';\n const buildConfigs = resources?.buildConfigs?.data;\n const currentNamespace = resource.metadata.namespace;\n const nativeTriggers = resource?.spec?.triggers;\n const annotatedTriggers = getAnnotatedTriggers(resource);\n const triggers = _.unionWith(nativeTriggers, annotatedTriggers, _.isEqual);\n const resourceNameLabel = resource.metadata?.labels?.[NAME_LABEL];\n return _.flatMap(triggers, (trigger) => {\n const triggerFrom = trigger.from || (trigger.imageChangeParams?.from ?? {});\n if (triggerFrom.kind !== 'ImageStreamTag') {\n return [];\n }\n const triggerImageNamespace = triggerFrom.namespace || currentNamespace;\n const triggerImageName = triggerFrom.name;\n return _.reduce(\n buildConfigs,\n (acc, buildConfig) => {\n const targetImageNamespace = buildConfig.spec?.output?.to?.namespace ?? currentNamespace;\n const targetImageName = buildConfig.spec?.output?.to?.name;\n if (\n triggerImageNamespace === targetImageNamespace &&\n (triggerImageName === targetImageName ||\n (!!resourceNameLabel &&\n resourceNameLabel === buildConfig.metadata?.labels?.[NAME_LABEL]))\n ) {\n const builds = getBuildsForResource(buildConfig, resources);\n return [\n ...acc,\n {\n ...buildConfig,\n builds: sortBuilds(builds),\n },\n ];\n }\n return acc;\n },\n [],\n );\n });\n};\n\nconst getPodTemplate = (resource: K8sResourceKind): PodTemplate => {\n switch (resource.kind) {\n case 'Pod':\n return resource as PodKind;\n case 'DeploymentConfig':\n // Include labels automatically added to deployment config pods since a service\n // might select them.\n return _.defaultsDeep(\n {\n metadata: {\n labels: {\n deploymentconfig: resource.metadata.name,\n },\n },\n },\n resource.spec?.template,\n );\n default:\n return resource.spec?.template;\n }\n};\n\nexport const getRoutesForServices = (services: string[], routes: RouteKind[]): RouteKind[] => {\n if (!services?.length || !routes?.length) {\n return [];\n }\n return routes.filter((route) => services.includes(route.spec?.to?.name));\n};\n\nexport const getServicesForResource = (\n resource: K8sResourceKind,\n services: K8sResourceKind[],\n): K8sResourceKind[] => {\n const template: PodTemplate = getPodTemplate(resource);\n return _.filter(services, (service: K8sResourceKind) => {\n const selector = new LabelSelector(_.get(service, 'spec.selector', {}));\n return selector.matches(template);\n });\n};\n\nexport const getWorkloadMonitoringAlerts = (\n resource: K8sResourceKind,\n monitoringAlerts: Alerts,\n): Alert[] => {\n const alerts = _.reduce(\n monitoringAlerts?.data,\n (acc, alert) => {\n const labelValues = _.map(alertMessageResources, (model, label) => alert?.labels?.[label]);\n if (_.find(labelValues, (val) => val === resource?.metadata?.name)) {\n acc.push(alert);\n }\n return acc;\n },\n [],\n );\n return alerts;\n};\n\nexport const validPod = (pod: K8sResourceKind) => {\n const owners = pod?.metadata?.ownerReferences;\n const phase = pod?.status?.phase;\n return _.isEmpty(owners) && phase !== 'Succeeded' && phase !== 'Failed';\n};\n\nconst isStandaloneJob = (job: K8sResourceKind) =>\n !_.find(job.metadata?.ownerReferences, (owner) => owner.kind === 'CronJob');\n\nexport const getStandaloneJobs = (jobs: K8sResourceKind[]) =>\n jobs.filter((job) => isStandaloneJob(job));\n\nexport const getOverviewItemForResource = (\n obj: K8sResourceKind,\n resources: any,\n utils?: ResourceUtil[],\n): OverviewItem => {\n const isMonitorable = MONITORABLE_KINDS.includes(obj.kind);\n const monitoringAlerts = isMonitorable\n ? getWorkloadMonitoringAlerts(obj, resources?.monitoringAlerts)\n : undefined;\n const hpas = resources?.hpas?.data?.filter(doesHpaMatch(obj));\n\n const overviewItems: OverviewItem = {\n obj,\n hpas,\n isMonitorable,\n monitoringAlerts,\n };\n\n if (utils) {\n return utils.reduce((acc, util) => {\n return { ...acc, ...util(obj, resources) };\n }, overviewItems);\n }\n return overviewItems;\n};\n\nexport const createOverviewItemForType = (\n type: string,\n resource: K8sResourceKind,\n resources: any,\n utils?: ResourceUtil[],\n): OverviewItem => {\n if (!WORKLOAD_TYPES.includes(type)) {\n return undefined;\n }\n switch (type) {\n case 'jobs':\n return isStandaloneJob(resource)\n ? getOverviewItemForResource(resource, resources, utils)\n : null;\n case 'pods':\n return validPod(resource)\n ? getOverviewItemForResource(resource, resources, utils)\n : undefined;\n default:\n return getOverviewItemForResource(resource, resources, utils);\n }\n};\n\nexport const getResourceLimitsData = (limitsData: LimitsData) => ({\n ...((limitsData.cpu.limit || limitsData.memory.limit) && {\n limits: {\n ...(limitsData.cpu.limit && { cpu: `${limitsData.cpu.limit}${limitsData.cpu.limitUnit}` }),\n ...(limitsData.memory.limit && {\n memory: `${limitsData.memory.limit}${limitsData.memory.limitUnit}`,\n }),\n },\n }),\n ...((limitsData.cpu.request || limitsData.memory.request) && {\n requests: {\n ...(limitsData.cpu.request && {\n cpu: `${limitsData.cpu.request}${limitsData.cpu.requestUnit}`,\n }),\n ...(limitsData.memory.request && {\n memory: `${limitsData.memory.request}${limitsData.memory.requestUnit}`,\n }),\n },\n }),\n});\n\nexport const getResourceData = (res: string) => {\n const resourcesRegEx = /^[0-9]*|[a-zA-Z]*/g;\n return res.match(resourcesRegEx);\n};\n\nexport const getLimitsDataFromResource = (resource: K8sResourceKind) => {\n const containers = resource?.spec?.template?.spec?.containers ?? [];\n\n const [cpuLimit, cpuLimitUnit] = getResourceData(containers?.[0]?.resources?.limits?.cpu ?? '');\n const [memoryLimit, memoryLimitUnit] = getResourceData(\n containers?.[0]?.resources?.limits?.memory ?? '',\n );\n const [cpuRequest, cpuRequestUnit] = getResourceData(\n containers?.[0]?.resources?.requests?.cpu ?? '',\n );\n const [memoryRequest, memoryRequestUnit] = getResourceData(\n containers?.[0]?.resources?.requests?.memory ?? '',\n );\n\n const limitsData = {\n cpu: {\n request: cpuRequest,\n requestUnit: cpuRequestUnit || '',\n defaultRequestUnit: cpuRequestUnit || '',\n limit: cpuLimit,\n limitUnit: cpuLimitUnit || '',\n defaultLimitUnit: cpuLimitUnit || '',\n },\n memory: {\n request: memoryRequest,\n requestUnit: memoryRequestUnit || 'Mi',\n defaultRequestUnit: memoryRequestUnit || 'Mi',\n limit: memoryLimit,\n limitUnit: memoryLimitUnit || 'Mi',\n defaultLimitUnit: memoryLimitUnit || 'Mi',\n },\n };\n return limitsData;\n};\n\nexport const getVerticalPodAutoscalersForResource = (\n vpas: K8sResourceKind[],\n obj: K8sResourceKind,\n) =>\n (vpas ?? []).filter((vpa) => {\n const { targetRef } = vpa.spec;\n const { namespace } = vpa.metadata;\n return (\n targetRef &&\n targetRef.apiVersion === obj?.apiVersion &&\n targetRef.kind === obj?.kind &&\n targetRef.name === obj?.metadata?.name &&\n namespace === obj?.metadata?.namespace\n );\n });\n","import { K8sState } from '../../redux-types';\n\nexport const getReduxIdPayload = (state, reduxId) => state.k8s.get(reduxId);\n\nexport const getK8sDataById = (state: K8sState, id: string) => state.getIn([id, 'data']);\n","import * as React from 'react';\nimport { Flex, Radio } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport './styles.scss';\n\nexport enum EditorType {\n Form = 'form',\n YAML = 'yaml',\n}\n\nexport const EditorToggle: React.FC<EditorToggleProps> = ({ value, onChange }) => {\n const { t } = useTranslation();\n const handleChange = (event: React.FormEvent<HTMLInputElement>) => {\n onChange(event?.currentTarget?.value as EditorType);\n };\n return (\n <div className=\"co-synced-editor__editor-toggle\">\n <Flex\n spaceItems={{ default: 'spaceItemsMd' }}\n alignItems={{ default: 'alignItemsCenter' }}\n role=\"radiogroup\"\n aria-labelledby=\"radio-group-title-editor-toggle\"\n >\n <label\n className=\"co-synced-editor__editor-toggle-label\"\n id=\"radio-group-title-editor-toggle\"\n >\n {t('console-shared~Configure via:')}\n </label>\n <Radio\n isChecked={value === EditorType.Form}\n name={EditorType.Form}\n onChange={handleChange}\n label={t('console-shared~Form view')}\n id={EditorType.Form}\n value={EditorType.Form}\n />\n <Radio\n isChecked={value === EditorType.YAML}\n name={EditorType.YAML}\n onChange={handleChange}\n label={t('console-shared~YAML view')}\n id={EditorType.YAML}\n value={EditorType.YAML}\n data-test={`${EditorType.YAML}-view-input`}\n />\n </Flex>\n </div>\n );\n};\n\ntype EditorToggleProps = {\n value: EditorType;\n onChange?: (newValue: EditorType) => void;\n};\n","import { Extension } from '../types';\n\nexport type { ResolvedExtension } from '../types';\n\n// Type for extension hook\nexport type ExtensionHook<T, R = any> = (options: R) => ExtensionHookResult<T>;\n\n// Type for extension hook result that returns [data, resolved, error]\nexport type ExtensionHookResult<T> = [T, boolean, any];\n\nexport type ExtensionK8sModel = {\n group: string;\n version: string;\n kind: string;\n};\n\nexport type ExtensionK8sGroupModel = {\n group: string;\n version?: string;\n kind?: string;\n};\n\nexport type ExtensionK8sGroupKindModel = {\n group: string;\n version?: string;\n kind: string;\n};\n\nexport type ExtensionK8sKindVersionModel = {\n group?: string;\n version: string;\n kind: string;\n};\n\nexport type K8sModel = {\n abbr: string;\n kind: string;\n label: string;\n labelKey?: string;\n labelPlural: string;\n labelPluralKey?: string;\n plural: string;\n propagationPolicy?: 'Foreground' | 'Background';\n\n id?: string;\n crd?: boolean;\n apiVersion: string;\n apiGroup?: string;\n namespaced?: boolean;\n selector?: Selector;\n labels?: { [key: string]: string };\n annotations?: { [key: string]: string };\n verbs?: K8sVerb[];\n shortNames?: string[];\n badge?: BadgeType;\n color?: string;\n\n // Legacy option for supporing plural names in URL paths when `crd: true`.\n // This should not be set for new models, but is needed to avoid breaking\n // existing links as we transition to using the API group in URL paths.\n legacyPluralURL?: boolean;\n};\n\n/**\n * @deprecated migrated to new type K8sModel, use K8sModel over K8sKind\n */\nexport type K8sKind = K8sModel;\n\nexport enum Operator {\n Exists = 'Exists',\n DoesNotExist = 'DoesNotExist',\n In = 'In',\n NotIn = 'NotIn',\n Equals = 'Equals',\n NotEqual = 'NotEqual',\n GreaterThan = 'GreaterThan',\n LessThan = 'LessThan',\n NotEquals = 'NotEquals',\n}\n\nexport type MatchExpression = {\n key: string;\n operator: Operator | string;\n values?: string[];\n};\n\nexport type MatchLabels = {\n [key: string]: string;\n};\n\nexport type Selector = {\n matchLabels?: MatchLabels;\n matchExpressions?: MatchExpression[];\n};\n\ntype K8sVerb =\n | 'create'\n | 'get'\n | 'list'\n | 'update'\n | 'patch'\n | 'delete'\n | 'deletecollection'\n | 'watch'\n | 'impersonate';\n\nenum BadgeType {\n DEV = 'Dev Preview',\n TECH = 'Tech Preview',\n}\n\nexport const enum AlertStates {\n Firing = 'firing',\n NotFiring = 'not-firing',\n Pending = 'pending',\n Silenced = 'silenced',\n}\n\nexport const enum SilenceStates {\n Active = 'active',\n Expired = 'expired',\n Pending = 'pending',\n}\n\nexport const enum AlertSeverity {\n Critical = 'critical',\n Info = 'info',\n None = 'none',\n Warning = 'warning',\n}\n\nexport const enum RuleStates {\n Firing = 'firing',\n Inactive = 'inactive',\n Pending = 'pending',\n Silenced = 'silenced',\n}\n\nexport type Silence = {\n comment: string;\n createdBy: string;\n endsAt: string;\n firingAlerts: Alert[];\n id?: string;\n matchers: { isEqual?: boolean; isRegex: boolean; name: string; value: string }[];\n name?: string;\n startsAt: string;\n status?: { state: SilenceStates };\n updatedAt?: string;\n};\n\nexport type PrometheusAlert = {\n activeAt?: string;\n annotations: PrometheusLabels;\n labels: PrometheusLabels & {\n alertname: string;\n severity?: AlertSeverity | string;\n };\n state: AlertStates;\n value?: number | string;\n};\n\nexport type Alert = PrometheusAlert & {\n rule: Rule;\n silencedBy?: Silence[];\n};\n\nexport type PrometheusRule = {\n alerts: PrometheusAlert[];\n annotations: PrometheusLabels;\n duration: number;\n labels: PrometheusLabels & {\n severity?: string;\n };\n name: string;\n query: string;\n state: RuleStates;\n type: string;\n};\n\nexport type Rule = PrometheusRule & {\n id: string;\n sourceId?: string;\n silencedBy?: Silence[];\n};\n\nexport type PrometheusLabels = { [key: string]: string };\nexport type PrometheusValue = [number, string];\n\ntype Group = {\n rules: PrometheusRule[];\n file: string;\n name: string;\n};\n\nexport type PrometheusRulesResponse = {\n data: {\n groups: Group[];\n };\n status: string;\n};\n\nexport type DiscoveryResources = {\n adminResources: string[];\n allResources: string[];\n configResources: K8sKind[];\n clusterOperatorConfigResources: K8sKind[];\n models: K8sKind[];\n namespacedSet: Set<string>;\n safeResources: string[];\n groupVersionMap: {\n [key: string]: {\n versions: string[];\n preferredVersion: string;\n };\n };\n};\n\nexport type AlwaysOnExtension<P extends {} = any> = Omit<Extension<P>, 'flags'>;\n\nnamespace ExtensionProperties {\n export interface ModelDefinition {\n /** Additional Kubernetes model definitions to register with Console. */\n models: K8sModel[];\n }\n}\n\nexport interface ModelDefinition extends AlwaysOnExtension<ExtensionProperties.ModelDefinition> {\n type: 'ModelDefinition';\n}\n\nexport enum PrometheusEndpoint {\n LABEL = 'api/v1/label',\n QUERY = 'api/v1/query',\n QUERY_RANGE = 'api/v1/query_range',\n RULES = 'api/v1/rules',\n TARGETS = 'api/v1/targets',\n}\n","export * from './useExactSearch';\n","import {\n createContext,\n useReducer,\n useState,\n Reducer,\n Dispatch,\n ReducerAction,\n useEffect,\n useCallback,\n} from 'react';\nimport { pick, union, isEqual } from 'lodash';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useSelector } from 'react-redux';\nimport { createSelector } from 'reselect';\nimport { useActivePerspective } from '@console/dynamic-plugin-sdk';\nimport { getFlagsObject } from '@console/internal/reducers/features';\nimport { RootState } from '@console/internal/redux';\nimport { useExtensions } from '@console/plugin-sdk';\nimport { isGuidedTour, GuidedTour } from '@console/plugin-sdk/src/typings/guided-tour';\nimport { useUserSettingsCompatibility } from '@console/shared/src/hooks/useUserSettingsCompatibility';\nimport { TourActions, TOUR_LOCAL_STORAGE_KEY } from './const';\nimport { TourDataType, Step } from './type';\nimport { filterTourBasedonPermissionAndFlag } from './utils';\n\ntype TourStateAction = { type: TourActions; payload?: { completed?: boolean } };\nexport const tourReducer = (state: TourState, action: TourStateAction) => {\n const { stepNumber } = state;\n switch (action.type) {\n case TourActions.initialize:\n return {\n completedTour: action.payload.completed,\n stepNumber: 0,\n startTour: !action.payload.completed,\n };\n case TourActions.start:\n return { startTour: true, completedTour: false, stepNumber: 0 };\n case TourActions.next:\n return {\n ...state,\n startTour: false,\n stepNumber: stepNumber + 1,\n };\n case TourActions.back:\n return {\n ...state,\n stepNumber: stepNumber - 1,\n };\n case TourActions.complete:\n return { ...state, completedTour: true, stepNumber: 0 };\n default:\n return state;\n }\n};\n\ntype TourReducer = Reducer<TourState, TourStateAction>;\n\ntype TourContextType = {\n tourState?: TourState;\n tourDispatch?: Dispatch<ReducerAction<TourReducer>>;\n tour?: TourDataType;\n totalSteps?: number;\n onComplete?: () => void;\n};\n\nexport type TourState = {\n stepNumber: number;\n startTour: boolean;\n completedTour: boolean;\n};\n\nexport const TourContext = createContext<TourContextType>({});\n\nexport const TourContextProvider = TourContext.Provider;\n\nconst getRequiredFlagsFromTour = (steps: Step[]) =>\n steps.reduce((allFlags, { flags }) => (flags ? union(allFlags, flags) : allFlags), []);\n\nconst getRequiredFlagsByTour = createSelector(\n (state: RootState) => getFlagsObject(state),\n (_, steps: Step[]) => getRequiredFlagsFromTour(steps),\n (flags, requiredFlags) => pick(flags, requiredFlags),\n);\n\ntype TourLocalStorageType = {\n completed: boolean;\n};\n\ntype TourLocalStorageData = {\n [key: string]: TourLocalStorageType;\n};\n\nconst TOUR_CONFIGMAP_KEY = `console.guidedTour`;\n\nexport const useTourStateForPerspective = (\n perspective: string,\n): [TourLocalStorageType, (completed: boolean) => void, boolean] => {\n const [tourLocalState, setTourLocalState, loaded] = useUserSettingsCompatibility<\n TourLocalStorageData\n >(TOUR_CONFIGMAP_KEY, TOUR_LOCAL_STORAGE_KEY, { [perspective]: { completed: false } });\n useEffect(() => {\n if (loaded && !tourLocalState.hasOwnProperty(perspective)) {\n setTourLocalState((state) => ({ ...state, [perspective]: { completed: false } }));\n }\n // only run effect when the active perspective changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [perspective, loaded]);\n return [\n tourLocalState?.[perspective],\n useCallback(\n (completed: boolean) => {\n setTourLocalState((state) => {\n return { ...state, [perspective]: { ...state[perspective], completed } };\n });\n },\n [perspective, setTourLocalState],\n ),\n loaded,\n ];\n};\n\nexport const useTourValuesForContext = (): TourContextType => {\n // declaring a method for the perspective instead of using getActivePerspective\n // because importing getActivePerspective in this file throws error\n // Uncaught ReferenceError: Cannot access 'allModels' before initialization and this hook is used in plugin extension for ContextProvider\n const [activePerspective] = useActivePerspective();\n const [perspective, setPerspective] = useState<string>(activePerspective);\n const tourExtension = useExtensions<GuidedTour>(isGuidedTour);\n const tour = tourExtension.find(({ properties }) => properties.perspective === perspective);\n const selectorSteps = tour?.properties?.tour?.steps ?? [];\n const flags = useSelector(\n (state: RootState) => getRequiredFlagsByTour(state, selectorSteps),\n isEqual,\n );\n const [tourCompletionState, setTourCompletionState, loaded] = useTourStateForPerspective(\n activePerspective,\n );\n const completed = tourCompletionState?.completed;\n const onComplete = () => {\n if (completed === false) {\n setTourCompletionState(true);\n }\n };\n const [tourState, tourDispatch] = useReducer<TourReducer>(tourReducer, {\n completedTour: completed,\n stepNumber: 0,\n startTour: !completed,\n });\n\n useEffect(() => {\n tourDispatch({ type: TourActions.initialize, payload: { completed } });\n setPerspective(activePerspective);\n // only run effect when the active perspective changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activePerspective, loaded]);\n\n if (!tour || !loaded) return { tour: null };\n const {\n properties: {\n tour: { intro, steps: unfilteredSteps, end },\n },\n } = tour;\n const steps = filterTourBasedonPermissionAndFlag(unfilteredSteps, flags);\n return {\n tourState,\n tourDispatch,\n tour: { intro, steps, end },\n totalSteps: steps.length,\n onComplete,\n };\n};\n","import { SortByDirection } from '@patternfly/react-table';\n\nimport { K8sResourceCommon } from '../../../module/k8s';\n\nconst isNumber = (value): value is number => Number.isFinite(value);\n\nexport const sortResourceByValue = <D = any, V = any>(\n sortDirection: SortByDirection,\n valueGetter: (obj: D) => V,\n) => (a: D, b: D): number => {\n const lang = navigator.languages[0] || navigator.language;\n // Use `localCompare` with `numeric: true` for a natural sort order (e.g., pv-1, pv-9, pv-10)\n const compareOpts = { numeric: true, ignorePunctuation: true };\n const aValue = valueGetter(a);\n const bValue = valueGetter(b);\n const result: number =\n isNumber(aValue) && isNumber(bValue)\n ? aValue - bValue\n : `${aValue}`.localeCompare(`${bValue}`, lang, compareOpts);\n if (result !== 0) {\n return sortDirection === SortByDirection.asc ? result : result * -1;\n }\n\n // Use name as a secondary sort for a stable sort.\n const aName = (a as K8sResourceCommon)?.metadata?.name || '';\n const bName = (b as K8sResourceCommon)?.metadata?.name || '';\n return aName.localeCompare(bName, lang, compareOpts);\n};\n","import * as React from 'react';\nimport { useFlag } from '@console/shared';\nimport { FLAG_DEVWORKSPACE } from '../../const';\nimport { checkTerminalAvailable } from './cloud-shell-utils';\n\nconst useCloudShellAvailable = () => {\n const [terminalAvailable, setTerminalAvailable] = React.useState(false);\n const flagEnabled = useFlag(FLAG_DEVWORKSPACE);\n React.useEffect(() => {\n let mounted = true;\n if (flagEnabled) {\n checkTerminalAvailable()\n .then(() => {\n if (mounted) {\n setTerminalAvailable(true);\n }\n })\n .catch(() => {\n if (mounted) {\n setTerminalAvailable(false);\n }\n });\n } else {\n setTerminalAvailable(false);\n }\n return () => {\n mounted = false;\n };\n }, [flagEnabled]);\n\n return flagEnabled && terminalAvailable;\n};\n\nexport default useCloudShellAvailable;\n","import { Dispatch } from 'react-redux';\nimport { action, ActionType } from 'typesafe-actions';\nimport { RootState } from '@console/internal/redux';\nimport { isCloudShellExpanded, isCloudShellActive } from '../reducers/cloud-shell-selectors';\n\nexport enum Actions {\n SetCloudShellExpanded = 'setCloudShellExpanded',\n SetCloudShellActive = 'setCloudShellActive',\n SetCloudShellCommand = 'setCloudShellCommand',\n}\n\nexport const setCloudShellCommand = (command: string | null) =>\n action(Actions.SetCloudShellCommand, { command });\n\nexport const setCloudShellExpanded = (isExpanded: boolean) =>\n action(Actions.SetCloudShellExpanded, { isExpanded });\n\nexport const toggleCloudShellExpanded = () => async (\n dispatch: Dispatch,\n getState: () => RootState,\n) => {\n const expanded = isCloudShellExpanded(getState());\n if (expanded && isCloudShellActive(getState())) {\n (\n await import(\n '@console/webterminal-plugin/src/components/cloud-shell/cloudShellConfirmationModal'\n )\n ).default(() => dispatch(setCloudShellExpanded(false)));\n } else {\n dispatch(setCloudShellExpanded(!expanded));\n }\n};\n\nexport const setCloudShellActive = (isActive: boolean) =>\n action(Actions.SetCloudShellActive, { isActive });\n\nconst actions = {\n setCloudShellExpanded,\n setCloudShellActive,\n setCloudShellCommand,\n};\n\nexport type CloudShellActions = ActionType<typeof actions>;\n","import * as React from 'react';\nimport { CatalogItem } from '@console/dynamic-plugin-sdk';\nimport { history, removeQueryArgument } from '@console/internal/components/utils';\nimport { keywordCompare } from '../../catalog';\n\nexport const quickSearch = (items: CatalogItem[], query: string) => {\n return keywordCompare(query, items);\n};\n\nexport const handleCta = async (\n e: React.SyntheticEvent,\n item: CatalogItem,\n closeModal: () => void,\n fireTelemetryEvent: (event: string, properties?: {}) => void,\n callbackProps: { [key: string]: string } = {},\n) => {\n e.preventDefault();\n const { href, callback } = item.cta;\n if (callback) {\n fireTelemetryEvent('Quick Search Used', {\n id: item.uid,\n type: item.type,\n name: item.name,\n });\n closeModal();\n await callback(callbackProps);\n removeQueryArgument('catalogSearch');\n } else history.push(href);\n};\n","import { ActionContext as ActionContextType } from '@console/dynamic-plugin-sdk/src/api/internal-types';\n\nexport { ActionMenuVariant } from '@console/dynamic-plugin-sdk/src/api/internal-types';\n\nexport type ActionContext = ActionContextType;\n","import { action, ActionType as Action } from 'typesafe-actions';\nimport { UserInfo } from '../../../extensions';\nimport { AdmissionWebhookWarning } from '../../redux-types';\n\nexport enum ActionType {\n SetUser = 'setUser',\n BeginImpersonate = 'beginImpersonate',\n EndImpersonate = 'endImpersonate',\n SetActiveCluster = 'setActiveCluster',\n SetAdmissionWebhookWarning = 'setAdmissionWebhookWarning',\n RemoveAdmissionWebhookWarning = 'removeAdmissionWebhookWarning',\n}\n\nexport const setUser = (userInfo: UserInfo) => action(ActionType.SetUser, { userInfo });\nexport const beginImpersonate = (kind: string, name: string, subprotocols: string[]) =>\n action(ActionType.BeginImpersonate, { kind, name, subprotocols });\nexport const endImpersonate = () => action(ActionType.EndImpersonate);\nexport const setAdmissionWebhookWarning = (id: string, warning: AdmissionWebhookWarning) =>\n action(ActionType.SetAdmissionWebhookWarning, { id, warning });\nexport const removeAdmissionWebhookWarning = (id) =>\n action(ActionType.RemoveAdmissionWebhookWarning, { id });\nconst coreActions = {\n setUser,\n beginImpersonate,\n endImpersonate,\n setAdmissionWebhookWarning,\n removeAdmissionWebhookWarning,\n};\n\nexport type CoreAction = Action<typeof coreActions>;\n","import { Store } from 'redux';\n\nlet store: Store;\n\nconst storeHandler = {\n setStore: (storeData: Store) => {\n store = storeData;\n },\n getStore: (): Store => store,\n};\n\nexport default storeHandler;\n","import { TFunction } from 'i18next';\nimport {\n deepForOwn,\n PredicateCheck,\n ValueCallback,\n} from '@console/dynamic-plugin-sdk/src/utils/object';\nimport { Extension } from '../typings';\n\nexport const isTranslatableString = (value): value is string => {\n return (\n typeof value === 'string' && value.length > 2 && value.startsWith('%') && value.endsWith('%')\n );\n};\n\nexport const getTranslationKey = (value: string) =>\n isTranslatableString(value) ? value.substr(1, value.length - 2) : undefined;\n\nexport const translateExtensionDeep = <E extends Extension>(\n extension: E,\n translationStringPredicate: PredicateCheck<string>,\n cb: ValueCallback<string>,\n): void => {\n deepForOwn(extension.properties, translationStringPredicate, cb);\n};\n\n/**\n * Recursively updates the extension's properties, replacing all translatable string values\n * via the provided `t` function.\n */\nexport const translateExtension = <E extends Extension>(extension: E, t: TFunction): E => {\n translateExtensionDeep(extension, isTranslatableString, (value, key, obj) => {\n obj[key] = t(value);\n });\n\n return extension;\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport * as classNames from 'classnames';\n\nexport const RadioInput: React.SFC<RadioInputProps> = (props) => {\n const inputProps: React.InputHTMLAttributes<any> = _.omit(props, [\n 'title',\n 'subTitle',\n 'desc',\n 'children',\n 'inline',\n ]);\n const inputElement = (\n <>\n <label\n className={classNames({ 'radio-inline': props.inline, 'co-disabled': props.disabled })}\n >\n <input\n type=\"radio\"\n {...inputProps}\n data-test={`${props.title}-radio-input`}\n data-checked-state={props.checked}\n />\n {props.title} {props.subTitle && <span className=\"co-no-bold\">{props.subTitle}</span>}\n </label>\n {props.desc && <p className=\"co-m-radio-desc text-muted\">{props.desc}</p>}\n {props.children}\n </>\n );\n\n return props.inline ? inputElement : <div className=\"radio\">{inputElement}</div>;\n};\n\nexport const RadioGroup: React.SFC<RadioGroupProps> = ({\n currentValue,\n inline = false,\n items,\n label,\n onChange,\n id = JSON.stringify(items),\n}) => {\n const radios = items.map(({ desc, title, subTitle, value, disabled }) => (\n <RadioInput\n key={value}\n checked={value === currentValue}\n desc={desc}\n onChange={onChange}\n title={title}\n subTitle={subTitle}\n value={value}\n disabled={disabled}\n inline={inline}\n />\n ));\n return (\n <div className={classNames('co-radio-group', { 'co-radio-group--inline': inline })}>\n {label ? (\n <>\n <label className=\"form-label co-radio-group__label\" htmlFor={id}>\n {label}\n </label>\n <div className=\"co-radio-group__controls\" id={id}>\n {radios}\n </div>\n </>\n ) : (\n radios\n )}\n </div>\n );\n};\n\nexport type RadioInputProps = {\n checked: boolean;\n desc?: string | JSX.Element;\n onChange: (v: any) => void;\n subTitle?: string | JSX.Element;\n value: any;\n disabled?: boolean;\n inline?: boolean;\n} & React.InputHTMLAttributes<any>;\n\nexport type RadioGroupProps = {\n currentValue: any;\n id?: string;\n inline?: boolean;\n items: ({\n desc?: string | JSX.Element;\n title: string | JSX.Element;\n subTitle?: string | JSX.Element;\n value: any;\n disabled?: boolean;\n } & React.InputHTMLAttributes<any>)[];\n label?: string;\n onChange: React.InputHTMLAttributes<any>['onChange'];\n};\n\nRadioInput.displayName = 'RadioInput';\nRadioGroup.displayName = 'RadioGroup';\n","import * as React from 'react';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useSelector } from 'react-redux';\nimport { Tooltip } from '@patternfly/react-core';\nimport * as classNames from 'classnames';\nimport { GlobeAmericasIcon } from '@patternfly/react-icons/dist/esm/icons/globe-americas-icon';\nimport { TimestampProps } from '@console/dynamic-plugin-sdk';\n\nimport * as dateTime from './datetime';\nimport { getLastLanguage } from '@console/app/src/components/user-preferences/language/getLastLanguage';\n\nconst timestampFor = (mdate: Date, now: Date, omitSuffix: boolean, lang: string) => {\n if (!dateTime.isValid(mdate)) {\n return '-';\n }\n\n const timeDifference = now.getTime() - mdate.getTime();\n if (omitSuffix) {\n return dateTime.fromNow(mdate, undefined, { omitSuffix: true }, lang);\n }\n\n // Show a relative time if within 10.5 minutes in the past from the current time.\n if (timeDifference > dateTime.maxClockSkewMS && timeDifference < 630000) {\n return dateTime.fromNow(mdate, undefined, undefined, lang);\n }\n\n // Apr 23, 2021, 4:33 PM\n return dateTime.dateTimeFormatter(lang).format(mdate);\n};\n\nconst nowStateToProps = ({ UI }) => ({ now: UI.get('lastTick') });\n\nexport const Timestamp = (props: TimestampProps) => {\n const now = useSelector(nowStateToProps);\n\n // Workaround for Date&Time values are not showing in supported languages onchange of language selector.\n const lang = getLastLanguage();\n\n // Check for null. If props.timestamp is null, it returns incorrect date and time of Wed Dec 31 1969 19:00:00 GMT-0500 (Eastern Standard Time)\n if (!props.timestamp) {\n return <div className=\"co-timestamp\">-</div>;\n }\n\n const mdate = new Date(props.timestamp);\n\n const timestamp = timestampFor(mdate, new Date(now), props.omitSuffix, lang);\n\n if (!dateTime.isValid(mdate)) {\n return <div className=\"co-timestamp\">-</div>;\n }\n\n if (props.simple) {\n return <>{timestamp}</>;\n }\n\n return (\n <div className={classNames('co-timestamp co-icon-and-text', props.className)}>\n <GlobeAmericasIcon className=\"co-icon-and-text__icon\" />\n <Tooltip\n content={[\n <span className=\"co-nowrap\" key=\"co-timestamp\">\n {dateTime.utcDateTimeFormatter.format(mdate)}\n </span>,\n ]}\n >\n <span data-test=\"timestamp\">{timestamp}</span>\n </Tooltip>\n </div>\n );\n};\n\nTimestamp.displayName = 'Timestamp';\n","import * as React from 'react';\nimport { LaptopCodeIcon, GitAltIcon } from '@patternfly/react-icons';\nimport * as serverlessFunctionIcon from '@console/internal/imgs/logos/serverlessfx.svg';\nimport * as channelIcon from '../imgs/channel.svg';\nimport * as eventSinkIcon from '../imgs/event-sink.svg';\nimport * as eventSourceIcon from '../imgs/event-source.svg';\n\nexport const eventIconStyle: React.CSSProperties = {\n width: '1em',\n height: '1em',\n};\nexport const eventSourceIconSVG = eventSourceIcon;\n\nexport const eventSinkIconSVG = eventSinkIcon;\n\nexport const channelIconSVG = channelIcon;\n\nexport const serverlessFunctionSVG = serverlessFunctionIcon;\n\nexport const gitIconElement = <GitAltIcon />;\n\nexport const samplesIconElement = <LaptopCodeIcon />;\n\nexport const EventSinkIcon: React.FC<{ style?: React.CSSProperties }> = ({ style }) => (\n <img src={eventSinkIcon} style={style} alt=\"Event Sink logo\" />\n);\n\nexport const EventSourceIcon: React.FC<{ style?: React.CSSProperties }> = ({ style }) => (\n <img src={eventSourceIcon} style={style} alt=\"Event Source logo\" />\n);\n\nexport const ServerlessFunctionIcon: React.FC<{ style?: React.CSSProperties }> = ({ style }) => (\n <img src={serverlessFunctionIcon} style={style} alt=\"Serverless function logo\" />\n);\n","export { useK8sModel } from './useK8sModel';\nexport { useK8sModels } from './useK8sModels';\nexport { useK8sWatchResource } from './useK8sWatchResource';\nexport { useK8sWatchResources } from './useK8sWatchResources';\n","export * from './node-maintenance';\nexport * from './bare-metal-host';\n","/**\n * Unwrap the result of `Promise.allSettled` call as `[fulfilledValues, rejectedReasons, results]` tuple.\n */\nconst unwrapPromiseSettledResults = <T = any>(\n results: PromiseSettledResult<T>[],\n): [T[], any[], PromiseSettledResult<T>[]] => {\n const fulfilledValues = results\n .filter((r) => r.status === 'fulfilled')\n .map((r: PromiseFulfilledResult<T>) => r.value);\n\n const rejectedReasons = results\n .filter((r) => r.status === 'rejected')\n .map((r: PromiseRejectedResult) => r.reason);\n\n return [fulfilledValues, rejectedReasons, results];\n};\n\n/**\n * Await `Promise.allSettled(promises)` and unwrap the resulting objects.\n *\n * `Promise.allSettled` never rejects, therefore the resulting `Promise` never rejects.\n */\nexport const settleAllPromises = async <T = any>(promises: Promise<T>[]) => {\n const results = await Promise.allSettled(promises);\n return unwrapPromiseSettledResults(results);\n};\n","export * from './QueryBrowser';\nexport * from './theme';\n","import * as React from 'react';\nimport { Alert } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\n\nconst ErrorAlert: React.FC<Props> = ({ message, title }) => {\n const { t } = useTranslation();\n\n return (\n <Alert\n isInline\n className=\"co-alert co-alert--scrollable\"\n title={title || t('console-shared~An error occurred')}\n variant=\"danger\"\n >\n {message}\n </Alert>\n );\n};\n\ntype Props = {\n message: string;\n title?: string;\n};\n\nexport default ErrorAlert;\n","import * as React from 'react';\nimport { DndProvider } from 'react-dnd';\nimport HTML5Backend from 'react-dnd-html5-backend';\n\nconst withDragDropContext = <TProps extends {}>(\n Component: React.ComponentClass<TProps> | React.FC<TProps>,\n) => (props: TProps) => {\n return (\n <DndProvider backend={HTML5Backend} context={window}>\n <Component {...props} />\n </DndProvider>\n );\n};\n\nexport default withDragDropContext;\n","export const FLAG_WEB_TERMINAL = 'WEB_TERMINAL';\nexport const DEFAULT_NS_OPERATORS = 'openshift-operators';\nexport const FLAG_DEVWORKSPACE = 'DEVWORKSPACE';\nexport const FLAG_V1ALPHA2DEVWORKSPACE = 'v1alpha2DEVWORKSPACE';\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { chart_color_black_500 as black500 } from '@patternfly/react-tokens/dist/js/chart_color_black_500';\nimport { chart_color_gold_400 as gold400 } from '@patternfly/react-tokens/dist/js/chart_color_gold_400';\nimport { chart_color_orange_300 as orange300 } from '@patternfly/react-tokens/dist/js/chart_color_orange_300';\nimport { chart_color_red_100 as red100 } from '@patternfly/react-tokens/dist/js/chart_color_red_100';\nimport { chart_color_red_300 as red300 } from '@patternfly/react-tokens/dist/js/chart_color_red_300';\nimport { chart_color_red_400 as red400 } from '@patternfly/react-tokens/dist/js/chart_color_red_400';\n/* eslint-enable @typescript-eslint/naming-convention */\nimport { Map as ImmutableMap } from 'immutable';\nimport { ImageManifestVuln } from './types';\n\nexport const ContainerSecurityFlag = 'SECURITY_LABELLER';\n\nexport enum Priority {\n Defcon1 = 'Defcon1',\n Critical = 'Critical',\n High = 'High',\n Medium = 'Medium',\n Low = 'Low',\n Negligible = 'Negligible',\n Unknown = 'Unknown',\n}\n\nexport const vulnPriority = ImmutableMap<Priority, VulnPriorityDescription>()\n .set(Priority.Defcon1, {\n color: red400,\n description:\n 'Defcon1 is a Critical problem which has been manually highlighted by the Quay team. It requires immediate attention.',\n index: 0,\n level: 'error',\n score: 11,\n title: 'Defcon 1',\n value: 'Defcon1',\n })\n .set(Priority.Critical, {\n color: red300,\n description:\n 'Critical is a world-burning problem, exploitable for nearly all people in a installation of the package. Includes remote root privilege escalations, or massive data loss.',\n index: 1,\n level: 'error',\n score: 10,\n title: 'Critical',\n value: 'Critical',\n })\n .set(Priority.High, {\n color: red100,\n description:\n 'High is a real problem, exploitable for many people in a default installation. Includes serious remote denial of services, local root privilege escalations, or data loss.',\n index: 2,\n level: 'warning',\n score: 9,\n title: 'High',\n value: 'High',\n })\n .set(Priority.Medium, {\n color: orange300,\n description:\n 'Medium is a real security problem, and is exploitable for many people. Includes network daemon denial of service attacks, cross-site scripting, and gaining user privileges.',\n index: 3,\n level: 'warning',\n score: 6,\n title: 'Medium',\n value: 'Medium',\n })\n .set(Priority.Low, {\n color: gold400,\n description:\n 'Low is a security problem, but is hard to exploit due to environment, requires a user-assisted attack, a small install base, or does very little damage.',\n index: 4,\n level: 'warning',\n score: 3,\n title: 'Low',\n value: 'Low',\n })\n .set(Priority.Negligible, {\n color: black500,\n description:\n 'Negligible is technically a security problem, but is only theoretical in nature, requires a very special situation, has almost no install base, or does no real damage.',\n index: 5,\n level: 'info',\n score: 1,\n title: 'Negligible',\n value: 'Negligible',\n })\n .set(Priority.Unknown, {\n color: black500,\n description:\n 'Unknown is either a security problem that has not been assigned to a priority yet or a priority that our system did not recognize',\n index: 6,\n level: 'info',\n score: 0,\n title: 'Unknown',\n value: 'Unknown',\n });\n\nexport type VulnPriorityDescription = {\n color: any;\n description: string;\n index: number;\n level: 'error' | 'warning' | 'info';\n score: number;\n title: string;\n value: string;\n};\n\nexport const totalFor = (priority: Priority) => (obj: ImageManifestVuln) => {\n switch (priority) {\n case Priority.Defcon1:\n return obj.status.defcon1Count || 0;\n case Priority.Critical:\n return obj.status.criticalCount || 0;\n case Priority.High:\n return obj.status.highCount || 0;\n case Priority.Medium:\n return obj.status.mediumCount || 0;\n case Priority.Low:\n return obj.status.lowCount || 0;\n case Priority.Negligible:\n return obj.status.negligibleCount || 0;\n case Priority.Unknown:\n return obj.status.unknownCount || 0;\n default:\n return 0;\n }\n};\n\nexport const totalVulnFor = (priority: Priority) => (imageVulns): number => {\n if (!imageVulns) {\n return 0;\n }\n switch (priority) {\n case Priority.Defcon1:\n return imageVulns.filter((imageVuln) => imageVuln.severity === Priority.Defcon1).length;\n case Priority.Critical:\n return imageVulns.filter((imageVuln) => imageVuln.severity === Priority.Critical).length;\n case Priority.High:\n return imageVulns.filter((imageVuln) => imageVuln.severity === Priority.High).length;\n case Priority.Medium:\n return imageVulns.filter((imageVuln) => imageVuln.severity === Priority.Medium).length;\n case Priority.Low:\n return imageVulns.filter((imageVuln) => imageVuln.severity === Priority.Low).length;\n case Priority.Negligible:\n return imageVulns.filter((imageVuln) => imageVuln.severity === Priority.Negligible).length;\n case Priority.Unknown:\n return imageVulns.filter((imageVuln) => imageVuln.severity === Priority.Unknown).length;\n default:\n return 0;\n }\n};\n\nconst vulnPriorityByTitle = vulnPriority.mapEntries(\n ([, vulnPriorityDescription]: [Priority, VulnPriorityDescription]) => [\n vulnPriorityDescription.title,\n vulnPriorityDescription,\n ],\n) as ImmutableMap<string, VulnPriorityDescription>;\n\nexport const priorityFor = (severityTitle: string) =>\n vulnPriorityByTitle.get(severityTitle) || vulnPriority.get(Priority.Unknown);\n","export {\n makeReduxID,\n makeQuery,\n} from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/k8s-watcher';\n","import * as _ from 'lodash';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport i18next from 'i18next';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { connect, useDispatch } from 'react-redux';\nimport { Link } from 'react-router-dom-v5-compat';\nimport {\n NotificationDrawer,\n NotificationEntry,\n NotificationCategory,\n NotificationTypes,\n} from '@console/patternfly';\nimport { isNotLoadedDynamicPluginInfo } from '@console/plugin-sdk';\nimport {\n alertingErrored,\n alertingLoaded,\n alertingLoading,\n setAlertCount,\n} from '@console/internal/actions/observe';\nimport * as UIActions from '@console/internal/actions/ui';\nimport { RootState } from '@console/internal/redux';\nimport { history, resourcePath } from '@console/internal/components/utils';\n\nimport { getClusterID } from '../module/k8s/cluster-settings';\n\nimport {\n ServiceLevelNotification,\n useShowServiceLevelNotifications,\n} from '@console/internal/components/utils/service-level';\nimport {\n alertURL,\n getAlertsAndRules,\n silenceMatcherEqualitySymbol,\n} from '@console/internal/components/monitoring/utils';\nimport { NotificationAlerts } from '@console/internal/reducers/observe';\nimport { RedExclamationCircleIcon, useCanClusterUpgrade } from '@console/shared';\nimport {\n getAlertDescription,\n getAlertMessage,\n getAlertName,\n getAlertSeverity,\n getAlertTime,\n} from '@console/shared/src/components/dashboard/status-card/alert-utils';\nimport {\n EmptyState,\n EmptyStateBody,\n EmptyStateIcon,\n EmptyStateVariant,\n EmptyStateActions,\n EmptyStateHeader,\n EmptyStateFooter,\n} from '@patternfly/react-core';\nimport { useClusterVersion } from '@console/shared/src/hooks/version';\nimport { usePrevious } from '@console/shared/src/hooks/previous';\nimport {\n Alert,\n AlertAction,\n AlertSeverity,\n isAlertAction,\n useResolvedExtensions,\n ResolvedExtension,\n} from '@console/dynamic-plugin-sdk';\nimport { coFetchJSON } from '../co-fetch';\nimport { ConsolePluginModel } from '../models';\nimport {\n ClusterVersionKind,\n getNewerClusterVersionChannel,\n getSimilarClusterVersionChannels,\n getSortedAvailableUpdates,\n referenceForModel,\n splitClusterVersionChannel,\n VersionUpdate,\n} from '../module/k8s';\nimport { pluginStore } from '../plugins';\nimport { LinkifyExternal } from './utils';\nimport { PrometheusEndpoint } from './graphs/helpers';\nimport { LabelSelector } from '@console/internal/module/k8s/label-selector';\nimport { useNotificationAlerts } from '@console/shared/src/hooks/useNotificationAlerts';\nimport { useModal, PrometheusRulesResponse } from '@console/dynamic-plugin-sdk/src/lib-core';\n\nconst AlertErrorState: React.FC<AlertErrorProps> = ({ errorText }) => {\n const { t } = useTranslation();\n return (\n <EmptyState variant={EmptyStateVariant.full}>\n <EmptyStateHeader\n titleText={<>{t('public~Alerts could not be loaded')}</>}\n icon={\n <EmptyStateIcon className=\"co-status-card__alerts-icon\" icon={RedExclamationCircleIcon} />\n }\n headingLevel=\"h5\"\n />\n <EmptyStateFooter>\n {errorText && <EmptyStateBody>{errorText}</EmptyStateBody>}\n </EmptyStateFooter>\n </EmptyState>\n );\n};\n\nconst AlertEmptyState: React.FC<AlertEmptyProps> = ({ drawerToggle }) => {\n const { t } = useTranslation();\n return (\n <EmptyState variant={EmptyStateVariant.full} className=\"co-status-card__alerts-msg\">\n <EmptyStateHeader titleText={<>{t('public~No critical alerts')}</>} headingLevel=\"h5\" />\n <EmptyStateBody>\n {t(\n 'public~There are currently no critical alerts firing. There may be firing alerts of other severities or silenced critical alerts however.',\n )}\n </EmptyStateBody>\n <EmptyStateFooter>\n <EmptyStateActions>\n <Link to=\"/monitoring/alerts\" onClick={drawerToggle}>\n {t('public~View all alerts')}\n </Link>\n </EmptyStateActions>\n </EmptyStateFooter>\n </EmptyState>\n );\n};\n\n// FIXME (jon): AlertmanagerReceiversNotConfigured action should be defined as an extension in the\n// console-app package. Also, rather than build a map on every call of this function, we might want\n// to hook this into redux.\nexport const getAlertActions = (actionsExtensions: ResolvedExtension<AlertAction>[]) => {\n const alertActions = new Map<\n string,\n Omit<ResolvedExtension<AlertAction>['properties'], 'alert'>\n >().set('AlertmanagerReceiversNotConfigured', {\n text: i18next.t('public~Configure'),\n action: () => history.push('/monitoring/alertmanagerconfig'),\n });\n actionsExtensions.forEach(({ properties }) =>\n alertActions.set(properties.alert, {\n text: properties.text,\n action: properties.action,\n }),\n );\n return alertActions;\n};\n\nconst getUpdateNotificationEntries = (\n canUpgrade: boolean,\n cv: ClusterVersionKind,\n toggleNotificationDrawer: () => void,\n): React.ReactNode[] => {\n if (!cv || !canUpgrade) {\n return [];\n }\n const updateData: VersionUpdate[] = getSortedAvailableUpdates(cv);\n const currentChannel = cv?.spec?.channel;\n const currentPrefix = splitClusterVersionChannel(currentChannel)?.prefix;\n const similarChannels = getSimilarClusterVersionChannels(cv, currentPrefix);\n const newerChannel = getNewerClusterVersionChannel(similarChannels, currentChannel);\n const newerChannelVersion = splitClusterVersionChannel(newerChannel)?.version;\n const entries = [];\n\n const dynamicPluginInfo = pluginStore.getDynamicPluginInfo();\n const failedPlugins = dynamicPluginInfo\n .filter(isNotLoadedDynamicPluginInfo)\n .filter((plugin) => plugin.status === 'Failed');\n\n if (!_.isEmpty(updateData)) {\n entries.push(\n <NotificationEntry\n actionPath=\"/settings/cluster?showVersions\"\n actionText={i18next.t('public~Update cluster')}\n key=\"cluster-update\"\n description={updateData[0].version || i18next.t('public~Unknown')}\n type={NotificationTypes.update}\n title={i18next.t('public~Cluster update available')}\n toggleNotificationDrawer={toggleNotificationDrawer}\n targetPath=\"/settings/cluster?showVersions\"\n />,\n );\n }\n if (newerChannel) {\n entries.push(\n <NotificationEntry\n actionPath=\"/settings/cluster?showChannels\"\n actionText={i18next.t('public~Update channel')}\n key=\"channel-update\"\n description={i18next.t(\n 'public~The {{newerChannel}} channel is available. If you are interested in updating this cluster to {{newerChannelVersion}} in the future, change the update channel to {{newerChannel}} to receive recommended updates.',\n { newerChannel, newerChannelVersion },\n )}\n type={NotificationTypes.update}\n title={i18next.t('public~{{newerChannel}} channel available', {\n newerChannel,\n })}\n toggleNotificationDrawer={toggleNotificationDrawer}\n targetPath=\"/settings/cluster?showChannels\"\n />,\n );\n }\n if (failedPlugins.length > 0) {\n entries.push(\n ...failedPlugins.map((plugin) => {\n const link = resourcePath(referenceForModel(ConsolePluginModel), plugin.pluginName);\n return (\n <NotificationEntry\n actionPath={link}\n actionText={i18next.t('public~View plugin')}\n key={`${plugin.pluginName}-dynamic-plugin-fail`}\n description={i18next.t('public~Something went wrong with the {{pluginName}} plugin.', {\n pluginName: plugin.pluginName,\n })}\n type={NotificationTypes.warning}\n title={i18next.t('public~Dynamic plugin error')}\n toggleNotificationDrawer={toggleNotificationDrawer}\n targetPath={link}\n />\n );\n }),\n );\n }\n return entries;\n};\n\nconst pollerTimeouts = {};\nconst pollers = {};\n\nexport const refreshNotificationPollers = () => {\n _.each(pollerTimeouts, clearTimeout);\n _.invoke(pollers, 'silences');\n _.invoke(pollers, 'notificationAlerts');\n};\n\nexport const ConnectedNotificationDrawer_: React.FC<ConnectedNotificationDrawerProps> = ({\n isDesktop,\n toggleNotificationDrawer,\n isDrawerExpanded,\n onDrawerChange,\n children,\n}) => {\n const { t } = useTranslation();\n const dispatch = useDispatch();\n const clusterID = getClusterID(useClusterVersion());\n const showServiceLevelNotification = useShowServiceLevelNotifications(clusterID);\n\n React.useEffect(() => {\n const poll: NotificationPoll = (url, key: 'notificationAlerts' | 'silences', dataHandler) => {\n dispatch(alertingLoading(key));\n const notificationPoller = (): void => {\n coFetchJSON(url)\n .then((response) => dataHandler(response))\n .then((data) => {\n dispatch(alertingLoaded(key, data));\n pollerTimeouts[key] = setTimeout(notificationPoller, 15 * 1000);\n })\n .catch((e) => {\n dispatch(alertingErrored(key, e));\n\n // If the API returned an error, poll less frequently to avoid excessive calls. For\n // example, if the user doesn't have permission to access the API, polling will probably\n // continue to fail, but it is possible that permissions will be granted so we don't\n // stop completely.\n pollerTimeouts[key] = setTimeout(notificationPoller, 60 * 1000);\n });\n };\n pollers[key] = notificationPoller;\n notificationPoller();\n };\n\n const { alertManagerBaseURL, prometheusBaseURL } = window.SERVER_FLAGS;\n\n if (prometheusBaseURL) {\n poll(\n `${prometheusBaseURL}/${PrometheusEndpoint.RULES}`,\n 'notificationAlerts',\n (alertsResults: PrometheusRulesResponse): Alert[] =>\n alertsResults\n ? getAlertsAndRules(alertsResults.data)\n .alerts.filter(\n (a) =>\n a.state === 'firing' &&\n getAlertName(a) !== 'Watchdog' &&\n getAlertName(a) !== 'UpdateAvailable',\n )\n .sort((a, b) => +new Date(getAlertTime(b)) - +new Date(getAlertTime(a)))\n : [],\n );\n } else {\n dispatch(\n alertingErrored('notificationAlerts', new Error(t('public~prometheusBaseURL not set'))),\n );\n }\n\n if (alertManagerBaseURL) {\n poll(`${alertManagerBaseURL}/api/v2/silences`, 'silences', (silences) => {\n // Set a name field on the Silence to make things easier\n _.each(silences, (s) => {\n s.name = _.get(_.find(s.matchers, { name: 'alertname' }), 'value');\n if (!s.name) {\n // No alertname, so fall back to displaying the other matchers\n s.name = s.matchers\n .map(\n (m) => `${m.name}${silenceMatcherEqualitySymbol(m.isEqual, m.isRegex)}${m.value}`,\n )\n .join(', ');\n }\n });\n return silences;\n });\n } else {\n dispatch(alertingErrored('silences', new Error(t('public~alertManagerBaseURL not set'))));\n }\n\n return () => _.each(pollerTimeouts, clearTimeout);\n }, [dispatch, t]);\n\n const clusterVersion: ClusterVersionKind = useClusterVersion();\n const [alerts, , loadError] = useNotificationAlerts();\n const launchModal = useModal();\n const alertIds = React.useMemo(() => alerts?.map((alert) => alert.rule.name) || [], [alerts]);\n const [alertActionExtensions] = useResolvedExtensions<AlertAction>(\n React.useCallback(\n (e): e is AlertAction => isAlertAction(e) && alertIds.includes(e.properties.alert),\n [alertIds],\n ),\n );\n\n const alertActionExtensionsMap = React.useMemo(() => getAlertActions(alertActionExtensions), [\n alertActionExtensions,\n ]);\n\n const canUpgrade = useCanClusterUpgrade();\n const updateList: React.ReactNode[] = getUpdateNotificationEntries(\n canUpgrade,\n clusterVersion,\n toggleNotificationDrawer,\n );\n\n const [criticalAlerts, nonCriticalAlerts] = React.useMemo(() => {\n const criticalAlertLabelSelector = new LabelSelector({ severity: AlertSeverity.Critical });\n return alerts.reduce<AlertAccumulator>(\n ([criticalAlertAcc, nonCriticalAlertAcc], alert) => {\n return criticalAlertLabelSelector.matchesLabels(alert.labels)\n ? [[...criticalAlertAcc, alert], nonCriticalAlertAcc]\n : [criticalAlertAcc, [...nonCriticalAlertAcc, alert]];\n },\n [[], []],\n );\n }, [alerts]);\n\n const hasCriticalAlerts = criticalAlerts.length > 0;\n const hasNonCriticalAlerts = nonCriticalAlerts.length > 0;\n const [isAlertExpanded, toggleAlertExpanded] = React.useState<boolean>(hasCriticalAlerts);\n const [isNonCriticalAlertExpanded, toggleNonCriticalAlertExpanded] = React.useState<boolean>(\n true,\n );\n const [isClusterUpdateExpanded, toggleClusterUpdateExpanded] = React.useState<boolean>(true);\n const prevDrawerToggleState = usePrevious(isDrawerExpanded);\n React.useEffect(() => {\n if (hasCriticalAlerts && !prevDrawerToggleState && isDrawerExpanded) {\n toggleAlertExpanded(true);\n }\n if (hasNonCriticalAlerts && !prevDrawerToggleState && isDrawerExpanded) {\n toggleNonCriticalAlertExpanded(true);\n }\n }, [\n hasCriticalAlerts,\n hasNonCriticalAlerts,\n isAlertExpanded,\n isDrawerExpanded,\n prevDrawerToggleState,\n ]);\n React.useEffect(() => {\n onDrawerChange();\n }, [isDrawerExpanded, onDrawerChange]);\n\n // Update alert count.\n const alertCount = alerts?.length ?? 0;\n React.useEffect(() => {\n dispatch(setAlertCount(alertCount));\n }, [alertCount, dispatch]);\n\n const emptyState = loadError ? (\n <AlertErrorState errorText={loadError.toString()} />\n ) : (\n <AlertEmptyState drawerToggle={toggleNotificationDrawer} />\n );\n\n const criticalAlertCategory: React.ReactElement = (\n <NotificationCategory\n key=\"critical-alerts\"\n isExpanded={isAlertExpanded}\n label={t('public~Critical Alerts')}\n count={criticalAlerts.length}\n onExpandContents={toggleAlertExpanded}\n >\n {criticalAlerts.length > 0\n ? criticalAlerts.map((alert, i) => {\n const action = alertActionExtensionsMap.get(alert.rule.name);\n return (\n <NotificationEntry\n key={`${i}_${alert.activeAt}`}\n description={\n <LinkifyExternal>\n {getAlertDescription(alert) || getAlertMessage(alert)}\n </LinkifyExternal>\n }\n timestamp={getAlertTime(alert)}\n type={NotificationTypes[getAlertSeverity(alert)]}\n title={getAlertName(alert)}\n toggleNotificationDrawer={toggleNotificationDrawer}\n targetPath={alertURL(alert, alert.rule.id)}\n actionText={action?.text}\n alertAction={() => action?.action?.(alert, launchModal)}\n />\n );\n })\n : emptyState}\n </NotificationCategory>\n );\n const nonCriticalAlertCategory: React.ReactElement =\n nonCriticalAlerts.length > 0 ? (\n <NotificationCategory\n key=\"other-alerts\"\n isExpanded={isNonCriticalAlertExpanded}\n label={t('public~Other Alerts')}\n count={nonCriticalAlerts.length}\n onExpandContents={toggleNonCriticalAlertExpanded}\n >\n {nonCriticalAlerts.map((alert, i) => {\n const action = alertActionExtensionsMap.get(alert.rule.name);\n return (\n <NotificationEntry\n key={`${i}_${alert.activeAt}`}\n description={\n <LinkifyExternal>\n {getAlertDescription(alert) || getAlertMessage(alert)}\n </LinkifyExternal>\n }\n timestamp={getAlertTime(alert)}\n type={NotificationTypes[getAlertSeverity(alert)]}\n title={getAlertName(alert)}\n toggleNotificationDrawer={toggleNotificationDrawer}\n targetPath={alertURL(alert, alert.rule.id)}\n actionText={action?.text}\n alertAction={() => action?.action?.(alert, launchModal)}\n />\n );\n })}\n </NotificationCategory>\n ) : null;\n\n if (showServiceLevelNotification) {\n updateList.push(\n <ServiceLevelNotification\n key=\"service-level-notification\"\n clusterID={clusterID}\n toggleNotificationDrawer={toggleNotificationDrawer}\n />,\n );\n }\n const recommendationsCategory: React.ReactElement = !_.isEmpty(updateList) ? (\n <NotificationCategory\n key=\"recommendations\"\n isExpanded={isClusterUpdateExpanded}\n label={t('public~Recommendations')}\n count={updateList.length}\n onExpandContents={toggleClusterUpdateExpanded}\n >\n {updateList}\n </NotificationCategory>\n ) : null;\n\n return (\n <NotificationDrawer\n className=\"co-notification-drawer\"\n isInline={isDesktop}\n isExpanded={isDrawerExpanded}\n notificationEntries={[\n criticalAlertCategory,\n nonCriticalAlertCategory,\n recommendationsCategory,\n ]}\n onClose={toggleNotificationDrawer}\n >\n {children}\n </NotificationDrawer>\n );\n};\n\ntype NotificationPoll = (\n url: string,\n key: 'notificationAlerts' | 'silences',\n dataHandler: (data) => any,\n) => void;\n\nexport type WithNotificationsProps = {\n isDrawerExpanded: boolean;\n alerts?: NotificationAlerts;\n silences?: any;\n};\n\nexport type ConnectedNotificationDrawerProps = {\n isDesktop: boolean;\n toggleNotificationDrawer: () => any;\n isDrawerExpanded: boolean;\n onDrawerChange: () => void;\n alerts: NotificationAlerts;\n};\n\nconst notificationStateToProps = ({ UI }: RootState): WithNotificationsProps => ({\n isDrawerExpanded: !!UI.getIn(['notifications', 'isExpanded']),\n});\n\ntype AlertErrorProps = {\n errorText: string;\n};\n\ntype AlertEmptyProps = {\n drawerToggle: (event: React.MouseEvent<HTMLElement>) => void;\n};\n\ntype AlertAccumulator = [Alert[], Alert[]];\n\nconst connectToNotifications = connect((state: RootState) => notificationStateToProps(state), {\n toggleNotificationDrawer: UIActions.notificationDrawerToggleExpanded,\n});\nexport const ConnectedNotificationDrawer = connectToNotifications(ConnectedNotificationDrawer_);\n","import { useUserSettings } from '../../hooks/useUserSettings';\n\nexport enum GettingStartedShowState {\n SHOW = 'show',\n HIDE = 'hide',\n DISAPPEAR = 'disappear',\n}\n\nexport const useGettingStartedShowState = (\n key: string,\n defaultValue = GettingStartedShowState.SHOW,\n) => useUserSettings<GettingStartedShowState>(key, defaultValue, true);\n","import { createContext } from 'react';\nimport { CellMeasurerCache } from 'react-virtualized';\nimport { GroupedItems, CellItem } from './types';\n\n/**\n *\n * @param groupedItems GroupedItems\n * @param columnCount number\n * Example:\n * groupedItems = {\n * header: [item1, item2, item3, item4]\n * }\n * array of length 4 with header and number of columns 3\n * Based on the fixed width of column and number of items in the array Grid would be:\n * |header |\n * |item1 item2 item3|\n * |item4 |\n * this method returns the items array considering the above grid: [header, null, null, item1, item2, item3, item4, null null].\n * |header null null |\n * |item1 item2 item3|\n * |item4 null null |\n * which makes the rowCount: 3, columnCount: 3 and headerRows: [0]\n *\n * @returns {items, rowCount, columnCount, headerRows}\n * items: array will be used to render grid\n * rowCount: no. of rows in the grid\n * columnCount: number of column in the grid\n * headerRows: This array consists the index of rows in which header will be rendered so that height of those row can be changed.\n *\n */\nexport const getItemsAndRowCount = (\n groupedItems: GroupedItems,\n columnCount: number,\n): { items: CellItem[]; rowCount: number; columnCount: number; headerRows: number[] } =>\n Object.keys(groupedItems).reduce(\n (accumulatedValues, currentKey) => {\n // if there are no item for one of the groupings return accumulator\n if (groupedItems[currentKey].length < 1) return accumulatedValues;\n\n const {\n items: accItems,\n rowCount: accRowCount,\n columnCount: accColumnCount,\n headerRows: accHeaderRow,\n } = accumulatedValues;\n const items = [];\n const headerRows = [...accHeaderRow];\n // push header to the items at 0th column of row, and null for all other columns in the same row\n for (let i = 0; i < columnCount; i++) {\n if (i === 0) {\n items.push(currentKey);\n headerRows.push(accRowCount); // push row index to headerRows array\n } else {\n items.push(null);\n }\n }\n\n // find the number of rows for current group, say `x` using columncount say `y`\n const currentKeyItems = groupedItems[currentKey];\n const currentKeyItemCount = currentKeyItems.length;\n const rowCount = Math.ceil(currentKeyItemCount / accColumnCount);\n // total number of cells needed in the grid x * y\n const numberOfCell = accColumnCount * rowCount;\n // push grouped items in the matrix and push null for the remaining Grid cell\n for (let i = 0; i < numberOfCell; i++) {\n if (currentKeyItems[i]) {\n items.push(currentKeyItems[i]);\n } else {\n items.push(null);\n }\n }\n return {\n items: [...accItems, ...items],\n rowCount: accRowCount + rowCount + 1,\n columnCount: accColumnCount,\n headerRows,\n };\n },\n {\n items: [],\n rowCount: 0,\n columnCount,\n headerRows: [],\n },\n );\n\ntype CellMeasurementContextType = {\n cache?: CellMeasurerCache;\n cellWidth?: number;\n cellMargin?: number;\n overscanRowCount?: number;\n headerHeight?: number;\n estimatedCellHeight?: number;\n className?: string;\n};\n\nexport const CellMeasurementContext = createContext<CellMeasurementContextType>({});\n","import { K8sKind } from '@console/internal/module/k8s';\n\nexport const ImageManifestVulnModel: K8sKind = {\n kind: 'ImageManifestVuln',\n label: 'ImageManifestVuln',\n labelPlural: 'ImageManifestVuln',\n apiGroup: 'secscan.quay.redhat.com',\n apiVersion: 'v1alpha1',\n abbr: 'IMV',\n namespaced: true,\n crd: true,\n plural: 'imagemanifestvulns',\n};\n","/** URL query params that adjust scope / purpose of the page */\nexport enum QUERY_PROPERTIES {\n /** For defining a contextual application group (ie, add new workload into this application group) */\n APPLICATION = 'application',\n /** For defining a contextual source of the redirect (ie, connect a new workload from this contextual source) */\n CONTEXT_SOURCE = 'contextSource',\n CONTEXT_ACTION = 'action',\n}\n\n/** connects to action for resources */\nexport const INCONTEXT_ACTIONS_CONNECTS_TO = 'connectsTo';\n/** connector action for service binding */\nexport const INCONTEXT_ACTIONS_SERVICE_BINDING = 'serviceBinding';\n\nexport enum CONNECTOR_INCONTEXT_ACTIONS {\n /** connects to action for resources */\n connectsTo = 'connectsTo',\n}\n\nexport const SERVICE_BINDING_ENABLED = 'SERVICE_BINDING_ENABLED';\n\nexport const SAMPLE_APPLICATION_GROUP = 'sample-app';\n\nexport const PREFERRED_RESOURCE_TYPE_USER_SETTING_KEY = 'devconsole.preferredResourceType';\nexport const LAST_RESOURCE_TYPE_STORAGE_KEY = `devconsole.last.resource-type`;\nexport const LAST_BUILD_PAGE_TAB_STORAGE_KEY = `devconsole.last.build-page-tab`;\n\nexport const NAME_LABEL = 'app.kubernetes.io/name';\nexport const INSTANCE_LABEL = 'app.kubernetes.io/instance';\nexport const RUNTIME_LABEL = 'app.openshift.io/runtime';\nexport const FLAG_DEVELOPER_CATALOG = 'DEVELOPER_CATALOG';\nexport const FLAG_OPERATOR_BACKED_SERVICE_CATALOG_TYPE = 'OPERATOR_BACKED_SERVICE_CATALOG_TYPE';\nexport const FLAG_SAMPLE_CATALOG_TYPE = 'SAMPLE_CATALOG_TYPE';\nexport const OPERATOR_BACKED_SERVICE_CATALOG_TYPE_ID = 'OperatorBackedService';\nexport const SAMPLE_CATALOG_TYPE_ID = 'Sample';\nexport const ADD_TO_PROJECT = 'add-to-project';\n\nexport const FLAG_JAVA_IMAGE_STREAM_ENABLED = 'JAVA_IMAGE_STREAM_ENABLED';\nexport const IMAGESTREAM_NAMESPACE = 'openshift';\nexport const JAVA_IMAGESTREAM_NAME = 'java';\n\nexport const FLAG_OPENSHIFT_DEPLOYMENTCONFIG = 'OPENSHIFT_DEPLOYMENTCONFIG';\nexport const FLAG_OPENSHIFT_BUILDCONFIG = 'OPENSHIFT_BUILDCONFIG';\n","import * as _ from 'lodash';\nimport { ByteDataTypes } from '@console/dynamic-plugin-sdk/src/api/internal-types';\nimport { DataPoint } from '@console/internal/components/graphs';\nimport { getType } from '@console/internal/components/utils/units';\n\nexport { ByteDataTypes };\n\nconst log = (x: number, y: number) => {\n return Math.log(y) / Math.log(x);\n};\n\n// Get the larget unit seen in the dataframe within the supported range\nconst bestUnit = (dataPoints: DataPoint[][], type) => {\n const flattenDataPoints = dataPoints.reduce((acc, arr) => acc.concat(arr), []);\n\n const bestLevel = flattenDataPoints.reduce((maxUnit, point) => {\n const index = Math.floor(log(_.get(type, 'divisor', 1024), point.y));\n const unitIndex = index >= type.units.length ? type.units.length - 1 : index;\n return maxUnit < unitIndex ? unitIndex : maxUnit;\n }, -1);\n return _.get(type, ['units', bestLevel]);\n};\n\n// Array based processor\nexport const processFrame = (dataPoints: DataPoint[][], typeName: string): ProcessFrameResult => {\n const type = getType(typeName);\n let unit = null;\n if (dataPoints && dataPoints[0]) {\n // Get the appropriate unit and convert the dataset to that level\n unit = bestUnit(dataPoints, type);\n const frameLevel = type.units.indexOf(unit);\n dataPoints.forEach((arr) =>\n arr.forEach((point) => {\n point.y /= type.divisor ** frameLevel;\n }),\n );\n }\n return { processedData: dataPoints, unit };\n};\n\nexport type ProcessFrameResult = {\n processedData: DataPoint[][];\n unit: string;\n};\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport { useCallback, useState } from 'react';\nimport { UseURLPoll } from '@console/dynamic-plugin-sdk/src/api/internal-types';\nimport { usePoll } from './poll-hook';\nimport { useSafeFetch } from './safe-fetch-hook';\n\nexport const URL_POLL_DEFAULT_DELAY = 15000; // 15 seconds\n\nexport const useURLPoll: UseURLPoll = <R>(\n url: string,\n delay = URL_POLL_DEFAULT_DELAY,\n ...dependencies: any[]\n) => {\n const [error, setError] = useState();\n const [response, setResponse] = useState<R>();\n const [loading, setLoading] = useState(true);\n const safeFetch = useSafeFetch();\n const tick = useCallback(() => {\n if (url) {\n safeFetch(url)\n .then((data) => {\n setResponse(data);\n setError(null);\n })\n .catch((err) => {\n if (err.name !== 'AbortError') {\n setResponse(null);\n setError(err);\n // eslint-disable-next-line no-console\n console.error(`Error polling URL: ${err}`);\n }\n })\n .finally(() => setLoading(false));\n } else {\n setLoading(false);\n }\n }, [url]);\n\n usePoll(tick, delay, ...dependencies);\n\n return [response, error, loading];\n};\n","import * as React from 'react';\nimport { Helmet } from 'react-helmet';\nimport { Trans, useTranslation } from 'react-i18next';\nimport {\n CodeBlock,\n CodeBlockCode,\n EmptyState,\n EmptyStateBody,\n EmptyStateIcon,\n Stack,\n StackItem,\n EmptyStateHeader,\n EmptyStateActions,\n Icon,\n Title,\n} from '@patternfly/react-core';\nimport { ExclamationCircleIcon } from '@patternfly/react-icons/dist/esm/icons/exclamation-circle-icon';\nimport { global_danger_color_100 as globalDangerColor100 } from '@patternfly/react-tokens';\nimport { PageHeading } from './utils';\nimport { useLocation } from 'react-router';\n\nconst ErrorComponent: React.FC<ErrorComponentProps> = ({ title, message }) => {\n const { t } = useTranslation();\n return (\n <>\n <PageHeading title={t('public~Error')} detail />\n <div className=\"co-m-pane__body\" data-test-id=\"error-page\">\n <PageHeading title={title} centerText />\n {message && <div className=\"pf-v5-u-text-align-center\">{message}</div>}\n </div>\n </>\n );\n};\n\nexport const ErrorPage404: React.FC<ErrorPage404Props> = (props) => {\n const { t } = useTranslation();\n return (\n <div>\n <Helmet>\n <title>{t('public~Page Not Found (404)')}</title>\n </Helmet>\n <ErrorComponent title={t('public~404: Page Not Found')} message={props.message} />\n </div>\n );\n};\n\nexport type ErrorComponentProps = {\n title: string;\n message?: string;\n};\n\nexport type ErrorPage404Props = Omit<ErrorComponentProps, 'title'>;\n\nconst ErrorStateMessage = () => (\n <Trans ns=\"public\">\n If the problem persists, contact a cluster administrator,{' '}\n <a href=\"https://access.redhat.com/support\">Red Hat Support</a> or check our{' '}\n <a href=\"https://status.redhat.com\">status page</a> for known outages.\n </Trans>\n);\n\nexport const ErrorState: React.FC = () => {\n const { t } = useTranslation();\n const DangerIcon = () => (\n <Icon size=\"sm\">\n <ExclamationCircleIcon color={globalDangerColor100.value} />\n </Icon>\n );\n return (\n <EmptyState variant=\"xs\">\n <EmptyStateHeader\n titleText={<>{t('public~Something went wrong')}</>}\n icon={<EmptyStateIcon icon={DangerIcon} />}\n headingLevel=\"h6\"\n />\n <EmptyStateBody>\n <Stack>\n <StackItem>\n {t('public~There was a problem processing the request. Please try again.')}\n </StackItem>\n <StackItem>\n <ErrorStateMessage />\n </StackItem>\n </Stack>\n </EmptyStateBody>\n </EmptyState>\n );\n};\n\nconst LoginErrorMessage: React.FC = () => {\n const { t } = useTranslation();\n const location = useLocation();\n const urlSearchParams = new URLSearchParams(location.search);\n const errorType = urlSearchParams.get('error_type');\n const error = urlSearchParams.get('error');\n switch (errorType) {\n case 'oauth_error':\n return t('public~There was an error generating OAuth client from OIDC client.');\n case 'login_state_error':\n return t('public~There was an error generating login state.');\n case 'cookie_error':\n return t('public~There was an error setting login state cookie');\n case 'missing_code':\n return t('public~Auth code is missing in query param.');\n case 'missing_state':\n return t('public~There was an error parsing your state cookie');\n case 'invalid_code':\n return t('public~There was an error logging you in. Please log out and try again.');\n case 'invalid_state':\n return t('public~There was an error verifying your session. Please log out and try again.');\n case 'logout_error':\n return t('public~There was an error logging you out. Please try again.');\n default:\n return (\n <Trans>\n There was an authentication error with the system:\n <CodeBlock>\n <CodeBlockCode>{error}</CodeBlockCode>\n </CodeBlock>\n </Trans>\n );\n }\n};\n\nexport const AuthenticationErrorPage: React.FC = () => {\n const { t } = useTranslation();\n const title = t('public~Authentication error');\n return (\n <>\n <Helmet>\n <title>{title}</title>\n </Helmet>\n <EmptyState>\n <EmptyStateIcon icon={ExclamationCircleIcon} />\n <Title headingLevel=\"h1\">{title}</Title>\n <EmptyStateBody>\n <Stack>\n <StackItem>\n <LoginErrorMessage />\n </StackItem>\n <StackItem>\n <ErrorStateMessage />\n </StackItem>\n </Stack>\n </EmptyStateBody>\n <EmptyStateActions>\n <a href=\"/logout\">{t('public~Try again')}</a>\n </EmptyStateActions>\n </EmptyState>\n </>\n );\n};\n","import * as React from 'react';\nimport { debounce, DebounceSettings } from 'lodash';\nimport { useDeepCompareMemoize } from './deep-compare-memoize';\n\ninterface Cancelable {\n cancel(): void;\n flush(): void;\n}\n\nexport const useDebounceCallback = <T extends (...args: any[]) => any>(\n callback: T,\n timeout: number = 500,\n debounceParams: DebounceSettings = {\n leading: false,\n trailing: true,\n },\n): ((...args) => any) & Cancelable => {\n const memDebounceParams = useDeepCompareMemoize(debounceParams);\n const callbackRef = React.useRef<T>();\n callbackRef.current = callback;\n\n return React.useMemo(() => {\n return debounce((...args) => callbackRef.current(...args), timeout, memDebounceParams);\n }, [memDebounceParams, timeout]);\n};\n","import * as React from 'react';\nimport { Map as ImmutableMap } from 'immutable';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useSelector, useDispatch } from 'react-redux';\nimport * as k8sActions from '../../../app/k8s/actions/k8s';\nimport { getReduxIdPayload } from '../../../app/k8s/reducers/k8sSelector';\nimport { SDKStoreState } from '../../../app/redux-types';\nimport { UseK8sWatchResource } from '../../../extensions/console-types';\nimport { getIDAndDispatch, getReduxData, NoModelError } from './k8s-watcher';\nimport { useDeepCompareMemoize } from './useDeepCompareMemoize';\nimport { useK8sModel } from './useK8sModel';\nimport { useModelsLoaded } from './useModelsLoaded';\n\n/**\n * Hook that retrieves the Kubernetes resource along with their respective status for loaded and error.\n * @param initResource resources need to be watched as key-value pair, wherein key will be unique to resource and value will be options needed to watch for the respective resource.\n * @returns An array with first item as resource(s), second item as loaded status and third item as error state if any.\n * @example\n * ```ts\n * const Component: React.FC = () => {\n * const watchRes = {\n ...\n }\n * const [data, loaded, error] = useK8sWatchResource(watchRes)\n * return ...\n * }\n * ```\n */\nexport const useK8sWatchResource: UseK8sWatchResource = (initResource) => {\n const resource = useDeepCompareMemoize(initResource, true);\n const modelsLoaded = useModelsLoaded();\n\n const [k8sModel] = useK8sModel(resource?.groupVersionKind || resource?.kind);\n\n const reduxID = React.useMemo(() => getIDAndDispatch(resource, k8sModel), [k8sModel, resource]);\n\n const dispatch = useDispatch();\n\n React.useEffect(() => {\n if (reduxID) {\n dispatch(reduxID.dispatch);\n }\n return () => {\n if (reduxID) {\n dispatch(k8sActions.stopK8sWatch(reduxID.id));\n }\n };\n }, [dispatch, reduxID]);\n\n const resourceK8s = useSelector<SDKStoreState, ImmutableMap<string, any>>((state) =>\n reduxID ? getReduxIdPayload(state, reduxID.id) : null,\n );\n\n return React.useMemo(() => {\n if (!resource) {\n return [undefined, true, undefined];\n }\n if (!resourceK8s) {\n const data = resource?.isList ? [] : {};\n return modelsLoaded && !k8sModel\n ? [data, true, new NoModelError()]\n : [data, false, undefined];\n }\n\n const data = getReduxData(resourceK8s.get('data'), resource);\n const loaded = resourceK8s.get('loaded');\n const loadError = resourceK8s.get('loadError');\n return [data, loaded, loadError];\n }, [resource, resourceK8s, modelsLoaded, k8sModel]);\n};\n","export * from './bindings';\n// export * from './edit-rule';\nexport * from './role';\nexport * from './rules';\n","import { K8sModel as K8sKind } from '@console/dynamic-plugin-sdk/src/api/common-types';\n\nexport const ServiceBindingModel: K8sKind = {\n id: 'servicebinding',\n kind: 'ServiceBinding',\n plural: 'servicebindings',\n label: 'ServiceBinding',\n // t('service-binding-plugin~ServiceBinding')\n labelKey: 'service-binding-plugin~ServiceBinding',\n labelPlural: 'ServiceBindings',\n // t('service-binding-plugin~ServiceBindings')\n labelPluralKey: 'service-binding-plugin~ServiceBindings',\n abbr: 'SB',\n apiGroup: 'binding.operators.coreos.com',\n apiVersion: 'v1alpha1',\n namespaced: true,\n crd: true,\n};\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport { Button } from '@patternfly/react-core';\nimport { Link } from 'react-router-dom-v5-compat';\nimport {\n DropdownToggle as DropdownToggleDeprecated,\n Dropdown as DropdownDeprecated,\n DropdownItem as DropdownItemDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { CaretDownIcon } from '@patternfly/react-icons/dist/esm/icons/caret-down-icon';\nimport { useK8sModel } from '@console/shared/src/hooks/useK8sModel';\nimport { useActiveNamespace } from '@console/shared/src/hooks/useActiveNamespace';\nimport { ALL_NAMESPACES_KEY } from '@console/shared/src/constants/common';\nimport {\n ListPageCreateProps,\n CreateWithPermissionsProps,\n ListPageCreateLinkProps,\n ListPageCreateButtonProps,\n ListPageCreateDropdownProps,\n} from '@console/dynamic-plugin-sdk';\n\nimport { RequireCreatePermission } from '../../utils';\nimport { transformGroupVersionKindToReference } from '@console/dynamic-plugin-sdk/src/utils/k8s';\n\nconst CreateWithPermissions: React.FC<CreateWithPermissionsProps> = ({\n createAccessReview,\n children,\n}) => {\n const [k8sModel] = useK8sModel(createAccessReview?.groupVersionKind);\n return !_.isEmpty(createAccessReview) ? (\n <RequireCreatePermission model={k8sModel} namespace={createAccessReview.namespace}>\n {children}\n </RequireCreatePermission>\n ) : (\n <>{children}</>\n );\n};\n\nexport const ListPageCreateLink: React.FC<ListPageCreateLinkProps> = ({\n to,\n createAccessReview,\n children,\n}) => (\n <CreateWithPermissions createAccessReview={createAccessReview}>\n <Link className=\"co-m-primary-action\" to={to}>\n <Button variant=\"primary\" id=\"yaml-create\" data-test=\"item-create\">\n {children}\n </Button>\n </Link>\n </CreateWithPermissions>\n);\n\nexport const ListPageCreateButton: React.FC<ListPageCreateButtonProps> = ({\n createAccessReview,\n ...rest\n}) => (\n <CreateWithPermissions createAccessReview={createAccessReview}>\n <Button variant=\"primary\" id=\"yaml-create\" data-test=\"item-create\" {...rest} />\n </CreateWithPermissions>\n);\n\nexport const ListPageCreateDropdown: React.FC<ListPageCreateDropdownProps> = ({\n items,\n createAccessReview,\n children,\n onClick,\n}) => {\n const [isOpen, setOpen] = React.useState(false);\n return (\n <CreateWithPermissions createAccessReview={createAccessReview}>\n <DropdownDeprecated\n position=\"right\"\n toggle={\n <DropdownToggleDeprecated\n onToggle={(_event, isExpanded: boolean) => setOpen(isExpanded)}\n toggleIndicator={CaretDownIcon}\n toggleVariant=\"primary\"\n >\n {children}\n </DropdownToggleDeprecated>\n }\n dropdownItems={Object.keys(items).map((key) => (\n <DropdownItemDeprecated\n key={key}\n data-test={`list-page-create-dropdown-item-${key}`}\n component=\"button\"\n onClick={() => onClick(key)}\n >\n {items[key]}\n </DropdownItemDeprecated>\n ))}\n isOpen={isOpen}\n data-test=\"item-create\"\n />\n </CreateWithPermissions>\n );\n};\n\nconst ListPageCreate: React.FC<ListPageCreateProps> = ({\n createAccessReview,\n groupVersionKind,\n children,\n}) => {\n const reference = transformGroupVersionKindToReference(groupVersionKind);\n\n const [k8sModel] = useK8sModel(groupVersionKind);\n const [namespace] = useActiveNamespace();\n let to: string;\n if (k8sModel) {\n const usedNamespace = k8sModel.namespaced\n ? namespace === ALL_NAMESPACES_KEY\n ? undefined\n : namespace\n : undefined;\n to = usedNamespace\n ? `/k8s/ns/${usedNamespace || 'default'}/${k8sModel.plural}/~new`\n : `/k8s/cluster/${k8sModel.plural}/~new`;\n if (k8sModel.crd) {\n to = usedNamespace\n ? `/k8s/ns/${usedNamespace || 'default'}/${reference}/~new`\n : `/k8s/cluster/${reference}/~new`;\n }\n }\n\n return (\n !!to && (\n <ListPageCreateLink createAccessReview={createAccessReview} to={to}>\n {children}\n </ListPageCreateLink>\n )\n );\n};\n\nexport default ListPageCreate;\n","import * as React from 'react';\nimport { Icon } from '@patternfly/react-core';\nimport {\n CheckCircleIcon,\n ExclamationCircleIcon,\n ExclamationTriangleIcon,\n InfoCircleIcon,\n} from '@patternfly/react-icons';\nimport * as classNames from 'classnames';\n\nimport './icons.scss';\n\nexport type ColoredIconProps = {\n className?: string;\n title?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n};\n\n/**\n * Component for displaying a green check mark circle icon.\n * @param {string} [className] - (optional) additional class name for the component\n * @param {string} [title] - (optional) icon title\n * @param {string} [size] - (optional) icon size: ('sm', 'md', 'lg', 'xl')\n * @example\n * ```tsx\n * <GreenCheckCircleIcon title=\"Healthy\" />\n * ```\n */\nexport const GreenCheckCircleIcon: React.FC<ColoredIconProps> = ({ className, title, size }) => {\n const icon = (\n <CheckCircleIcon\n data-test=\"success-icon\"\n className={classNames('dps-icons__green-check-icon', className)}\n title={title}\n />\n );\n if (size) {\n return <Icon size={size}>{icon}</Icon>;\n }\n return icon;\n};\n\n/**\n * Component for displaying a red exclamation mark circle icon.\n * @param {string} [className] - (optional) additional class name for the component\n * @param {string} [title] - (optional) icon title\n * @param {string} [size] - (optional) icon size: ('sm', 'md', 'lg', 'xl')\n * @example\n * ```tsx\n * <RedExclamationCircleIcon title=\"Failed\" />\n * ```\n */\nexport const RedExclamationCircleIcon: React.FC<ColoredIconProps> = ({\n className,\n title,\n size,\n}) => {\n const icon = (\n <ExclamationCircleIcon\n className={classNames('dps-icons__red-exclamation-icon', className)}\n title={title}\n />\n );\n\n if (size) {\n return <Icon size={size}>{icon}</Icon>;\n }\n return icon;\n};\n\n/**\n * Component for displaying a yellow triangle exclamation icon.\n * @param {string} [className] - (optional) additional class name for the component\n * @param {string} [title] - (optional) icon title\n * @param {string} [size] - (optional) icon size: ('sm', 'md', 'lg', 'xl')\n * @example\n * ```tsx\n * <YellowExclamationTriangleIcon title=\"Warning\" />\n * ```\n */\nexport const YellowExclamationTriangleIcon: React.FC<ColoredIconProps> = ({\n className,\n title,\n size,\n}) => {\n const icon = (\n <ExclamationTriangleIcon\n className={classNames('dps-icons__yellow-exclamation-icon', className)}\n title={title}\n />\n );\n\n if (size) {\n return <Icon size={size}>{icon}</Icon>;\n }\n return icon;\n};\n\n/**\n * Component for displaying a blue info circle icon.\n * @param {string} [className] - (optional) additional class name for the component\n * @param {string} [title] - (optional) icon title\n * @param {string} [size] - (optional) icon size: ('sm', 'md', 'lg', 'xl')\n * @example\n * ```tsx\n * <BlueInfoCircleIcon title=\"Info\" />\n * ```\n */\nexport const BlueInfoCircleIcon: React.FC<ColoredIconProps> = ({ className, title, size }) => {\n const icon = (\n <InfoCircleIcon className={classNames('dps-icons__blue-info-icon', className)} title={title} />\n );\n\n if (size) {\n return <Icon size={size}>{icon}</Icon>;\n }\n return icon;\n};\n","import * as _ from 'lodash-es';\nimport { coFetch } from '../co-fetch';\nimport { stripBasePath } from '../components/utils/link';\n\nconst {\n kubeAdminLogoutURL,\n loginErrorURL,\n loginSuccessURL,\n loginURL,\n logoutRedirect,\n logoutURL,\n} = window.SERVER_FLAGS;\n\nexport const LOGIN_ERROR_PATH = loginErrorURL\n ? new URL(loginErrorURL, window.location.href).pathname\n : '';\n\nconst isLoginErrorPath = (path) => path && path === LOGIN_ERROR_PATH;\n\nconst loginState = (key) => localStorage.getItem(key);\n\nconst loginStateItem = (key) => loginState(key);\n\nconst userID = 'userID';\nconst name = 'name';\nconst email = 'email';\nconst clearLocalStorageKeys = [userID, name, email];\n\nconst setNext = (next) => {\n if (!next) {\n return;\n }\n\n try {\n // Don't redirect the user back to the error page after logging in.\n localStorage.setItem('next', isLoginErrorPath(next) ? '/' : stripBasePath(next));\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Failed to next URL in localStorage', e);\n }\n};\n\nconst clearLocalStorage = (keys) => {\n keys.forEach((key) => {\n try {\n localStorage.removeItem(key);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Failed to clear localStorage', e);\n }\n });\n};\n\nexport const authSvc = {\n userID: () => {\n const id = loginStateItem(userID);\n try {\n return id && atob(id);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('error decoding userID', id, ':', e);\n }\n return id;\n },\n name: () => loginStateItem(name),\n email: () => loginStateItem(email),\n\n logoutRedirect: (next) => {\n const redirect = next ? '' : logoutRedirect;\n if (redirect) {\n window.location.assign(redirect);\n return;\n }\n // If we're on the login error page, this means there was a problem with the last\n // authentication attempt. Show the error from the previous attempt instead of redirecting\n // login again. This is necessary because login may not be available (e.g. if the OAuth\n // provider is not configured for browser authentication) and we don't want to get stuck in\n // a loop.\n if (!isLoginErrorPath(window.location.pathname)) {\n authSvc.login();\n }\n },\n\n logout: _.once((next, isKubeAdmin = false) => {\n setNext(next);\n clearLocalStorage(clearLocalStorageKeys);\n coFetch(logoutURL, { method: 'POST' })\n // eslint-disable-next-line no-console\n .catch((e) => console.error('Error logging out', e))\n .then(() => {\n if (isKubeAdmin) {\n authSvc.logoutKubeAdmin();\n } else {\n authSvc.logoutRedirect(next);\n }\n });\n }),\n\n // The kube:admin user has a special logout flow. The OAuth server has a\n // session cookie that must be cleared by POSTing to the kube:admin logout\n // endpoint, otherwise the user will be logged in again immediately after\n // logging out.\n logoutKubeAdmin: () => {\n // We need to POST to the kube:admin logout URL. Since this is a\n // cross-origin request, use a hidden form to POST.\n const form = document.createElement('form');\n form.action = kubeAdminLogoutURL;\n form.method = 'POST';\n\n // Redirect back to the console when logout is complete by passing a\n // `then` parameter.\n const input = document.createElement('input');\n input.type = 'hidden';\n input.name = 'then';\n input.value = loginSuccessURL;\n form.appendChild(input);\n\n document.body.appendChild(form);\n form.submit();\n },\n\n login: () => {\n // Ensure that we don't redirect to the current URL in a loop\n // when using local bridge in development mode without authorization.\n if (![window.location.href, window.location.pathname].includes(loginURL)) {\n window.location = loginURL;\n }\n },\n};\n","export const FLAG_RHOAS = 'RHOAS_FLAG';\n\nexport const API_GROUP = 'rhoas.redhat.com';\nexport const API_VERSION = 'v1alpha1';\n\nexport const AccessTokenSecretName = 'rh-cloud-services-api-accesstoken';\nexport const ServiceAccountSecretName = 'rh-cloud-services-service-account';\nexport const ServicesRequestCRName = 'rh-cloud-services-request';\nexport const ServiceAccountCRName = 'rh-cloud-services-serviceaccount-request';\n\n// SVG icon representing kafka service\n// Currently placeholders\nexport const cloudServicesIcon = `data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --%3E%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 40 40' style='enable-background:new 0 0 40 40;' xml:space='preserve'%3E%3Cpath d='M32.4,12.4c-4.2,0-7.6,3.4-7.6,7.6s3.4,7.6,7.6,7.6S40,24.2,40,20C40,15.8,36.6,12.4,32.4,12.4 C32.4,12.4,32.4,12.4,32.4,12.4L32.4,12.4z M32.4,24.1c-2.3,0-4.1-1.8-4.1-4.1c0-2.3,1.8-4.1,4.1-4.1c2.3,0,4.1,1.8,4.1,4.1 c0,0,0,0,0,0l0,0C36.5,22.2,34.6,24.1,32.4,24.1z'/%3E%3Cpath d='M3.7,15.2c-2.1,0-3.7,1.7-3.7,3.7c0,2.1,1.7,3.7,3.7,3.7c2.1,0,3.7-1.7,3.7-3.7C7.5,16.9,5.8,15.2,3.7,15.2 C3.7,15.2,3.7,15.2,3.7,15.2z M3.7,20.6c-0.9,0-1.7-0.8-1.7-1.7c0-0.9,0.8-1.7,1.7-1.7c0.9,0,1.7,0.8,1.7,1.7c0,0,0,0,0,0l0,0 C5.4,19.8,4.7,20.6,3.7,20.6z'/%3E%3Cpath d='M14.2,24.3c0-2.1-1.6-3.8-3.7-3.8c-2.1,0-3.8,1.6-3.8,3.7S8.4,28,10.4,28c0,0,0,0,0,0l0,0C12.5,28,14.2,26.4,14.2,24.3z M8.8,24.3c0-0.9,0.7-1.7,1.7-1.7s1.7,0.7,1.7,1.7c0,0.9-0.7,1.7-1.6,1.7l0,0C9.6,26,8.8,25.3,8.8,24.3C8.8,24.3,8.8,24.3,8.8,24.3z '/%3E%3Cpath d='M17.1,19.8c-0.5-0.2-1-0.1-1.4,0.3c-0.1,0.1-0.2,0.3-0.3,0.4c-0.1,0.3-0.1,0.7,0,1c0.1,0.2,0.1,0.3,0.3,0.4 c0.1,0.1,0.3,0.2,0.4,0.3c0.3,0.1,0.7,0.1,1,0c0.3-0.1,0.5-0.4,0.7-0.7c0.1-0.3,0.1-0.7,0-1C17.6,20.2,17.4,20,17.1,19.8z'/%3E%3Cpath d='M5.8,14c0.2,0.1,0.3,0.1,0.5,0.1c0.2,0,0.3,0,0.5-0.1c0.1-0.1,0.3-0.1,0.4-0.3c0.5-0.5,0.5-1.3,0-1.8 c-0.1-0.1-0.3-0.2-0.4-0.3c-0.6-0.3-1.4,0-1.6,0.7c0,0,0,0,0,0c-0.2,0.5-0.1,1,0.3,1.4C5.5,13.9,5.6,13.9,5.8,14z'/%3E%3Cpath d='M3.2,24.5c-0.1,0.1-0.3,0.2-0.4,0.3c-0.5,0.5-0.5,1.3,0,1.8c0,0,0,0,0,0c0.1,0.1,0.3,0.2,0.4,0.3c0.2,0.1,0.3,0.1,0.5,0.1 c0.2,0,0.3,0,0.5-0.1c0.1-0.1,0.3-0.2,0.4-0.3C5.1,26,5,25.2,4.5,24.8C4.2,24.5,3.7,24.4,3.2,24.5L3.2,24.5z'/%3E%3Cpath d='M27.4,29.9C22.7,34,15.7,34,11,29.9c-1.1-1.1-3.6,1.4-2.5,2.5c6,5.5,15.3,5.5,21.3,0C31.1,31.1,28.6,28.6,27.4,29.9z'/%3E%3Cpath d='M11.1,10.1c4.7-4.1,11.6-4.1,16.3,0c1.1,1.1,3.6-1.4,2.5-2.5c-6-5.5-15.3-5.5-21.3,0C7.3,8.9,9.8,11.4,11.1,10.1z'/%3E%3Cpath d='M15.6,16.1c0-2.1-1.7-3.7-3.7-3.7c-2.1,0-3.7,1.7-3.7,3.7c0,2.1,1.6,3.7,3.7,3.7l0,0C13.9,19.9,15.6,18.2,15.6,16.1 C15.6,16.2,15.6,16.2,15.6,16.1z M10.2,16.1c0-0.9,0.7-1.7,1.7-1.7c0.9,0,1.7,0.7,1.7,1.7c0,0.9-0.7,1.7-1.7,1.7l0,0 C11,17.8,10.3,17.1,10.2,16.1z'/%3E%3C/svg%3E%0A`;\nexport const operatorIcon = `data:image/svg+xml,%3Csvg id='adffd9f6-a340-4cce-8211-6c0f9298b55f' data-name='Layer 1' xmlns='http://www.w3.org/2000/svg' width='38' height='38' viewBox='0 0 38 38'%3E%3Cdefs%3E%3Cstyle%3E.babc916c-e1fb-432c-82f5-f31008f864ae%7Bfill:red;%7D.bd54039f-1ff7-4ad7-a5a2-655d1144d9f5%7Bfill:%23fff;%7D%3C/style%3E%3C/defs%3E%3Cpath d='M28,1H10a9,9,0,0,0-9,9V28a9,9,0,0,0,9,9H28a9,9,0,0,0,9-9V10a9,9,0,0,0-9-9Z'/%3E%3Cpath class='babc916c-e1fb-432c-82f5-f31008f864ae' d='M27.4316,14.5173a2.65775,2.65775,0,1,1,2.65807-2.65806A2.66118,2.66118,0,0,1,27.4316,14.5173Zm0-3.70835a1.05061,1.05061,0,1,0,1.05093,1.05029A1.05121,1.05121,0,0,0,27.4316,10.809Z'/%3E%3Cpath class='babc916c-e1fb-432c-82f5-f31008f864ae' d='M23.91472,30.09466a4.88358,4.88358,0,1,1,4.88421-4.883A4.88913,4.88913,0,0,1,23.91472,30.09466Zm0-8.16a3.27644,3.27644,0,1,0,3.27707,3.27707A3.28,3.28,0,0,0,23.91472,21.93464Z'/%3E%3Cpath class='bd54039f-1ff7-4ad7-a5a2-655d1144d9f5' d='M16.97388,26.37187A.80378.80378,0,0,1,16.923,24.766c.19274-.01256.38421-.03139.57318-.05776a.803.803,0,1,1,.22851,1.58957q-.3456.05085-.69873.07282C17.0084,26.37187,16.99083,26.37187,16.97388,26.37187Z'/%3E%3Cpath class='bd54039f-1ff7-4ad7-a5a2-655d1144d9f5' d='M13.41493,25.75161a.81535.81535,0,0,1-.31766-.06529,8.63073,8.63073,0,0,1-1.18338-.62528A.804.804,0,0,1,12.774,23.7025a6.77718,6.77718,0,0,0,.95989.50726.80392.80392,0,0,1-.31892,1.54185ZM9.82209,22.61015a.804.804,0,0,1-.68869-.388,8.46313,8.46313,0,0,1-.59891-1.19782.80323.80323,0,1,1,1.48912-.60268,6.99016,6.99016,0,0,0,.48591.96931.80345.80345,0,0,1-.68743,1.21917Zm-1.08733-4.6444c-.02135,0-.04269-.00062-.06466-.00251a.8034.8034,0,0,1-.737-.86509A8.51376,8.51376,0,0,1,8.144,15.77728a.80351.80351,0,1,1,1.56194.37793,6.92215,6.92215,0,0,0-.17076,1.071A.80391.80391,0,0,1,8.73476,17.96575Zm14.895-2.50425a.803.803,0,0,1-.73577-.48089,6.88007,6.88007,0,0,0-.51354-.95612.80386.80386,0,0,1,1.35352-.86761,8.47972,8.47972,0,0,1,.63156,1.17836.80373.80373,0,0,1-.73577,1.12626ZM10.55912,13.55741a.80353.80353,0,0,1-.6121-1.324,8.61392,8.61392,0,0,1,.94231-.948.8035.8035,0,1,1,1.04841,1.21791,6.987,6.987,0,0,0-.76527.77093A.80322.80322,0,0,1,10.55912,13.55741Zm9.90213-1.66553a.80348.80348,0,0,1-.40932-.11237,6.89571,6.89571,0,0,0-.9737-.47838A.80369.80369,0,0,1,19.67086,9.807a8.59184,8.59184,0,0,1,1.20159.59013.804.804,0,0,1-.4112,1.49476Zm-5.84912-.85379A.80347.80347,0,0,1,14.4194,9.4548a8.62887,8.62887,0,0,1,1.31773-.21972.80351.80351,0,0,1,.14062,1.60086,7.07009,7.07009,0,0,0-1.07163.17829A.79241.79241,0,0,1,14.61213,11.03809Z'/%3E%3Cpath class='bd54039f-1ff7-4ad7-a5a2-655d1144d9f5' d='M24.20853,19.70976a.79414.79414,0,0,1-.11551-.00817.803.803,0,0,1-.68053-.91029q.03956-.27968.0565-.56815a.81994.81994,0,0,1,.84878-.75523.80364.80364,0,0,1,.75585.8494q-.02071.356-.07156.70375A.80311.80311,0,0,1,24.20853,19.70976Z'/%3E%3C/svg%3E%0A`;\nexport const kafkaIcon = `data:image/svg+xml,%3Csvg id='adffd9f6-a340-4cce-8211-6c0f9298b55f' data-name='Layer 1' xmlns='http://www.w3.org/2000/svg' width='38' height='38' viewBox='0 0 38 38'%3E%3Cdefs%3E%3Cstyle%3E.babc916c-e1fb-432c-82f5-f31008f864ae%7Bfill:red;%7D.bd54039f-1ff7-4ad7-a5a2-655d1144d9f5%7Bfill:%23fff;%7D%3C/style%3E%3C/defs%3E%3Cpath d='M28,1H10a9,9,0,0,0-9,9V28a9,9,0,0,0,9,9H28a9,9,0,0,0,9-9V10a9,9,0,0,0-9-9Z'/%3E%3Cpath class='babc916c-e1fb-432c-82f5-f31008f864ae' d='M27.4316,14.5173a2.65775,2.65775,0,1,1,2.65807-2.65806A2.66118,2.66118,0,0,1,27.4316,14.5173Zm0-3.70835a1.05061,1.05061,0,1,0,1.05093,1.05029A1.05121,1.05121,0,0,0,27.4316,10.809Z'/%3E%3Cpath class='babc916c-e1fb-432c-82f5-f31008f864ae' d='M23.91472,30.09466a4.88358,4.88358,0,1,1,4.88421-4.883A4.88913,4.88913,0,0,1,23.91472,30.09466Zm0-8.16a3.27644,3.27644,0,1,0,3.27707,3.27707A3.28,3.28,0,0,0,23.91472,21.93464Z'/%3E%3Cpath class='bd54039f-1ff7-4ad7-a5a2-655d1144d9f5' d='M16.97388,26.37187A.80378.80378,0,0,1,16.923,24.766c.19274-.01256.38421-.03139.57318-.05776a.803.803,0,1,1,.22851,1.58957q-.3456.05085-.69873.07282C17.0084,26.37187,16.99083,26.37187,16.97388,26.37187Z'/%3E%3Cpath class='bd54039f-1ff7-4ad7-a5a2-655d1144d9f5' d='M13.41493,25.75161a.81535.81535,0,0,1-.31766-.06529,8.63073,8.63073,0,0,1-1.18338-.62528A.804.804,0,0,1,12.774,23.7025a6.77718,6.77718,0,0,0,.95989.50726.80392.80392,0,0,1-.31892,1.54185ZM9.82209,22.61015a.804.804,0,0,1-.68869-.388,8.46313,8.46313,0,0,1-.59891-1.19782.80323.80323,0,1,1,1.48912-.60268,6.99016,6.99016,0,0,0,.48591.96931.80345.80345,0,0,1-.68743,1.21917Zm-1.08733-4.6444c-.02135,0-.04269-.00062-.06466-.00251a.8034.8034,0,0,1-.737-.86509A8.51376,8.51376,0,0,1,8.144,15.77728a.80351.80351,0,1,1,1.56194.37793,6.92215,6.92215,0,0,0-.17076,1.071A.80391.80391,0,0,1,8.73476,17.96575Zm14.895-2.50425a.803.803,0,0,1-.73577-.48089,6.88007,6.88007,0,0,0-.51354-.95612.80386.80386,0,0,1,1.35352-.86761,8.47972,8.47972,0,0,1,.63156,1.17836.80373.80373,0,0,1-.73577,1.12626ZM10.55912,13.55741a.80353.80353,0,0,1-.6121-1.324,8.61392,8.61392,0,0,1,.94231-.948.8035.8035,0,1,1,1.04841,1.21791,6.987,6.987,0,0,0-.76527.77093A.80322.80322,0,0,1,10.55912,13.55741Zm9.90213-1.66553a.80348.80348,0,0,1-.40932-.11237,6.89571,6.89571,0,0,0-.9737-.47838A.80369.80369,0,0,1,19.67086,9.807a8.59184,8.59184,0,0,1,1.20159.59013.804.804,0,0,1-.4112,1.49476Zm-5.84912-.85379A.80347.80347,0,0,1,14.4194,9.4548a8.62887,8.62887,0,0,1,1.31773-.21972.80351.80351,0,0,1,.14062,1.60086,7.07009,7.07009,0,0,0-1.07163.17829A.79241.79241,0,0,1,14.61213,11.03809Z'/%3E%3Cpath class='bd54039f-1ff7-4ad7-a5a2-655d1144d9f5' d='M24.20853,19.70976a.79414.79414,0,0,1-.11551-.00817.803.803,0,0,1-.68053-.91029q.03956-.27968.0565-.56815a.81994.81994,0,0,1,.84878-.75523.80364.80364,0,0,1,.75585.8494q-.02071.356-.07156.70375A.80311.80311,0,0,1,24.20853,19.70976Z'/%3E%3C/svg%3E%0A`;\n\nexport const APITokenLengthMinimum = 100;\n\nexport const FLAG_MANAGED_SERVICES_CATALOG_TYPE = 'MANAGED_SERVICES_CATALOG_TYPE';\nexport const MANAGED_SERVICES_CATALOG_TYPE_ID = 'managedservices';\n","import { createContext } from 'react';\n\nexport type PageTitleContextValues = {\n telemetryPrefix?: string;\n titlePrefix?: string;\n};\n\nexport const PageTitleContext = createContext<PageTitleContextValues>({});\n","import { K8sKind } from '@console/internal/module/k8s';\n\nexport const LocalVolumeDiscoveryResult: K8sKind = {\n label: 'Local Volume Discovery Result',\n labelPlural: 'Local Volume Discovery Results',\n apiVersion: 'v1alpha1',\n apiGroup: 'local.storage.openshift.io',\n plural: 'localvolumediscoveryresults',\n abbr: 'LVDR',\n namespaced: true,\n kind: 'LocalVolumeDiscoveryResult',\n id: 'localvolumediscoveryresults',\n crd: true,\n};\n\nexport const LocalVolumeSetModel: K8sKind = {\n label: 'Local Volume Set',\n labelPlural: 'Local Volume Sets',\n apiVersion: 'v1alpha1',\n apiGroup: 'local.storage.openshift.io',\n plural: 'localvolumesets',\n abbr: 'LVS',\n namespaced: true,\n kind: 'LocalVolumeSet',\n id: 'localvolumeset',\n crd: true,\n};\n\nexport const LocalVolumeModel: K8sKind = {\n label: 'Local Volume',\n labelPlural: 'Local Volumes',\n apiVersion: 'v1',\n apiGroup: 'local.storage.openshift.io',\n plural: 'localvolumes',\n abbr: 'LV',\n namespaced: true,\n kind: 'LocalVolume',\n id: 'localvolume',\n crd: true,\n};\n\nexport const LocalVolumeDiscovery: K8sKind = {\n label: 'Local Volume Discovery',\n labelPlural: 'Local Volume Discoveries',\n apiVersion: 'v1alpha1',\n apiGroup: 'local.storage.openshift.io',\n plural: 'localvolumediscoveries',\n abbr: 'LVD',\n namespaced: true,\n kind: 'LocalVolumeDiscovery',\n id: 'localvolumediscovery',\n crd: true,\n};\n","import { getActiveUserName } from '@console/internal/actions/ui';\nimport { SYSTEM_NAMESPACES_PREFIX, SYSTEM_NAMESPACES, REQUESTER_FILTER } from '@console/shared';\n\nexport const isCurrentUser = (user: string): boolean => user === getActiveUserName();\n\nexport const isSystemNamespace = (option: { title: string; key?: string }) => {\n const startsWithNamespace = SYSTEM_NAMESPACES_PREFIX.some((ns) => option.title?.startsWith(ns));\n const isNamespace = SYSTEM_NAMESPACES.includes(option.title);\n\n return startsWithNamespace || isNamespace;\n};\n\nexport const isOtherUser = (user: string, title: string): boolean => {\n return !isCurrentUser(user) && !isSystemNamespace({ title });\n};\n\nexport const requesterFilter = (filter, obj): boolean => {\n if (filter.selected.length === 0) {\n return true;\n }\n\n const requester = obj.metadata?.annotations?.['openshift.io/requester'];\n if (filter.selected.includes(REQUESTER_FILTER.ME) && isCurrentUser(requester)) {\n return true;\n }\n\n if (\n filter.selected.includes(REQUESTER_FILTER.USER) &&\n isOtherUser(requester, obj.metadata.name)\n ) {\n return true;\n }\n\n if (\n filter.selected.includes(REQUESTER_FILTER.SYSTEM) &&\n isSystemNamespace({ title: obj.metadata.name })\n ) {\n return true;\n }\n\n return false;\n};\n","import * as _ from 'lodash-es';\nimport { Dispatch } from 'react-redux';\nimport { ActionType as Action } from 'typesafe-actions';\nimport { checkAccess } from '@console/internal/components/utils/rbac';\n\nimport { cacheResources, getResources as getResources_ } from '../module/k8s/get-resources';\nimport { fetchSwagger, CustomResourceDefinitionKind, K8sResourceKind } from '../module/k8s';\nimport { makeReduxID } from '../components/utils/k8s-watcher';\nimport { CustomResourceDefinitionModel } from '../models';\nimport {\n watchK8sList,\n getResourcesInFlight,\n receivedResources,\n} from '@console/dynamic-plugin-sdk/src/app/k8s/actions/k8s';\n\nexport {\n watchK8sObject,\n watchK8sList,\n stopK8sWatch,\n getResourcesInFlight,\n receivedResources,\n} from '@console/dynamic-plugin-sdk/src/app/k8s/actions/k8s';\n\nexport const API_DISCOVERY_POLL_INTERVAL = 60000;\n\nconst POLLs = {};\nconst apiDiscovery = 'apiDiscovery';\n\ntype K8sEvent = { type: 'ADDED' | 'DELETED' | 'MODIFIED'; object: K8sResourceKind };\n\nexport const getResources = () => (dispatch: Dispatch) => {\n dispatch(getResourcesInFlight());\n\n getResources_()\n .then((resources) => {\n // Cache the resources whenever discovery completes to improve console load times.\n cacheResources(resources);\n dispatch(receivedResources(resources));\n })\n // eslint-disable-next-line no-console\n .catch((err) => console.error('Fetching resource failed:', err))\n .finally(() => {\n setTimeout(() => {\n fetchSwagger().catch((e) => {\n // eslint-disable-next-line no-console\n console.error('Could not fetch OpenAPI yaml after fetching all resources.', e);\n });\n }, 10000);\n });\n};\n\nexport const startAPIDiscovery = () => (dispatch) => {\n const reduxID = makeReduxID(CustomResourceDefinitionModel, {});\n checkAccess({\n group: CustomResourceDefinitionModel.apiGroup,\n resource: CustomResourceDefinitionModel.plural,\n verb: 'list',\n })\n .then((res) => {\n if (res.status.allowed) {\n // eslint-disable-next-line no-console\n console.log('API discovery method: Watching');\n // Always dispatch an initial call\n dispatch(getResources());\n // Watch CRDs and dispatch refreshAPI action whenever an event is received\n dispatch(\n watchK8sList(\n reduxID,\n {},\n CustomResourceDefinitionModel,\n // Re-run API discovery on added or removed CRDs.\n // Note: This extraAction callback is initially called with all items (CRD resources),\n // and later with all changes (K8ssEvents).\n (_id: string, crdsOrEvents: CustomResourceDefinitionKind[] | K8sEvent[]) => {\n if (crdsOrEvents.some((e) => e.type === 'ADDED' || e.type === 'DELETED')) {\n return getResources();\n }\n return _.noop;\n },\n ),\n );\n } else {\n // eslint-disable-next-line no-console\n console.log('API discovery method: Polling');\n // Always dispatch an initial call\n dispatch(getResources());\n // Poll API discovery every 30 seconds since we can't watch CRDs\n if (POLLs[apiDiscovery]) {\n clearTimeout(POLLs[apiDiscovery]);\n delete POLLs[apiDiscovery];\n }\n POLLs[apiDiscovery] = setTimeout(\n () => dispatch(startAPIDiscovery()),\n API_DISCOVERY_POLL_INTERVAL,\n );\n }\n })\n .catch((e) => {\n // eslint-disable-next-line no-console\n console.warn('Error while start API discovery', e);\n });\n};\n\nconst k8sActions = {\n startAPIDiscovery,\n};\n\nexport type K8sAction = Action<typeof k8sActions>;\n","import * as React from 'react';\nimport { useLocation } from 'react-router-dom-v5-compat';\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n return React.useMemo(() => new URLSearchParams(search), [search]);\n};\n\nexport type WithQueryParamsProps = {\n queryParams: URLSearchParams;\n};\n\nexport const withQueryParams = <Props extends WithQueryParamsProps>(\n Component: React.ComponentType<Props>,\n): React.FC<Omit<Props, keyof WithQueryParamsProps>> => (props: Props) => {\n const queryParams = useQueryParams();\n return <Component {...props} queryParams={queryParams} />;\n};\n","import { Map as ImmutableMap } from 'immutable';\nimport * as _ from 'lodash-es';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useSelector } from 'react-redux';\n\nimport { K8sResourceKindReference, K8sKind, getModelExtensionMetadata } from './index';\nimport * as staticModels from '../../models';\nimport {\n referenceForModel,\n kindForReference,\n apiVersionCompare,\n referenceForGroupVersionKind,\n} from './k8s';\nimport store from '../../redux';\nimport { pluginStore } from '../../plugins';\nimport { isModelDefinition, LoadedExtension } from '@console/plugin-sdk';\nimport { isModelMetadata, ModelMetadata } from '@console/dynamic-plugin-sdk';\nimport { DiscoveryResources } from '@console/dynamic-plugin-sdk/src/api/common-types';\n\nconst modelKey = (model: K8sKind): string => {\n // TODO: Use `referenceForModel` even for known API objects\n return model.crd ? referenceForModel(model) : model.kind;\n};\n\nexport const modelsToMap = (models: K8sKind[]): ImmutableMap<K8sResourceKindReference, K8sKind> => {\n return ImmutableMap<K8sResourceKindReference, K8sKind>().withMutations((map) => {\n models.forEach((model) => map.set(modelKey(model), model));\n });\n};\n\n/**\n * Contains static resource definitions for Kubernetes objects.\n * Keys are of type `group:version:Kind`, but TypeScript doesn't support regex types (https://github.com/Microsoft/TypeScript/issues/6579).\n */\nlet k8sModels;\n\nconst getK8sModels = () => {\n if (!k8sModels) {\n k8sModels = modelsToMap(_.values(staticModels));\n\n const hasModel = (model: K8sKind) => k8sModels.has(modelKey(model));\n\n k8sModels = k8sModels.withMutations((map) => {\n const pluginModels = _.flatMap(\n pluginStore\n .getExtensionsInUse()\n .filter(isModelDefinition)\n .map((md) => md.properties.models),\n );\n map.merge(modelsToMap(pluginModels.filter((model) => !hasModel(model))));\n });\n }\n return k8sModels;\n};\n\n/**\n * Provides a synchronous way to acquire a statically-defined Kubernetes model.\n * NOTE: This will not work for CRDs defined at runtime, use `connectToModels` instead.\n */\nexport const modelFor = (ref: K8sResourceKindReference) => {\n const metadataExtensions = pluginStore\n .getExtensionsInUse()\n .filter(isModelMetadata) as LoadedExtension<ModelMetadata>[];\n\n let m = getK8sModels().get(ref);\n if (m) {\n const metadata = getModelExtensionMetadata(metadataExtensions, m?.group, m?.version, m?.kind);\n return _.merge(m, metadata);\n }\n\n // FIXME: Remove synchronous `store.getState()` call here, should be using `connectToModels` instead, only here for backwards-compatibility\n m = store.getState().k8s.getIn(['RESOURCES', 'models']).get(ref);\n if (m) {\n return m;\n }\n\n m = getK8sModels().get(kindForReference(ref));\n if (m) {\n const metadata = getModelExtensionMetadata(metadataExtensions, m?.group, m?.version, m?.kind);\n return _.merge(m, metadata);\n }\n\n m = store.getState().k8s.getIn(['RESOURCES', 'models']).get(kindForReference(ref));\n if (m) {\n return m;\n }\n};\n\n/**\n * Provides a synchronous way to acquire an API discovered Kubernetes model by group and kind only.\n * NOTE: This will not work for CRDs defined at runtime, use `connectToModels` instead.\n */\nexport const modelForGroupKind = (group: string, kind: string): K8sKind => {\n const models: ImmutableMap<string, K8sKind> = store.getState().k8s.getIn(['RESOURCES', 'models']);\n const groupVersionMap: DiscoveryResources['groupVersionMap'] = store\n .getState()\n .k8s.getIn(['RESOURCES', 'groupToVersionMap']);\n\n const { preferredVersion, versions } = groupVersionMap?.[group] || {};\n if (preferredVersion) {\n // Find a model for the CRD that uses this preferred version\n const ref = referenceForGroupVersionKind(group)(preferredVersion)(kind);\n const model = models.get(ref);\n if (model) {\n return model;\n }\n }\n // In case the preferred version does not have the CRD\n if (versions) {\n const sortedVersions: string[] = versions.sort(apiVersionCompare);\n for (const version of sortedVersions) {\n const ref = referenceForGroupVersionKind(group)(version)(kind);\n const model = models.get(ref);\n if (model) {\n return model;\n }\n }\n }\n return null;\n};\n\n/**\n * Provides a synchronous way to acquire all statically-defined Kubernetes models.\n * NOTE: This will not work for CRDs defined at runtime, use `connectToModels` instead.\n */\nexport const allModels = getK8sModels;\n\n/**\n * Use this hook to find the model for resources using only group and plural\n */\nexport const useModelFinder = () => {\n const referenceForGroupVersionPlural = (group: string) => (version: string) => (plural: string) =>\n [group || 'core', version, plural].join('~');\n\n const models: ImmutableMap<string, K8sKind> = useSelector(({ k8s }) =>\n k8s.getIn(['RESOURCES', 'models']),\n );\n const pluralsToModelMap = models.reduce((acc, curr) => {\n const ref = referenceForGroupVersionPlural(curr.apiGroup)(curr.apiVersion)(curr.plural);\n acc[ref] = curr;\n return acc;\n }, {});\n const groupVersionMap: DiscoveryResources['groupVersionMap'] = useSelector(({ k8s }) =>\n k8s.getIn(['RESOURCES', 'groupToVersionMap']),\n );\n\n const findModel = (group: string, resource: string) => {\n if (!group) {\n const refPlural = referenceForGroupVersionPlural(group)('v1')(resource);\n const model = pluralsToModelMap[refPlural];\n if (model) {\n return model;\n }\n }\n const { preferredVersion, versions } = groupVersionMap?.[group] || {};\n if (preferredVersion) {\n // Find a model for the CRD that uses this preferred version\n const ref = referenceForGroupVersionPlural(group)(preferredVersion)(resource);\n const model = pluralsToModelMap[ref];\n if (model) {\n return model;\n }\n }\n // In case the preferred version does not have the CRD\n if (versions) {\n const sortedVersions: string[] = versions.sort(apiVersionCompare);\n for (const version of sortedVersions) {\n const ref = referenceForGroupVersionPlural(group)(version)(resource);\n const model = pluralsToModelMap[ref];\n if (model) {\n return model;\n }\n }\n }\n return null;\n };\n return { findModel };\n};\n","import * as React from 'react';\nimport { ErrorBoundaryFallbackProps } from '@console/dynamic-plugin-sdk';\nimport { history } from '@console/internal/components/utils/router';\n\ntype ErrorBoundaryProps = {\n FallbackComponent?: React.ComponentType<ErrorBoundaryFallbackProps>;\n};\n\n/** Needed for tests -- should not be imported by application logic */\nexport type ErrorBoundaryState = {\n hasError: boolean;\n error: { message: string; stack: string; name: string };\n errorInfo: { componentStack: string };\n};\n\nconst DefaultFallback: React.FC = () => <div />;\n\nclass ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n unlisten: () => void = () => {};\n\n readonly defaultState: ErrorBoundaryState = {\n hasError: false,\n error: {\n message: '',\n stack: '',\n name: '',\n },\n errorInfo: {\n componentStack: '',\n },\n };\n\n constructor(props) {\n super(props);\n this.state = this.defaultState;\n }\n\n componentDidMount() {\n this.unlisten = history.listen(() => {\n // reset state to default when location changes\n this.setState(this.defaultState);\n });\n }\n\n componentWillUnmount() {\n this.unlisten();\n }\n\n componentDidCatch(error, errorInfo) {\n this.setState({\n hasError: true,\n error,\n errorInfo,\n });\n // Log the error so something shows up in the JS console when `DefaultFallback` is used.\n // eslint-disable-next-line no-console\n console.error('Caught error in a child component:', error, errorInfo);\n }\n\n render() {\n const { hasError, error, errorInfo } = this.state;\n const FallbackComponent = this.props.FallbackComponent || DefaultFallback;\n return hasError ? (\n <FallbackComponent\n title={error.name}\n componentStack={errorInfo.componentStack}\n errorMessage={error.message}\n stack={error.stack}\n />\n ) : (\n <>{this.props.children}</>\n );\n }\n}\n\nexport default ErrorBoundary;\n","import * as React from 'react';\nimport * as _ from 'lodash';\n\nexport const useDeepCompareMemoize = <T = any>(value: T, stringify?: boolean): T => {\n const ref = React.useRef<T>();\n\n if (\n stringify\n ? JSON.stringify(value) !== JSON.stringify(ref.current)\n : !_.isEqual(value, ref.current)\n ) {\n ref.current = value;\n }\n\n return ref.current;\n};\n","import { CatalogCategory } from '../components/catalog/utils/types';\n\nexport const defaultCatalogCategories: CatalogCategory[] = [\n {\n id: 'cicd',\n label: 'CI/CD',\n subcategories: [\n { id: 'jenkins', label: 'Jenkins', tags: ['jenkins'] },\n { id: 'pipelines', label: 'Pipelines', tags: ['pipelines'] },\n ],\n },\n {\n id: 'databases',\n label: 'Databases',\n subcategories: [\n { id: 'mariadb', label: 'MariaDB', tags: ['mariadb'] },\n { id: 'mongodb', label: 'Mongo', tags: ['mongodb'] },\n { id: 'mysql', label: 'MySQL', tags: ['mysql'] },\n { id: 'postgresql', label: 'Postgres', tags: ['postgresql'] },\n ],\n },\n {\n id: 'languages',\n label: 'Languages',\n subcategories: [\n { id: 'dotnet', label: '.NET', tags: ['dotnet'] },\n { id: 'golang', label: 'Go', tags: ['golang', 'go'] },\n { id: 'java', label: 'Java', tags: ['java'] },\n {\n id: 'javascript',\n label: 'JavaScript',\n tags: ['javascript', 'nodejs', 'js'],\n },\n { id: 'perl', label: 'Perl', tags: ['perl'] },\n { id: 'php', label: 'PHP', tags: ['php'] },\n { id: 'python', label: 'Python', tags: ['python'] },\n { id: 'ruby', label: 'Ruby', tags: ['ruby'] },\n ],\n },\n {\n id: 'middleware',\n label: 'Middleware',\n subcategories: [\n {\n id: 'analyticsData',\n label: 'Analytics & Data',\n tags: ['datagrid', 'datavirt'],\n },\n {\n id: 'integration',\n label: 'Integration',\n tags: ['amq', 'fuse', 'jboss-fuse', 'sso', '3scale'],\n },\n {\n id: 'processAutomation',\n label: 'Process Automation',\n tags: ['decisionserver', 'processserver'],\n },\n {\n id: 'runtimes',\n label: 'Runtimes & Frameworks',\n tags: ['eap', 'httpd', 'tomcat'],\n },\n ],\n },\n {\n id: 'virtualization',\n label: 'Virtualization',\n subcategories: [{ id: 'vms', label: 'Virtual Machines', tags: ['virtualmachine'] }],\n },\n];\n","import * as React from 'react';\nimport { Label } from '@patternfly/react-core';\nimport { CatalogItemBadge } from '@console/dynamic-plugin-sdk/src/extensions';\nimport './CatalogBadges.scss';\n\ntype CatalogBadgesProps = {\n badges: CatalogItemBadge[];\n};\n\nconst CatalogBadges: React.FC<CatalogBadgesProps> = ({ badges }) => (\n <div className=\"odc-catalog-badges\">\n {badges?.map((badge) => (\n <Label\n className=\"odc-catalog-badges__label\"\n color={badge.color}\n icon={badge.icon}\n variant={badge.variant}\n >\n {badge.text}\n </Label>\n ))}\n </div>\n);\n\nexport default CatalogBadges;\n","export const ONE_SECOND = 1000;\nexport const ONE_MINUTE = 60 * ONE_SECOND;\nexport const ONE_HOUR = 60 * ONE_MINUTE;\nexport const ONE_DAY = 24 * ONE_HOUR;\nexport const ONE_WEEK = 7 * ONE_DAY;\n","export const supportedLocales = {\n en: 'English',\n es: 'Español - Spanish',\n fr: 'Français - French',\n ko: 'í•œêµì–´ - Korean',\n ja: '日本語 - Japanese',\n 'zh-CN': 'ä¸æ–‡ - Chinese (Simplified)',\n};\n\nexport const LAST_LANGUAGE_LOCAL_STORAGE_KEY = 'bridge/last-language';\n","import { UserPreferenceFieldType } from '@console/dynamic-plugin-sdk';\nimport UserPreferenceCheckboxField from './UserPreferenceCheckboxField';\nimport UserPreferenceCustomField from './UserPreferenceCustomField';\nimport UserPreferenceDropdownField from './UserPreferenceDropdownField';\n\nexport const USER_PREFERENCES_BASE_URL = '/user-preferences';\n\nexport const componentForFieldType: Record<UserPreferenceFieldType, React.FC<{ id: string }>> = {\n [UserPreferenceFieldType.dropdown]: UserPreferenceDropdownField,\n [UserPreferenceFieldType.checkbox]: UserPreferenceCheckboxField,\n [UserPreferenceFieldType.custom]: UserPreferenceCustomField,\n};\n","import { K8sModel as K8sKind } from '@console/dynamic-plugin-sdk/src/api/common-types';\n\nexport const DevWorkspaceTemplateModel: K8sKind = {\n apiGroup: 'workspace.devfile.io',\n apiVersion: 'v1alpha2',\n label: 'DevWorkspaceTemplate',\n // t('webterminal-plugin~DevWorkspaceTemplate')\n labelKey: 'webterminal-plugin~DevWorkspaceTemplate',\n // t('webterminal-plugin~DevWorkspaceTemplates')\n labelPluralKey: 'webterminal-plugin~DevWorkspaceTemplates',\n plural: 'devworkspacetemplates',\n abbr: 'DWT',\n kind: 'DevWorkspaceTemplate',\n labelPlural: 'devworkspacetemplates',\n namespaced: true,\n};\n\nexport const WorkspaceModel: K8sKind = {\n kind: 'DevWorkspace',\n label: 'DevWorkspace',\n labelPlural: 'devworkspaces',\n apiGroup: 'workspace.devfile.io',\n apiVersion: 'v1alpha2',\n abbr: 'DW',\n namespaced: true,\n crd: true,\n plural: 'devworkspaces',\n propagationPolicy: 'Background',\n};\n\nexport const v1alpha1WorkspaceModel: K8sKind = Object.assign(\n { ...WorkspaceModel },\n {\n apiVersion: 'v1alpha1',\n },\n);\n","import { useEffect } from 'react';\nimport { chart_color_red_300 as knativeEventingColor } from '@patternfly/react-tokens/dist/js/chart_color_red_300';\nimport * as _ from 'lodash';\nimport { useSafetyFirst } from '@console/dynamic-plugin-sdk';\nimport { coFetch } from '@console/internal/co-fetch';\nimport {\n K8sKind,\n kindToAbbr,\n referenceForModel,\n getLatestVersionForCRD,\n} from '@console/internal/module/k8s';\n\ninterface EventSourcetData {\n loaded: boolean;\n eventSourceModels: K8sKind[];\n eventSourceChannels?: K8sKind[];\n}\n\nconst eventSourceData: EventSourcetData = {\n loaded: false,\n eventSourceModels: [],\n eventSourceChannels: [],\n};\n\ninterface EventChannelData {\n loaded: boolean;\n channels: string[];\n}\n\nexport const getLabelPlural = (kind: string, plural: string) => kind + plural.slice(kind.length);\n\nexport const fetchEventSourcesCrd = async () => {\n const url = 'api/console/knative-event-sources';\n try {\n const res = await coFetch(url);\n const resolvedRes = await res.json();\n const allModels = _.reduce(\n resolvedRes?.items,\n (accumulator, crd) => {\n const {\n metadata: { labels },\n spec: {\n group,\n names: { kind, plural, singular },\n },\n } = crd;\n const crdLatestVersion = getLatestVersionForCRD(crd);\n const labelPlural = getLabelPlural(kind, plural);\n if (crdLatestVersion) {\n const sourceModel = {\n apiGroup: group,\n apiVersion: crdLatestVersion,\n kind,\n plural,\n id: singular,\n label: kind,\n labelPlural,\n abbr: kindToAbbr(kind),\n namespaced: true,\n crd: true,\n color: knativeEventingColor.value,\n };\n const sourceIndex = _.findIndex(accumulator, ['kind', kind]);\n // added check as some sources has multiple entries with deprecated APIgroups\n if (sourceIndex === -1) {\n accumulator.push(sourceModel);\n } else if (!labels?.['eventing.knative.dev/deprecated'] === true) {\n accumulator.splice(sourceIndex, 1, sourceModel);\n }\n }\n return accumulator;\n },\n [],\n );\n\n eventSourceData.eventSourceModels = allModels;\n } catch (err) {\n // show warning if there is an error fetching the CRDs\n // eslint-disable-next-line no-console\n console.warn('Error fetching CRDs for dynamic event sources', err);\n eventSourceData.eventSourceModels = [];\n }\n eventSourceData.loaded = true;\n return eventSourceData.eventSourceModels;\n};\n\nexport const useEventSourceModels = (): EventSourcetData => {\n const [modelsData, setModelsData] = useSafetyFirst({ loaded: false, eventSourceModels: [] });\n useEffect(() => {\n if (eventSourceData.eventSourceModels.length === 0) {\n fetchEventSourcesCrd()\n .then((data) => {\n setModelsData({ loaded: true, eventSourceModels: data });\n })\n .catch((err) => {\n setModelsData({ loaded: true, eventSourceModels: eventSourceData.eventSourceModels });\n // eslint-disable-next-line no-console\n console.warn('Error fetching CRDs for dynamic event sources', err);\n });\n } else {\n setModelsData({ loaded: true, eventSourceModels: eventSourceData.eventSourceModels });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return modelsData;\n};\n\nexport const getEventSourceModels = (): K8sKind[] => eventSourceData.eventSourceModels;\n\nexport const getChannelModels = (): K8sKind[] => eventSourceData.eventSourceChannels;\nexport const getDynamicEventSourcesResourceList = (namespace: string, limit?: number) => {\n return eventSourceData.eventSourceModels.map((model) => {\n return {\n isList: true,\n kind: referenceForModel(model),\n namespace,\n prop: referenceForModel(model),\n optional: true,\n ...(limit && { limit }),\n };\n });\n};\n\nexport const getDynamicEventSourcesWatchers = (namespace: string) => {\n return eventSourceData.eventSourceModels.reduce((acc, model) => {\n acc[referenceForModel(model)] = {\n isList: true,\n kind: referenceForModel(model),\n namespace,\n optional: true,\n };\n return acc;\n }, {});\n};\n\nexport const getDynamicEventSourceModel = (resourceRef: string): K8sKind => {\n return eventSourceData.eventSourceModels.find(\n (model: K8sKind) => referenceForModel(model) === resourceRef,\n );\n};\n\nexport const getDynamicEventSourcesModelRefs = (): string[] => {\n return eventSourceData.eventSourceModels.map((model: K8sKind) => referenceForModel(model));\n};\n\nexport const isDynamicEventResourceKind = (resourceRef: string): boolean => {\n const index = eventSourceData.eventSourceModels.findIndex(\n (model: K8sKind) => referenceForModel(model) === resourceRef,\n );\n return index !== -1;\n};\n\nexport const isDynamicEventSourceKind = (kind: string): boolean => {\n const index = eventSourceData.eventSourceModels.findIndex(\n (model: K8sKind) => model.kind === kind,\n );\n return index !== -1;\n};\n\nexport const fetchChannelsCrd = async () => {\n const url = 'api/console/knative-channels';\n try {\n const res = await coFetch(url);\n const resolvedRes = await res.json();\n\n const allChannelModels = _.reduce(\n resolvedRes?.items,\n (accumulator, crd) => {\n const {\n spec: {\n group,\n names: { kind, plural, singular },\n },\n } = crd;\n const crdLatestVersion = getLatestVersionForCRD(crd);\n const labelPlural = getLabelPlural(kind, plural);\n const sourceModel = {\n apiGroup: group,\n apiVersion: crdLatestVersion,\n kind,\n plural,\n id: singular,\n label: kind,\n labelPlural,\n abbr: kindToAbbr(kind),\n namespaced: true,\n crd: true,\n color: knativeEventingColor.value,\n };\n accumulator.push(sourceModel);\n return accumulator;\n },\n [],\n );\n\n eventSourceData.eventSourceChannels = allChannelModels;\n } catch {\n eventSourceData.eventSourceChannels = [];\n }\n return eventSourceData.eventSourceChannels;\n};\n\nexport const useChannelModels = () => {\n const [modelsData, setModelsData] = useSafetyFirst({ loaded: false, eventSourceChannels: [] });\n useEffect(() => {\n if (eventSourceData.eventSourceChannels.length === 0) {\n fetchChannelsCrd()\n .then((data) => {\n setModelsData({ loaded: true, eventSourceChannels: data });\n })\n .catch((err) => {\n setModelsData({ loaded: true, eventSourceChannels: eventSourceData.eventSourceChannels });\n // eslint-disable-next-line no-console\n console.warn('Error fetching CRDs for dynamic event sources', err);\n });\n } else {\n setModelsData({ loaded: true, eventSourceChannels: eventSourceData.eventSourceChannels });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return modelsData;\n};\n\nexport const getDynamicChannelResourceList = (namespace: string, limit?: number) => {\n return eventSourceData.eventSourceChannels.map((model) => {\n return {\n isList: true,\n kind: referenceForModel(model),\n namespace,\n prop: referenceForModel(model),\n optional: true,\n ...(limit && { limit }),\n };\n });\n};\n\nexport const getDynamicEventingChannelWatchers = (namespace: string) => {\n return eventSourceData.eventSourceChannels.reduce((acc, model) => {\n acc[referenceForModel(model)] = {\n isList: true,\n kind: referenceForModel(model),\n namespace,\n optional: true,\n };\n return acc;\n }, {});\n};\nexport const useChannelResourcesList = (): EventChannelData => {\n const [modelRefs, setModelRefs] = useSafetyFirst<EventChannelData>({\n channels: [],\n loaded: false,\n });\n useEffect(() => {\n if (eventSourceData.eventSourceChannels.length === 0) {\n fetchChannelsCrd()\n .then((data) => {\n setModelRefs({\n channels: data.map((model: K8sKind) => referenceForModel(model)),\n loaded: true,\n });\n })\n .catch((err) => {\n setModelRefs({ channels: [], loaded: true });\n // eslint-disable-next-line no-console\n console.warn('Error fetching CRDs for dynamic channel model refs', err);\n });\n } else {\n setModelRefs({\n channels: eventSourceData.eventSourceChannels.map((model: K8sKind) =>\n referenceForModel(model),\n ),\n loaded: true,\n });\n }\n }, [setModelRefs]);\n return modelRefs;\n};\n\nexport const getDynamicChannelModelRefs = (): string[] => {\n return eventSourceData.eventSourceChannels.map((model: K8sKind) => referenceForModel(model));\n};\nexport const getDynamicChannelModel = (resourceRef: string): K8sKind => {\n return eventSourceData.eventSourceChannels.find(\n (model: K8sKind) => referenceForModel(model) === resourceRef,\n );\n};\n\nexport const isEventingChannelResourceKind = (resourceRef: string): boolean => {\n const index = eventSourceData.eventSourceChannels.findIndex(\n (model: K8sKind) => referenceForModel(model) === resourceRef,\n );\n return index !== -1;\n};\n","import { ALL_NAMESPACES_KEY } from '@console/shared/src';\n\nexport enum Flags {\n OPERATOR_LIFECYCLE_MANAGER = 'OPERATOR_LIFECYCLE_MANAGER',\n}\n\nexport enum DefaultCatalogSource {\n RedHatOperators = 'redhat-operators',\n RedHatMarketPlace = 'redhat-marketplace',\n CertifiedOperators = 'certified-operators',\n CommunityOperators = 'community-operators',\n}\n\nexport enum PackageSource {\n RedHatOperators = 'Red Hat',\n RedHatMarketplace = 'Marketplace',\n CertifiedOperators = 'Certified',\n CommunityOperators = 'Community',\n Custom = 'Custom',\n}\n\nexport const DEFAULT_GLOBAL_OPERATOR_INSTALLATION_NAMESPACE = 'openshift-operators';\nexport const DEFAULT_SOURCE_NAMESPACE = 'openshift-marketplace';\nexport const GLOBAL_COPIED_CSV_NAMESPACE = 'openshift';\nexport const INTERNAL_OBJECTS_ANNOTATION = 'operators.operatorframework.io/internal-objects';\nexport const NON_STANDALONE_ANNOTATION_VALUE = 'non-standalone';\nexport const OPERATOR_NAMESPACE_ANNOTATION = 'olm.operatorNamespace';\nexport const OPERATOR_PLUGINS_ANNOTATION = 'console.openshift.io/plugins';\nexport const OPERATOR_TYPE_ANNOTATION = 'operators.operatorframework.io/operator-type';\nexport const OPERATOR_UNINSTALL_MESSAGE_ANNOTATION = 'operator.openshift.io/uninstall-message';\n\nexport const GLOBAL_OPERATOR_NAMESPACES = [\n DEFAULT_GLOBAL_OPERATOR_INSTALLATION_NAMESPACE,\n GLOBAL_COPIED_CSV_NAMESPACE,\n ALL_NAMESPACES_KEY,\n];\n","import * as _ from 'lodash';\nimport * as React from 'react';\nimport * as classNames from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport { sortable } from '@patternfly/react-table';\nimport { PageComponentProps } from '@console/dynamic-plugin-sdk/src/extensions/horizontal-nav-tabs';\nimport { getGroupVersionKindForResource } from '@console/dynamic-plugin-sdk/src/utils/k8s/k8s-ref';\nimport { useK8sModel } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sModel';\nimport { useDetailsItemExtensionsForResource } from '@console/shared/src/hooks/useDetailsItemExtensionsForResource';\nimport { ExtensionDetailsItem } from '@console/shared/src/components/details-page/ExtensionDetailsItem';\nimport { Conditions } from './conditions';\nimport { DetailsPage, ListPage, Table, TableData, TableProps, RowFunctionArgs } from './factory';\nimport { referenceFor, K8sResourceKind, modelFor } from '../module/k8s';\nimport {\n Kebab,\n kindObj,\n navFactory,\n ResourceKebab,\n ResourceLink,\n ResourceSummary,\n SectionHeading,\n Timestamp,\n} from './utils';\n\nconst { common } = Kebab.factory;\n\nconst tableColumnClasses = ['', '', 'pf-m-hidden pf-m-visible-on-md', Kebab.columnClass];\n\nexport const DetailsForKind: React.FC<PageComponentProps<K8sResourceKind>> = ({ obj }) => {\n const { t } = useTranslation();\n const groupVersionKind = getGroupVersionKindForResource(obj);\n const [model] = useK8sModel(groupVersionKind);\n const leftDetailsItemExtensions = useDetailsItemExtensionsForResource(obj, 'left');\n const rightDetailsItemExtensions = useDetailsItemExtensionsForResource(obj, 'right');\n const leftDetailsItems = React.useMemo(\n () =>\n leftDetailsItemExtensions.map((extension) => (\n <ExtensionDetailsItem key={extension.properties.id} extension={extension} obj={obj} />\n )),\n [leftDetailsItemExtensions, obj],\n );\n\n const rightDetailsItems = React.useMemo(\n () =>\n rightDetailsItemExtensions.map((extension) => (\n <ExtensionDetailsItem key={extension.properties.id} extension={extension} obj={obj} />\n )),\n [rightDetailsItemExtensions, obj],\n );\n\n return (\n <>\n <div className=\"co-m-pane__body\">\n <SectionHeading\n text={t('public~{{kind}} details', {\n kind: model?.labelKey ? t(model.labelKey) : model?.label,\n })}\n />\n <div className=\"row\">\n <div className=\"col-md-6\">\n <ResourceSummary resource={obj} podSelector=\"spec.podSelector\" showNodeSelector={false}>\n {leftDetailsItems}\n </ResourceSummary>\n </div>\n {rightDetailsItems.length > 0 && (\n <dl className=\"co-m-pane__details col-md-6\">{rightDetailsItems}</dl>\n )}\n </div>\n </div>\n {_.isArray(obj?.status?.conditions) && (\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Conditions')} />\n <Conditions conditions={obj.status.conditions} />\n </div>\n )}\n </>\n );\n};\n\nconst TableRowForKind: React.FC<RowFunctionArgs<K8sResourceKind>> = ({ obj, customData }) => {\n const kind = referenceFor(obj) || customData.kind;\n const menuActions = [...Kebab.getExtensionsActionsForKind(kindObj(kind)), ...common];\n const { t } = useTranslation();\n return (\n <>\n <TableData className={tableColumnClasses[0]}>\n <ResourceLink\n kind={customData.kind}\n name={obj.metadata.name}\n namespace={obj.metadata.namespace}\n />\n </TableData>\n <TableData className={classNames(tableColumnClasses[1], 'co-break-word')}>\n {obj.metadata.namespace ? (\n <ResourceLink kind=\"Namespace\" name={obj.metadata.namespace} />\n ) : (\n t('public~None')\n )}\n </TableData>\n <TableData className={tableColumnClasses[2]}>\n <Timestamp timestamp={obj.metadata.creationTimestamp} />\n </TableData>\n <TableData className={tableColumnClasses[3]}>\n <ResourceKebab actions={menuActions} kind={kind} resource={obj} />\n </TableData>\n </>\n );\n};\n\nexport const DefaultList: React.FC<TableProps & { kinds: string[] }> = (props) => {\n const { t } = useTranslation();\n\n const { kinds } = props;\n\n const TableHeader = () => {\n return [\n {\n title: t('public~Name'),\n sortField: 'metadata.name',\n transforms: [sortable],\n props: { className: tableColumnClasses[0] },\n },\n {\n title: t('public~Namespace'),\n sortField: 'metadata.namespace',\n transforms: [sortable],\n props: { className: tableColumnClasses[1] },\n },\n {\n title: t('public~Created'),\n sortField: 'metadata.creationTimestamp',\n transforms: [sortable],\n props: { className: tableColumnClasses[2] },\n },\n {\n title: '',\n props: { className: tableColumnClasses[3] },\n },\n ];\n };\n\n const getAriaLabel = (item) => {\n const model = modelFor(item);\n // API discovery happens asynchronously. Avoid runtime errors if the model hasn't loaded.\n if (!model) {\n return '';\n }\n return model.labelPluralKey ? t(model.labelPluralKey) : model.labelPlural;\n };\n\n const customData = React.useMemo(\n () => ({\n kind: kinds[0],\n }),\n [kinds],\n );\n\n return (\n <Table\n {...props}\n aria-label={getAriaLabel(kinds[0])}\n customData={customData}\n Header={TableHeader}\n Row={TableRowForKind}\n virtualize\n />\n );\n};\nDefaultList.displayName = 'DefaultList';\n\nexport const DefaultPage: React.FC<Omit<React.ComponentProps<typeof ListPage>, 'ListComponent'>> = (\n props,\n) => (\n <ListPage\n {...props}\n ListComponent={DefaultList}\n canCreate={props.canCreate ?? _.get(kindObj(props.kind), 'crd')}\n />\n);\nDefaultPage.displayName = 'DefaultPage';\n\nexport const DefaultDetailsPage: React.FC<React.ComponentProps<typeof DetailsPage>> = (props) => {\n const pages = [navFactory.details(DetailsForKind), navFactory.editYaml()];\n const menuActions = [...Kebab.getExtensionsActionsForKind(kindObj(props.kind)), ...common];\n\n return <DetailsPage {...props} menuActions={menuActions} pages={pages} />;\n};\nDefaultDetailsPage.displayName = 'DefaultDetailsPage';\n","import * as React from 'react';\nimport * as classNames from 'classnames';\nimport { NativeTypes } from 'react-dnd-html5-backend';\nimport { DropTarget } from 'react-dnd';\nimport { ConnectDropTarget, DropTargetMonitor } from 'react-dnd/lib/interfaces';\nimport { Alert } from '@patternfly/react-core';\n/* eslint-disable-next-line */\nimport { withTranslation, WithTranslation } from 'react-i18next';\nimport { isBinary } from 'istextorbinary/edition-es2017/index';\n\nimport withDragDropContext from './drag-drop-context';\n\n// Maximal file size, in bytes, that user can upload\nconst maxFileUploadSize = 4000000;\n\nexport const containsNonPrintableCharacters = (value: string) => {\n if (!value) {\n return false;\n }\n // eslint-disable-next-line no-control-regex\n return /[\\x00-\\x09\\x0E-\\x1F]/.test(value);\n};\n\nclass FileInputWithTranslation extends React.Component<FileInputProps, FileInputState> {\n constructor(props) {\n super(props);\n this.onDataChange = this.onDataChange.bind(this);\n this.onFileUpload = this.onFileUpload.bind(this);\n }\n onDataChange(event) {\n this.props.onChange({\n fileData: event.target.value,\n });\n }\n readFile(file) {\n const { t } = this.props;\n if (file.size > maxFileUploadSize) {\n this.props.onChange({\n errorMessage: t('public~Maximum file size exceeded. File limit is 4MB.'),\n });\n return;\n }\n let fileIsBinary = false;\n const reader = new FileReader();\n reader.onload = () => {\n const input = fileIsBinary\n ? (reader.result as string).split(',')[1]\n : (reader.result as string);\n // OnLoad, if inputFileIsBinary we have read as a binary string, skip next block\n if (containsNonPrintableCharacters(input) && isBinary(null, input) && !fileIsBinary) {\n fileIsBinary = true;\n reader.readAsDataURL(file);\n } else {\n this.props.onChange({\n fileData: input,\n fileIsBinary,\n fileName: file.name,\n });\n }\n };\n reader.readAsText(file, 'UTF-8');\n }\n onFileUpload(event) {\n this.readFile(event.target.files[0]);\n }\n render() {\n const {\n connectDropTarget,\n errorMessage,\n fileIsBinary,\n hideContents,\n isOver,\n canDrop,\n id,\n isRequired,\n t,\n } = this.props;\n const klass = classNames('co-file-dropzone-container', {\n 'co-file-dropzone--drop-over': isOver,\n });\n return connectDropTarget(\n <div className=\"co-file-dropzone\">\n {canDrop && (\n <div className={klass}>\n <p className=\"co-file-dropzone__drop-text\">{t('public~Drop file here')}</p>\n </div>\n )}\n\n <div className=\"form-group\">\n <label\n className={classNames('control-label', { 'co-required': isRequired })}\n htmlFor={id}\n >\n {this.props.label}\n </label>\n <div className=\"modal-body__field\">\n <div className=\"pf-v5-c-input-group\">\n <input\n type=\"text\"\n className=\"pf-v5-c-form-control\"\n aria-label={t('public~Filename')}\n value={this.props.inputFileName}\n aria-describedby={this.props.inputFieldHelpText ? `${id}-help` : undefined}\n readOnly\n disabled\n />\n <span className=\"pf-v5-c-button pf-m-tertiary co-btn-file\">\n <input id={id} type=\"file\" onChange={this.onFileUpload} data-test=\"file-input\" />\n {t('public~Browse...')}\n </span>\n </div>\n {this.props.inputFieldHelpText ? (\n <p className=\"help-block\" id={`${id}-help`}>\n {this.props.inputFieldHelpText}\n </p>\n ) : null}\n {!hideContents && (\n <textarea\n data-test-id={\n this.props['data-test-id'] ? this.props['data-test-id'] : 'file-input-textarea'\n }\n className=\"pf-v5-c-form-control pf-m-resize-both co-file-dropzone__textarea\"\n onChange={this.onDataChange}\n value={this.props.inputFileData}\n aria-label={this.props.label}\n aria-describedby={\n this.props.textareaFieldHelpText ? `${id}-textarea-help` : undefined\n }\n required={isRequired}\n />\n )}\n {this.props.textareaFieldHelpText ? (\n <p className=\"help-block\" id={`${id}-textarea-help`}>\n {this.props.textareaFieldHelpText}\n </p>\n ) : null}\n {errorMessage && <div className=\"text-danger\">{errorMessage}</div>}\n {fileIsBinary && (\n <Alert\n isInline\n className=\"co-alert\"\n variant=\"info\"\n title={t('public~Non-printable file detected.')}\n data-test=\"alert-info\"\n >\n {t('public~File contains non-printable characters. Preview is not available.')}\n </Alert>\n )}\n </div>\n </div>\n </div>,\n );\n }\n}\n\nconst boxTarget = {\n drop(props: FileInputProps, monitor: DropTargetMonitor) {\n if (props.onDrop && monitor.isOver()) {\n props.onDrop(props, monitor);\n }\n },\n};\nexport const FileInput = withTranslation()(FileInputWithTranslation);\nconst FileInputComponent = DropTarget(NativeTypes.FILE, boxTarget, (connect, monitor) => ({\n connectDropTarget: connect.dropTarget(),\n isOver: monitor.isOver(),\n canDrop: monitor.canDrop(),\n}))(FileInput);\n\nconst DroppableFileInputWithTranslation = withDragDropContext(\n class DroppableFileInput extends React.Component<\n DroppableFileInputProps,\n DroppableFileInputState\n > {\n constructor(props) {\n super(props);\n this.state = {\n inputFileName: '',\n inputFileData: this.props.inputFileData || '',\n inputFileIsBinary:\n this.props.inputFileIsBinary ||\n (containsNonPrintableCharacters(this.props.inputFileData) &&\n isBinary(null, this.props.inputFileData)),\n };\n this.handleFileDrop = this.handleFileDrop.bind(this);\n this.onDataChange = this.onDataChange.bind(this);\n }\n handleFileDrop(item: any, monitor: DropTargetMonitor) {\n const { t } = this.props;\n if (!monitor) {\n return;\n }\n const file = monitor.getItem().files[0];\n if (file.size > maxFileUploadSize) {\n this.setState({\n errorMessage: t('public~Maximum file size exceeded. File limit is 4MB.'),\n inputFileName: '',\n inputFileData: '',\n });\n return;\n }\n let inputFileIsBinary = false;\n const reader = new FileReader();\n reader.onload = () => {\n const input = reader.result as string; // Note(Yaacov): we use reader.readAsText\n // OnLoad, if inputFileIsBinary we have read as a binary string, skip next block\n if (containsNonPrintableCharacters(input) && isBinary(null, input) && !inputFileIsBinary) {\n inputFileIsBinary = true;\n reader.readAsBinaryString(file);\n } else {\n this.setState(\n {\n inputFileName: file.name,\n inputFileData: input,\n inputFileIsBinary,\n errorMessage: '',\n },\n () => this.props.onChange(input, inputFileIsBinary),\n );\n }\n };\n reader.readAsText(file, 'UTF-8');\n }\n onDataChange(data) {\n const { fileData, fileIsBinary, fileName, errorMessage } = data;\n this.setState(\n {\n inputFileData: fileData || '',\n inputFileIsBinary: fileIsBinary,\n inputFileName: fileName || '',\n errorMessage: errorMessage || '',\n },\n () => this.props.onChange(this.state.inputFileData, fileIsBinary),\n );\n }\n render() {\n return (\n <FileInputComponent\n {...this.props}\n errorMessage={this.state.errorMessage}\n onDrop={this.handleFileDrop}\n onChange={this.onDataChange}\n inputFileData={this.state.inputFileData}\n inputFileName={this.state.inputFileName}\n fileIsBinary={this.state.inputFileIsBinary}\n hideContents={this.state.inputFileIsBinary}\n />\n );\n }\n },\n);\n\nexport const DroppableFileInput = withTranslation()(DroppableFileInputWithTranslation);\n\nexport type DroppableFileInputProps = WithTranslation & {\n inputFileData: string;\n onChange: Function;\n label: string;\n id: string;\n inputFieldHelpText: string;\n textareaFieldHelpText: string;\n isRequired: boolean;\n hideContents?: boolean;\n inputFileIsBinary?: boolean;\n};\n\nexport type DroppableFileInputState = {\n inputFileData: string;\n inputFileIsBinary?: boolean;\n inputFileName: string;\n errorMessage?: any;\n};\n\nexport type FileInputState = {\n inputFileData: string;\n inputFileName: string;\n};\n\nexport type FileInputProps = WithTranslation & {\n errorMessage: string;\n connectDropTarget?: ConnectDropTarget;\n isOver?: boolean;\n canDrop?: boolean;\n onDrop: (props: FileInputProps, monitor: DropTargetMonitor) => void;\n inputFileData: string;\n inputFileName: string;\n onChange: Function;\n label: string;\n id: string;\n inputFieldHelpText: string;\n textareaFieldHelpText: string;\n isRequired: boolean;\n hideContents?: boolean;\n fileIsBinary?: boolean;\n};\n","import * as _ from 'lodash';\nimport 'whatwg-fetch';\nimport { getUtilsConfig } from '../../app/configSetup';\nimport { setAdmissionWebhookWarning } from '../../app/core/actions';\nimport storeHandler from '../../app/storeHandler';\nimport { ConsoleFetchText, ConsoleFetchJSON, ConsoleFetch } from '../../extensions/console-types';\nimport { TimeoutError } from '../error/http-error';\nimport { getConsoleRequestHeaders } from './console-fetch-utils';\n\n/**\n * A custom wrapper around `fetch` that adds console-specific headers and allows for retries and timeouts.\n * It also validates the response status code and throws an appropriate error or logs out the user if required.\n * @param url The URL to fetch\n * @param options The options to pass to fetch\n * @param timeout The timeout in milliseconds\n * @returns A promise that resolves to the response.\n */\nexport const consoleFetch: ConsoleFetch = async (url, options = {}, timeout = 60000) => {\n const fetchPromise = getUtilsConfig().appFetch(url, options);\n\n if (timeout <= 0) {\n return fetchPromise;\n }\n\n const timeoutPromise = new Promise<Response>((resolve, reject) => {\n setTimeout(() => reject(new TimeoutError(url, timeout)), timeout);\n });\n\n return Promise.race([fetchPromise, timeoutPromise]);\n};\n\nconst parseData = async (response) => {\n const text = await response.text();\n const isPlainText = response.headers.get('Content-Type') === 'text/plain';\n if (!text) {\n return isPlainText ? '' : {};\n }\n return isPlainText || !response.ok ? text : JSON.parse(text);\n};\n\nconst handleAdmissionWebhookWarning = (warning: string, kind?: string, name?: string) => {\n const store = storeHandler.getStore();\n const id = `${kind}_${name}_${warning}`;\n const warningData = { kind, name, warning };\n store.dispatch(setAdmissionWebhookWarning(id, warningData));\n};\n\nconst consoleFetchCommon = async (\n url: string,\n method: string = 'GET',\n options: RequestInit = {},\n timeout?: number,\n): Promise<Response | string> => {\n const headers = getConsoleRequestHeaders();\n // Pass headers last to let callers to override Accept.\n const allOptions = _.defaultsDeep({ method }, options, { headers });\n const response = await consoleFetch(url, allOptions, timeout);\n const dataPromise = parseData(response);\n const warning = response.headers.get('Warning');\n\n // If the response has a warning header, store it in the redux store.\n if (response.ok && warning && method !== 'GET') {\n // Do nothing on error since this is a side-effect. Caller will handle the error.\n dataPromise\n .then((data) => handleAdmissionWebhookWarning(warning, data.kind, data.metadata?.name))\n .catch(() => {});\n }\n\n return dataPromise;\n};\n\n/**\n * A custom wrapper around `fetch` that adds console-specific headers and allows for retries and timeouts.\n * It also validates the response status code and throws an appropriate error or logs out the user if required.\n * It returns the response as a JSON object.\n * Uses consoleFetch internally.\n * @param url The URL to fetch\n * @param method The HTTP method to use. Defaults to GET\n * @param options The options to pass to fetch\n * @param timeout The timeout in milliseconds\n * @returns A promise that resolves to the response as text or JSON object.\n */\nexport const consoleFetchJSON: ConsoleFetchJSON = (url, method = 'GET', options = {}, timeout) => {\n const allOptions = _.defaultsDeep({}, options, {\n headers: { Accept: 'application/json' },\n });\n return consoleFetchCommon(url, method, allOptions, timeout);\n};\n\n/**\n * A custom wrapper around `fetch` that adds console-specific headers and allows for retries and timeouts.\n * It also validates the response status code and throws an appropriate error or logs out the user if required.\n * It returns the response as a text.\n * Uses `consoleFetch` internally.\n * @param url The URL to fetch\n * @param options The options to pass to fetch\n * @param timeout The timeout in milliseconds\n * @returns A promise that resolves to the response as text or JSON object.\n */\nexport const consoleFetchText: ConsoleFetchText = (url, options = {}, timeout) => {\n return consoleFetchCommon(url, 'GET', options, timeout);\n};\n\nconst consoleFetchSendJSON = (\n url: string,\n method: string,\n json = null,\n options: RequestInit = {},\n timeout: number,\n) => {\n const allOptions: Record<string, any> = {\n headers: {\n Accept: 'application/json',\n 'Content-Type': `application/${\n method === 'PATCH' ? 'json-patch+json' : 'json'\n };charset=UTF-8`,\n },\n };\n if (json) {\n allOptions.body = JSON.stringify(json);\n }\n\n return consoleFetchJSON(url, method, _.defaultsDeep(allOptions, options), timeout);\n};\n\n/**\n * A custom DELETE method of consoleFetchJSON.\n * It sends an optional JSON object as the body of the request and adds extra headers for patch request.\n * @param url The URL to delete the object\n * @param json The JSON to delete the object\n * @param options The options to pass to fetch\n * @param timeout The timeout in milliseconds\n */\nconsoleFetchJSON.delete = (url, json = null, options = {}, timeout) => {\n return json\n ? consoleFetchSendJSON(url, 'DELETE', json, options, timeout)\n : consoleFetchJSON(url, 'DELETE', options, timeout);\n};\n\n/**\n * A custom POST method of consoleFetchJSON.\n * It sends the JSON object as the body of the request.\n * @param url The URL to post the object\n * @param json The JSON to POST the object\n * @param options The options to pass to fetch\n * @param timeout The timeout in milliseconds\n */\nconsoleFetchJSON.post = (url: string, json, options = {}, timeout) =>\n consoleFetchSendJSON(url, 'POST', json, options, timeout);\n\n/**\n * A custom PUT method of consoleFetchJSON.\n * It sends the JSON object as the body of the request.\n * @param url The URL to put the object\n * @param json The JSON to PUT the object\n * @param options The options to pass to fetch\n * @param timeout The timeout in milliseconds\n */\nconsoleFetchJSON.put = (url: string, json, options = {}, timeout) =>\n consoleFetchSendJSON(url, 'PUT', json, options, timeout);\n\n/**\n * A custom PATCH method of consoleFetchJSON.\n * It sends the JSON object as the body of the request.\n * @param url The URL to patch the object\n * @param json The JSON to PATCH the object\n * @param options The options to pass to fetch\n * @param timeout The timeout in milliseconds\n */\nconsoleFetchJSON.patch = (url: string, json, options = {}, timeout) =>\n consoleFetchSendJSON(url, 'PATCH', json, options, timeout);\n","import * as React from 'react';\nimport { useExtensions } from '@console/plugin-sdk/src/api/useExtensions';\nimport { resolveExtension } from '../coderefs/coderef-resolver';\nimport { UseResolvedExtensions } from '../extensions/console-types';\nimport { Extension, ExtensionTypeGuard, ResolvedExtension } from '../types';\nimport { settleAllPromises } from '../utils/promise';\n\nexport const useResolvedExtensions: UseResolvedExtensions = <E extends Extension>(\n ...typeGuards: ExtensionTypeGuard<E>[]\n): [ResolvedExtension<E>[], boolean, any[]] => {\n const extensions = useExtensions<E>(...typeGuards);\n\n const [resolvedExtensions, setResolvedExtensions] = React.useState<ResolvedExtension<E>[]>([]);\n const [resolved, setResolved] = React.useState<boolean>(false);\n const [errors, setErrors] = React.useState<any[]>([]);\n\n React.useEffect(() => {\n let disposed = false;\n\n // eslint-disable-next-line promise/catch-or-return\n settleAllPromises(\n extensions.map((e) => resolveExtension<typeof e, any, ResolvedExtension<E>>(e)),\n ).then(([fulfilledValues, rejectedReasons]) => {\n if (!disposed) {\n setResolvedExtensions(fulfilledValues);\n setErrors(rejectedReasons);\n setResolved(true);\n\n if (rejectedReasons.length > 0) {\n // eslint-disable-next-line no-console\n console.error('Detected errors while resolving Console extensions', rejectedReasons);\n }\n }\n });\n\n return () => {\n disposed = true;\n };\n }, [extensions]);\n\n return [resolvedExtensions, resolved, errors];\n};\n","import {\n NodeAddress,\n NodeKind,\n Taint,\n} from '@console/dynamic-plugin-sdk/src/extensions/console-types';\n\nconst NODE_ROLE_PREFIX = 'node-role.kubernetes.io/';\n\nexport const getNodeRoles = (node: NodeKind): string[] =>\n Object.keys(node?.metadata?.labels ?? {}).reduce<string[]>((acc, k) => {\n if (k.startsWith(NODE_ROLE_PREFIX)) {\n acc.push(k.slice(NODE_ROLE_PREFIX.length));\n }\n return acc;\n }, []);\n\nexport const getNodeRole = (node: NodeKind): string =>\n getNodeRoles(node).includes('control-plane') ? 'control-plane' : 'worker';\n\nexport const getNodeRoleMatch = (node: NodeKind, role: string): boolean =>\n getNodeRoles(node).filter((elem) => elem === role).length > 0;\n\nexport const getNodeAddresses = (node: NodeKind): NodeAddress[] => node?.status?.addresses ?? [];\n\nexport const getNodeMachineNameAndNamespace = (node: NodeKind): [string, string] => {\n const machine = node?.metadata?.annotations?.['machine.openshift.io/machine'] ?? '/';\n const [namespace, name] = machine.split('/');\n return [name, namespace];\n};\n\nexport const getNodeMachineName = (node: NodeKind): string =>\n getNodeMachineNameAndNamespace(node)[0];\n\nexport const isNodeUnschedulable = (node: NodeKind): boolean => node?.spec?.unschedulable ?? false;\n\nexport const isNodeReady = (node: NodeKind): boolean => {\n return (\n node?.status?.conditions?.some?.(({ type, status }) => type === 'Ready' && status === 'True') ??\n false\n );\n};\n\nexport const getNodeCPUCapacity = (node: NodeKind): string => node?.status?.capacity?.cpu ?? '';\n\nexport const getNodeAllocatableMemory = (node: NodeKind): string =>\n node?.status?.allocatable?.memory ?? '';\n\nexport const getNodeTaints = (node: NodeKind): Taint[] => node?.spec?.taints;\n\nexport const isWindowsNode = (node): boolean =>\n node?.metadata?.labels?.['node.openshift.io/os_id'] === 'Windows' ||\n node?.metadata?.labels?.['corev1.LabelOSStable'] === 'windows';\n\nexport const getNodeUptime = (node: NodeKind): string =>\n node?.status?.conditions?.find(({ type, status }) => type === 'Ready' && status === 'True')\n ?.lastTransitionTime;\n","import * as React from 'react';\nimport { QuickStartContext, QuickStartContextValues } from '@patternfly/quickstarts';\n\nexport const useQuickStartContext = () => {\n return React.useContext<QuickStartContextValues>(QuickStartContext);\n};\n","import * as _ from 'lodash-es';\nimport { createEquals } from '@console/dynamic-plugin-sdk/src/utils/k8s';\n\nexport const requirementFromString = (string) => {\n string = string.trim();\n\n // \"key\"\n if (/^[0-9A-Za-z/\\-_.]+$/.test(string)) {\n return {\n key: string,\n operator: 'Exists',\n values: [],\n };\n }\n\n // \"!key\"\n if (/^!\\s*[0-9A-Za-z/\\-_.]+$/.test(string)) {\n return {\n key: string.split(/!\\s*/)[1],\n operator: 'DoesNotExist',\n values: [],\n };\n }\n\n // \"key=value\" OR \"key==value\"\n if (/^[0-9A-Za-z/\\-_.]+\\s*==?\\s*[0-9A-Za-z/\\-_.]+$/.test(string)) {\n const parts = string.split(/\\s*==?\\s*/);\n const key = parts[0];\n const value = parts[1];\n return createEquals(key, value);\n }\n\n // \"key!=value\"\n if (/^[0-9A-Za-z/\\-_.]+\\s*!=\\s*[0-9A-Za-z/\\-_.]+$/.test(string)) {\n return {\n key: string.split(/\\s*!=\\s*/)[0],\n operator: 'NotEquals',\n values: [string.split(/\\s*!=\\s*/)[1]],\n };\n }\n\n // \"key in (value1[,value2,...])\"\n if (/^[0-9A-Za-z/\\-_.]+\\s+in\\s+\\([0-9A-Za-z/\\-_.,\\s]+\\)$/.test(string)) {\n const parts = string.split(/\\s+in\\s+/);\n const key = parts[0];\n const values = parts[1].slice(1, -1).split(',').map(_.trim);\n\n return {\n key,\n operator: 'In',\n values,\n };\n }\n\n // \"key notin (value1[,value2,...])\"\n if (/^[0-9A-Za-z/\\-_.]+\\s+notin\\s+\\([0-9A-Za-z/\\-_.,\\s]+\\)$/.test(string)) {\n const parts = string.split(/\\s+notin\\s+/);\n const key = parts[0];\n const values = parts[1].slice(1, -1).split(',').map(_.trim);\n\n return {\n key,\n operator: 'NotIn',\n values,\n };\n }\n\n // \"key > value1\"\n if (/^[0-9A-Za-z/\\-_.]+\\s+>\\s+[0-9.]+$/.test(string)) {\n const parts = string.split(/\\s+>\\s+/);\n const key = parts[0];\n const value = parts[1];\n\n return {\n key,\n operator: 'GreaterThan',\n values: [value],\n };\n }\n\n // \"key < value1\"\n if (/^[0-9A-Za-z/\\-_.]+\\s+<\\s+[0-9.]+$/.test(string)) {\n const parts = string.split(/\\s+<\\s+/);\n const key = parts[0];\n const value = parts[1];\n\n return {\n key,\n operator: 'LessThan',\n values: [value],\n };\n }\n\n return; // falsy means parsing failure\n};\n","/* eslint-disable camelcase */\nimport * as _ from 'lodash-es';\nimport { Base64 } from 'js-base64';\nimport { safeLoad, safeDump } from 'js-yaml';\n\nimport { SecretModel } from '../../../models';\nimport { k8sPatch, K8sResourceKind } from '../../../module/k8s';\nimport { AlertmanagerConfig } from './alertmanager-config';\n\n// t('public~PagerDuty')\n// t('public~Webhook')\n// t('public~Email')\n// t('public~Slack')\nexport const receiverTypes = Object.freeze({\n pagerduty_configs: 'PagerDuty',\n webhook_configs: 'Webhook',\n email_configs: 'Email',\n slack_configs: 'Slack',\n});\n\nexport const getAlertmanagerYAML = (\n secret: K8sResourceKind,\n): { yaml: string; errorMessage?: string } => {\n const alertManagerYaml = _.get(secret, ['data', 'alertmanager.yaml']);\n\n if (_.isEmpty(alertManagerYaml)) {\n return {\n yaml: '',\n errorMessage:\n 'Error: alertmanager.yaml not found in Secret \"alertmanager-main\", in namespace \"openshift-monitoring\"',\n };\n }\n\n try {\n const yaml = Base64.decode(alertManagerYaml);\n return { yaml };\n } catch (e) {\n return { yaml: '', errorMessage: `Error decoding alertmanager.yaml: ${e}` };\n }\n};\n\nexport const getAlertmanagerConfig = (\n secret: K8sResourceKind,\n): { config: AlertmanagerConfig; errorMessage?: string } => {\n const parsedAlertmanagerYAML = getAlertmanagerYAML(secret);\n try {\n const config = safeLoad(parsedAlertmanagerYAML.yaml);\n return { config, errorMessage: parsedAlertmanagerYAML.errorMessage };\n } catch (e) {\n return { config: null, errorMessage: `Error loading alertmanager.yaml: ${e}` };\n }\n};\n\nexport const patchAlertmanagerConfig = (\n secret: K8sResourceKind,\n yaml: object | string,\n): Promise<any> => {\n const yamlString = _.isObject(yaml) ? safeDump(yaml) : yaml;\n const yamlEncodedString = Base64.encode(yamlString);\n const patch = [{ op: 'replace', path: '/data/alertmanager.yaml', value: yamlEncodedString }];\n return k8sPatch(SecretModel, secret, patch);\n};\n","export * from './catalog-utils';\nexport * from './category-utils';\nexport * from './filter-utils';\nexport * from './types';\n","import { Map as ImmutableMap } from 'immutable';\nimport { UserInfo } from '../../../extensions';\nimport { ImpersonateKind, SDKStoreState, AdmissionWebhookWarning } from '../../redux-types';\n\ntype GetImpersonate = (state: SDKStoreState) => ImpersonateKind;\ntype GetUser = (state: SDKStoreState) => UserInfo;\ntype GetAdmissionWebhookWarnings = (\n state: SDKStoreState,\n) => ImmutableMap<string, AdmissionWebhookWarning>;\n\n/**\n * It provides impersonation details from the redux store.\n * @param state the root state\n * @returns The the impersonate state.\n */\nexport const getImpersonate: GetImpersonate = (state) => state.sdkCore.impersonate;\n\n/**\n * It provides impersonation details from the redux store as a props object.\n * @param state the root state\n * @returns The the impersonation details props object.\n */\nexport const impersonateStateToProps = (state: SDKStoreState) => {\n return { impersonate: getImpersonate(state) };\n};\n\n/**\n * It provides user details from the redux store.\n * @param state the root state\n * @returns The the user state.\n */\nexport const getUser: GetUser = (state) => state.sdkCore.user;\n\n/**\n * It provides admission webhook warning data from the redux store.\n * @param state the root state\n * @returns The the admissionWebhookWarning state.\n */\nexport const getAdmissionWebhookWarnings: GetAdmissionWebhookWarnings = (state) =>\n state.sdkCore.admissionWebhookWarnings;\n","import * as _ from 'lodash-es';\nimport { plural } from 'pluralize';\nimport i18next, { TFunction } from 'i18next';\n\nimport { K8sKind, K8sVerb } from '../../module/k8s';\nimport { isModelMetadata, ModelMetadata } from '@console/dynamic-plugin-sdk';\nimport { DiscoveryResources } from '@console/dynamic-plugin-sdk/src/api/common-types';\nimport { LoadedExtension } from '@console/dynamic-plugin-sdk/src/types';\nimport {\n getTranslationKey,\n isTranslatableString,\n translateExtension,\n} from '@console/plugin-sdk/src/utils/extension-i18n';\nimport { API_DISCOVERY_RESOURCES_LOCAL_STORAGE_KEY } from '@console/shared/src/constants';\nimport { fetchURL } from '../../graphql/client';\nimport { pluginStore } from '../../plugins';\nimport { loading as i18nLoading } from '../../i18n';\n\nconst ADMIN_RESOURCES = new Set([\n 'roles',\n 'rolebindings',\n 'clusterroles',\n 'clusterrolebindings',\n 'thirdpartyresources',\n 'nodes',\n 'secrets',\n]);\n\nconst abbrBlacklist = ['ASS', 'FART'];\nexport const kindToAbbr = (kind) => {\n const abbrKind = (kind.replace(/[^A-Z]/g, '') || kind.toUpperCase()).slice(0, 4);\n return abbrBlacklist.includes(abbrKind) ? abbrKind.slice(0, -1) : abbrKind;\n};\n\nexport const cacheResources = (resources) =>\n new Promise<void>((resolve, reject) => {\n try {\n // Add the console version. We invalidate the cache when console version changes.\n const { consoleVersion } = window.SERVER_FLAGS;\n const versionedResources = _.assign({}, resources, { consoleVersion });\n localStorage.setItem(\n API_DISCOVERY_RESOURCES_LOCAL_STORAGE_KEY,\n JSON.stringify(versionedResources),\n );\n resolve();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Error caching API resources in localStorage', e);\n reject(e);\n }\n });\n\nexport const getCachedResources = () =>\n new Promise<any>((resolve, reject) => {\n try {\n const resourcesJSON = localStorage.getItem(API_DISCOVERY_RESOURCES_LOCAL_STORAGE_KEY);\n\n // Clear cached resources after load as a safeguard. If there's any errors\n // with the content that prevents the console from working, the bad data\n // will not be loaded when the user refreshes the console. The cache will\n // be refreshed when discovery completes.\n localStorage.removeItem(API_DISCOVERY_RESOURCES_LOCAL_STORAGE_KEY);\n\n if (resourcesJSON) {\n const resources = JSON.parse(resourcesJSON);\n const { consoleVersion: currentVersion } = window.SERVER_FLAGS;\n const { consoleVersion: cachedVersion } = resources;\n if (cachedVersion !== currentVersion) {\n // eslint-disable-next-line no-console\n console.log(\n `Invalidating API discovery cache from earlier console version (current: ${currentVersion}, cached: ${cachedVersion})`,\n );\n resolve(null);\n return;\n }\n // eslint-disable-next-line no-console\n console.log('Loaded cached API resources from localStorage');\n resolve(resources);\n return;\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Error reading API resources from localStorage', e);\n reject(e);\n }\n\n resolve(null);\n });\n\nexport const pluralizeKind = (kind: string): string => {\n // Use startCase to separate words so the last can be pluralized but remove spaces so as not to humanize\n const pluralized = plural(_.startCase(kind)).replace(/\\s+/g, '');\n // Handle special cases like DB -> DBs (instead of DBS).\n if (pluralized === `${kind}S`) {\n return `${kind}s`;\n }\n return pluralized;\n};\n\nexport const getModelExtensionMetadata = (\n extensions: LoadedExtension<ModelMetadata>[],\n group: string,\n version?: string,\n kind?: string,\n) => {\n const tcb: TFunction = (value: string) =>\n isTranslatableString(value) ? i18next.t(getTranslationKey(value)) : value;\n const translatedExtensions = extensions.map((e) => translateExtension(e, tcb));\n const groupVersionKindMetadata = translatedExtensions\n .filter(\n ({ properties }) =>\n properties.model.group === group &&\n properties.model.kind === kind &&\n properties.model.version === version,\n )\n .map((e) => e.properties);\n const groupKindMetadata = translatedExtensions\n .filter(\n ({ properties }) =>\n properties.model.version == null &&\n properties.model.group === group &&\n properties.model.kind === kind,\n )\n .map((e) => e.properties);\n const groupMetadata = translatedExtensions\n .filter(\n ({ properties }) =>\n properties.model.kind == null &&\n properties.model.version == null &&\n properties.model.group === group,\n )\n .map((e) => e.properties);\n\n return _.omit(\n Object.assign({}, ...groupMetadata, ...groupKindMetadata, ...groupVersionKindMetadata),\n ['model'],\n );\n};\n\nexport const getResources = (): Promise<DiscoveryResources> =>\n fetchURL('/apis').then((res) => {\n const groupVersionMap = res.groups.reduce(\n (acc, { name, versions, preferredVersion: { version } }) => {\n acc[name] = {\n versions: _.map(versions, 'version'),\n preferredVersion: version,\n };\n return acc;\n },\n {},\n );\n const all = _.flatten<string>(\n res.groups.map((group) => group.versions.map((version) => `/apis/${version.groupVersion}`)),\n )\n .concat(['/api/v1'])\n .map((p) => fetchURL<APIResourceList>(p).catch((err) => err));\n\n // Wait also until the known translation bundles are resolved\n all.push(i18nLoading);\n\n return Promise.all(all).then((data) => {\n // Drop i18nLoading promise (resolved loaded state)\n data.pop();\n\n const resourceSet = new Set<string>();\n const namespacedSet = new Set<string>();\n data.forEach(\n (d) =>\n d.resources &&\n d.resources.forEach(({ namespaced, name }) => {\n resourceSet.add(name);\n namespaced && namespacedSet.add(name);\n }),\n );\n const allResources = [...resourceSet].sort();\n\n const safeResources = [];\n const adminResources = [];\n\n const defineModels = (list: APIResourceList): K8sKind[] => {\n const metadataExtensions = pluginStore\n .getExtensionsInUse()\n .filter(isModelMetadata) as LoadedExtension<ModelMetadata>[];\n const groupVersionParts = list.groupVersion.split('/');\n const apiGroup = groupVersionParts.length > 1 ? groupVersionParts[0] : null;\n const apiVersion = groupVersionParts.length > 1 ? groupVersionParts[1] : list.groupVersion;\n return list.resources\n .filter(({ name }) => !name.includes('/'))\n .map(({ name, singularName, namespaced, kind, verbs, shortNames }) => {\n return {\n kind,\n namespaced,\n verbs,\n shortNames,\n label: kind,\n plural: name,\n apiVersion,\n abbr: kindToAbbr(kind),\n ...(apiGroup ? { apiGroup } : {}),\n labelPlural: pluralizeKind(kind),\n path: name,\n id: singularName,\n crd: true,\n ...getModelExtensionMetadata(metadataExtensions, apiGroup, apiVersion, kind),\n };\n });\n };\n\n const models = _.flatten(data.filter((d) => d.resources).map(defineModels));\n allResources.forEach((r) =>\n ADMIN_RESOURCES.has(r.split('/')[0]) ? adminResources.push(r) : safeResources.push(r),\n );\n const configResources = _.filter(\n models,\n (m) => m.apiGroup === 'config.openshift.io' && m.kind !== 'ClusterOperator',\n );\n const clusterOperatorConfigResources = _.filter(\n models,\n (m) => m.apiGroup === 'operator.openshift.io',\n );\n\n return {\n allResources,\n safeResources,\n adminResources,\n configResources,\n clusterOperatorConfigResources,\n namespacedSet,\n models,\n groupVersionMap,\n };\n });\n });\n\nexport type APIResourceList = {\n kind: 'APIResourceList';\n apiVersion: 'v1';\n groupVersion: string;\n resources?: {\n name: string;\n singularName?: string;\n namespaced?: boolean;\n kind: string;\n verbs: K8sVerb[];\n shortNames?: string[];\n }[];\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { Helmet } from 'react-helmet';\nimport { connect } from 'react-redux';\nimport { useParams, useLocation, useNavigate } from 'react-router-dom-v5-compat';\nimport * as classNames from 'classnames';\nimport { ActionGroup, Button } from '@patternfly/react-core';\nimport { sortable } from '@patternfly/react-table';\nimport { ListPageBody } from '@console/dynamic-plugin-sdk';\nimport { FLAGS } from '@console/shared/src/constants';\nimport { useActiveNamespace } from '@console/shared/src/hooks/useActiveNamespace';\nimport { ClusterRoleBindingModel } from '../../models';\nimport { getQN, k8sCreate, k8sPatch, referenceFor } from '../../module/k8s';\nimport * as UIActions from '../../actions/ui';\nimport { Table, TableData } from '../factory';\nimport ListPageFilter from '../factory/ListPage/ListPageFilter';\nimport ListPageHeader from '../factory/ListPage/ListPageHeader';\nimport { useListPageFilter } from '../factory/ListPage/filter-hook';\nimport { ListPageCreateLink } from '../factory/ListPage/ListPageCreate';\nimport { RadioGroup } from '../radio';\nimport { confirmModal } from '../modals';\nimport {\n ButtonBar,\n Firehose,\n getQueryArgument,\n Kebab,\n kindObj,\n ListDropdown,\n MsgBox,\n NsDropdown,\n PageHeading,\n ResourceKebab,\n ResourceLink,\n ResourceName,\n resourceObjPath,\n StatusBox,\n useAccessReview,\n} from '../utils';\nimport { connectToFlags } from '../../reducers/connectToFlags';\nimport { flagPending } from '../../reducers/features';\nimport { useTranslation, withTranslation } from 'react-i18next';\nimport i18next from 'i18next';\nimport { useK8sWatchResources } from '../utils/k8s-watch-hook';\n\nconst bindingKind = (binding) =>\n binding.metadata.namespace ? 'RoleBinding' : 'ClusterRoleBinding';\n\n// Split each binding into one row per subject\nexport const flatten = (resources) =>\n _.flatMap(resources, (resource) => {\n const ret = [];\n\n _.each(resource.data, (binding) => {\n if (!binding) {\n return undefined;\n }\n if (_.isEmpty(binding.subjects)) {\n const subject = { kind: '-', name: '-' };\n return ret.push(Object.assign({}, binding, { subject }));\n }\n _.each(binding.subjects, (subject, subjectIndex) => {\n ret.push(\n Object.assign({}, binding, {\n subject,\n subjectIndex,\n rowKey: `${getQN(binding)}|${subject.kind}|${subject.name}${\n subject.namespace ? `|${subject.namespace}` : ''\n }`,\n }),\n );\n });\n });\n\n return ret;\n });\n\nconst getKindLabel = (kind) => (kind.labelKey ? i18next.t(kind.labelKey) : kind.label);\n\nconst menuActions = ({ subjectIndex, subjects }, startImpersonate, navigate) => {\n const subject = subjects[subjectIndex];\n\n const actions = [\n (kind, obj) => ({\n label: i18next.t('public~Duplicate {{kindLabel}}', {\n kindLabel: getKindLabel(kind),\n }),\n href: `${decodeURIComponent(\n resourceObjPath(obj, kind.kind),\n )}/copy?subjectIndex=${subjectIndex}`,\n // Only perform access checks when duplicating cluster role bindings.\n // It's not practical to check namespace role bindings since we don't know what namespace the user will pick in the form.\n accessReview: _.get(obj, 'metadata.namespace')\n ? null\n : {\n group: kind.apiGroup,\n resource: kind.plural,\n verb: 'create',\n },\n }),\n (kind, obj) => ({\n label: i18next.t('public~Edit {{kindLabel}} subject', {\n kindLabel: getKindLabel(kind),\n }),\n href: `${decodeURIComponent(\n resourceObjPath(obj, kind.kind),\n )}/edit?subjectIndex=${subjectIndex}`,\n accessReview: {\n group: kind.apiGroup,\n resource: kind.plural,\n name: obj.metadata.name,\n namespace: obj.metadata.namespace,\n verb: 'update',\n },\n }),\n subjects.length === 1\n ? Kebab.factory.Delete\n : (kind, binding) => ({\n label: i18next.t('public~Delete {{label}} subject', kind),\n callback: () =>\n confirmModal({\n title: i18next.t('public~Delete {{label}} subject', kind),\n message: i18next.t(\n 'public~Are you sure you want to delete subject {{name}} of type {{kind}}?',\n subject,\n ),\n btnText: i18next.t('public~Delete subject'),\n executeFn: () =>\n k8sPatch(kind, binding, [\n {\n op: 'remove',\n path: `/subjects/${subjectIndex}`,\n },\n ]),\n }),\n accessReview: {\n group: kind.apiGroup,\n resource: kind.plural,\n name: binding.metadata.name,\n namespace: binding.metadata.namespace,\n verb: 'patch',\n },\n }),\n ];\n\n if (subject.kind === 'User' || subject.kind === 'Group') {\n actions.unshift(() => ({\n label: i18next.t('public~Impersonate {{kind}} \"{{name}}\"', subject),\n callback: () => {\n startImpersonate(subject.kind, subject.name);\n navigate(window.SERVER_FLAGS.basePath);\n },\n // Must use API group authorization.k8s.io, NOT user.openshift.io\n // See https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation\n accessReview: {\n group: 'authorization.k8s.io',\n resource: subject.kind === 'Group' ? 'groups' : 'users',\n name: subject.name,\n verb: 'impersonate',\n },\n }));\n }\n\n return actions;\n};\n\nconst tableColumnClasses = [\n '',\n 'pf-m-hidden pf-m-visible-on-md',\n 'pf-m-hidden pf-m-visible-on-lg',\n 'pf-m-hidden pf-m-visible-on-xl',\n '',\n Kebab.columnClass,\n];\n\nconst RoleBindingsTableHeader = () => {\n return [\n {\n title: i18next.t('public~Name'),\n sortField: 'metadata.name',\n transforms: [sortable],\n props: { className: tableColumnClasses[0] },\n },\n {\n title: i18next.t('public~Role ref'),\n sortField: 'roleRef.name',\n transforms: [sortable],\n props: { className: tableColumnClasses[1] },\n },\n {\n title: i18next.t('public~Subject kind'),\n sortField: 'subject.kind',\n transforms: [sortable],\n props: { className: tableColumnClasses[2] },\n },\n {\n title: i18next.t('public~Subject name'),\n sortField: 'subject.name',\n transforms: [sortable],\n props: { className: tableColumnClasses[3] },\n },\n {\n title: i18next.t('public~Namespace'),\n sortField: 'metadata.namespace',\n transforms: [sortable],\n props: { className: tableColumnClasses[4] },\n },\n {\n title: '',\n props: { className: tableColumnClasses[5] },\n },\n ];\n};\nRoleBindingsTableHeader.displayName = 'RoleBindingsTableHeader';\n\nexport const BindingName = ({ binding }) => (\n <ResourceLink\n kind={bindingKind(binding)}\n name={binding.metadata.name}\n namespace={binding.metadata.namespace}\n />\n);\n\nexport const BindingKebab = connect(null, {\n startImpersonate: UIActions.startImpersonate,\n})(({ binding, startImpersonate }) => {\n const navigate = useNavigate();\n return binding.subjects ? (\n <ResourceKebab\n actions={menuActions(binding, startImpersonate, navigate)}\n kind={bindingKind(binding)}\n resource={binding}\n />\n ) : null;\n});\n\nexport const RoleLink = ({ binding }) => {\n const kind = binding.roleRef.kind;\n\n // Cluster Roles have no namespace and for Roles, the Role's namespace matches the Role Binding's namespace\n const ns = kind === 'ClusterRole' ? undefined : binding.metadata.namespace;\n return <ResourceLink kind={kind} name={binding.roleRef.name} namespace={ns} />;\n};\n\nconst RoleBindingsTableRow = ({ obj: binding }) => {\n return (\n <>\n <TableData className={tableColumnClasses[0]}>\n <BindingName binding={binding} />\n </TableData>\n <TableData className={classNames(tableColumnClasses[1], 'co-break-word')}>\n <RoleLink binding={binding} />\n </TableData>\n <TableData className={classNames(tableColumnClasses[2], 'co-break-word')}>\n {binding.subject.kind}\n </TableData>\n <TableData className={classNames(tableColumnClasses[3], 'co-break-word')}>\n {binding.subject.name}\n </TableData>\n <TableData className={classNames(tableColumnClasses[4], 'co-break-word')}>\n {binding.metadata.namespace ? (\n <ResourceLink kind=\"Namespace\" name={binding.metadata.namespace} />\n ) : (\n i18next.t('public~All namespaces')\n )}\n </TableData>\n <TableData className={tableColumnClasses[5]}>\n <BindingKebab binding={binding} />\n </TableData>\n </>\n );\n};\n\nconst EmptyMsg = () => {\n const { t } = useTranslation();\n return (\n <MsgBox\n title={t('public~No RoleBindings found')}\n detail={t(\n 'public~Roles grant access to types of objects in the cluster. Roles are applied to a group or user via a RoleBinding.',\n )}\n />\n );\n};\n\nexport const BindingsList = (props) => {\n const { t } = useTranslation();\n return (\n <Table\n aria-label={t('public~RoleBindings')}\n EmptyMsg={EmptyMsg}\n Header={RoleBindingsTableHeader}\n Row={RoleBindingsTableRow}\n virtualize\n {...props}\n />\n );\n};\n\nexport const bindingType = (binding) => {\n if (!binding) {\n return undefined;\n }\n if (binding.roleRef.name.startsWith('system:')) {\n return 'system';\n }\n return binding.metadata.namespace ? 'namespace' : 'cluster';\n};\n\nexport const RoleBindingsPage = ({\n namespace = undefined,\n showTitle = true,\n mock = false,\n staticFilters,\n name,\n kind,\n createPath = `/k8s/cluster/rolebindings/~new${\n name && kind ? `?subjectName=${encodeURIComponent(name)}&subjectKind=${kind}` : ''\n }`,\n hideLabelFilter = false,\n hideNameLabelFilters = false,\n hideColumnManagement = false,\n}) => {\n const { t } = useTranslation();\n const resources = useK8sWatchResources({\n RoleBinding: {\n kind: 'RoleBinding',\n namespaced: true,\n namespace,\n isList: true,\n },\n ClusterRoleBinding: {\n kind: 'ClusterRoleBinding',\n namespaced: false,\n isList: true,\n },\n });\n\n const data = React.useMemo(() => flatten(resources), [resources]);\n\n const loaded = Object.values(resources)\n .filter((r) => !r.loadError)\n .every((r) => r.loaded);\n\n const hasCRBindings =\n resources.ClusterRoleBinding.data?.length > 0 &&\n resources.ClusterRoleBinding.loaded &&\n !resources.ClusterRoleBinding.loadError;\n\n const rowFilters = React.useMemo(\n () => [\n {\n filterGroupName: t('public~Kind'),\n type: 'role-binding-kind',\n reducer: bindingType,\n filter: (filter, binding) =>\n filter.selected?.includes(bindingType(binding)) || !filter.selected?.length,\n items: hasCRBindings\n ? [\n {\n id: 'cluster',\n title: t('public~Cluster-wide RoleBindings'),\n },\n { id: 'namespace', title: t('public~Namespace RoleBindings') },\n { id: 'system', title: t('public~System RoleBindings') },\n ]\n : [\n { id: 'namespace', title: t('public~Namespace RoleBindings') },\n { id: 'system', title: t('public~System RoleBindings') },\n ],\n },\n ],\n [hasCRBindings, t],\n );\n\n const [staticData, filteredData, onFilterChange] = useListPageFilter(\n data,\n rowFilters,\n staticFilters,\n );\n\n return (\n <>\n <ListPageHeader title={showTitle ? t('public~RoleBindings') : undefined}>\n {!mock && (\n <ListPageCreateLink to={createPath}>{t('public~Create binding')}</ListPageCreateLink>\n )}\n </ListPageHeader>\n <ListPageBody>\n <ListPageFilter\n data={staticData}\n loaded={loaded}\n rowFilters={rowFilters}\n onFilterChange={onFilterChange}\n hideNameLabelFilters={hideNameLabelFilters}\n hideLabelFilter={hideLabelFilter}\n hideColumnManagement={hideColumnManagement}\n />\n <BindingsList\n data={filteredData}\n loaded={loaded}\n loadError={resources.RoleBinding.loadError}\n mock={mock}\n />\n </ListPageBody>\n </>\n );\n};\n\nconst NsRoleDropdown_ = (props) => {\n const openshiftFlag = props.flags[FLAGS.OPENSHIFT];\n if (flagPending(openshiftFlag)) {\n return null;\n }\n\n let kinds;\n if (props.fixed) {\n kinds = [props.selectedKeyKind];\n } else if (props.namespace) {\n kinds = ['Role', 'ClusterRole'];\n } else {\n kinds = ['ClusterRole'];\n }\n const resourceForKind = (kind) => ({ kind, namespace: kind === 'Role' ? props.namespace : null });\n const resources = _.map(kinds, resourceForKind);\n const { t } = props;\n\n return (\n <ListDropdown\n {...props}\n desc={t('public~Namespace roles (Role)')}\n resources={resources}\n placeholder={t('public~Select role name')}\n />\n );\n};\n\nconst NsRoleDropdown = connectToFlags(FLAGS.OPENSHIFT)(withTranslation()(NsRoleDropdown_));\n\nconst ClusterRoleDropdown = (props) => {\n const { t } = useTranslation();\n return (\n <ListDropdown\n {...props}\n desc={t('public~Cluster-wide roles (ClusterRole)')}\n resources={[{ kind: 'ClusterRole' }]}\n placeholder={t('public~Select role name')}\n />\n );\n};\n\nconst Section = ({ label, children }) => (\n <div>\n <div className=\"co-form-section__label\">{label}</div>\n <div className=\"co-form-subsection\">{children}</div>\n </div>\n);\n\nconst BaseEditRoleBinding = (props) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n\n const { fixed, saveButtonText } = props;\n\n const [data, setData] = React.useState({});\n const [inProgress, setInProgress] = React.useState(false);\n const [error, setError] = React.useState('');\n\n const subjectIndex = props.subjectIndex || 0;\n\n const existingData = _.pick(props.obj, [\n 'metadata.name',\n 'metadata.namespace',\n 'roleRef',\n 'subjects',\n ]);\n existingData.kind = props.kind;\n\n const { subjectKind, subjectName } = fixed.subjectRef || {};\n\n // constructor/didmount\n React.useEffect(() => {\n const obj = _.defaultsDeep({}, _.omit(fixed, 'subjectRef'), existingData, {\n apiVersion: 'rbac.authorization.k8s.io/v1',\n kind: 'RoleBinding',\n metadata: {\n name: '',\n },\n roleRef: {\n apiGroup: 'rbac.authorization.k8s.io',\n },\n subjects: [\n {\n kind: subjectKind || 'User',\n name: subjectName || '',\n apiGroup:\n subjectKind === 'ServiceAccount' || !subjectKind ? '' : 'rbac.authorization.k8s.io',\n },\n ],\n });\n setData(obj);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const getSubject = () => {\n return _.get(data, `subjects[${subjectIndex}]`);\n };\n\n const setSubject = (patch) => {\n const { kind, name, namespace } = Object.assign({}, getSubject(), patch);\n const obj = Object.assign({}, data);\n obj.subjects[subjectIndex] =\n kind === 'ServiceAccount'\n ? { kind, name, namespace }\n : { apiGroup: 'rbac.authorization.k8s.io', kind, name };\n setData(obj);\n };\n\n // substituting this.setData\n const updateData = (patch) => {\n setData((previous) => _.defaultsDeep({}, patch, previous));\n };\n\n const changeName = (e) => {\n updateData({ metadata: { name: e.target.value } });\n };\n\n const changeNamespace = (namespace) => {\n updateData({ metadata: { namespace } });\n };\n\n const changeRoleRef = (name, kindId) => {\n updateData({ roleRef: { name, kind: kindId } });\n };\n\n const changeSubjectKind = (e) => {\n setSubject({ kind: e.target.value });\n };\n\n const changeSubjectName = (e) => {\n setSubject({ name: e.target.value });\n };\n\n const changeSubjectNamespace = (namespace) => {\n setSubject({ namespace });\n };\n\n const setKind = (e) => {\n const kind = e.target.value;\n const patch = { kind };\n if (kind === 'ClusterRoleBinding') {\n patch.metadata = { namespace: null };\n }\n updateData(patch);\n };\n\n const subject = getSubject();\n\n const save = (e) => {\n e.preventDefault();\n\n const { kind, metadata, roleRef } = data;\n\n if (\n !kind ||\n !metadata.name ||\n !roleRef.kind ||\n !roleRef.name ||\n !subject.kind ||\n !subject.name ||\n (kind === 'RoleBinding' && !metadata.namespace) ||\n (subject.kind === 'ServiceAccount' && !subject.namespace)\n ) {\n setError(t('public~Please complete all fields.'));\n return;\n }\n\n setInProgress(true);\n\n const ko = kindObj(kind);\n (props.isCreate\n ? k8sCreate(ko, data)\n : k8sPatch(ko, { metadata }, [\n {\n op: 'replace',\n path: `/subjects/${subjectIndex}`,\n value: subject,\n },\n ])\n ).then(\n (obj) => {\n setInProgress(false);\n if (metadata.namespace) {\n props.setActiveNamespace(metadata.namespace);\n }\n navigate(resourceObjPath(obj, referenceFor(obj)));\n },\n (err) => {\n setError(err.message);\n setInProgress(false);\n },\n );\n };\n\n const RoleDropdown = data.kind === 'RoleBinding' ? NsRoleDropdown : ClusterRoleDropdown;\n\n const title = `${props.titleVerbAndKind}`;\n\n const isSubjectDisabled = fixed?.subjectRef?.subjectName ? true : false;\n\n const bindingKinds = [\n {\n value: 'RoleBinding',\n title: t('public~Namespace role binding (RoleBinding)'),\n desc: t(\n 'public~Grant the permissions to a user or set of users within the selected namespace.',\n ),\n },\n {\n value: 'ClusterRoleBinding',\n title: t('public~Cluster-wide role binding (ClusterRoleBinding)'),\n desc: t(\n 'public~Grant the permissions to a user or set of users at the cluster level and in all namespaces.',\n ),\n },\n ];\n\n const subjectKinds = [\n { value: 'User', title: t('public~User'), disabled: false },\n { value: 'Group', title: t('public~Group'), disabled: false },\n {\n value: 'ServiceAccount',\n title: t('public~ServiceAccount'),\n disabled: false,\n },\n ];\n\n return (\n <div className=\"co-m-pane__form\">\n <Helmet>\n <title>{title}</title>\n </Helmet>\n <PageHeading\n title={<div data-test=\"title\">{title}</div>}\n helpText={t(\n 'public~Associate a user/group to the selected role to define the type of access and resources that are allowed.',\n )}\n />\n <div className=\"co-m-pane__body\">\n <form className=\"co-m-pane__body-group\" onSubmit={save}>\n {!_.get(fixed, 'kind') && (\n <Section label={t('public~Binding type')}>\n <RadioGroup currentValue={data?.kind} items={bindingKinds} onChange={setKind} />\n </Section>\n )}\n\n <div className=\"co-form-section__separator\" />\n\n <Section label={t('public~RoleBinding')}>\n <div className=\"form-group\">\n <label htmlFor=\"role-binding-name\" className=\"co-required\">\n {t('public~Name')}\n </label>\n {_.get(fixed, 'metadata.name') ? (\n <ResourceName kind={data?.kind} name={data?.metadata?.name} />\n ) : (\n <input\n className=\"pf-v5-c-form-control\"\n type=\"text\"\n onChange={changeName}\n placeholder={t('public~RoleBinding name')}\n value={data?.metadata?.name}\n required\n id=\"role-binding-name\"\n data-test=\"role-binding-name\"\n />\n )}\n </div>\n {data?.kind === 'RoleBinding' && (\n <div className=\"form-group\" data-test=\"namespace-dropdown\">\n <label htmlFor=\"ns-dropdown\" className=\"co-required\">\n {t('public~Namespace')}\n </label>\n <NsDropdown\n fixed={!!_.get(fixed, 'metadata.namespace')}\n selectedKey={data?.metadata?.namespace}\n onChange={changeNamespace}\n id=\"ns-dropdown\"\n />\n </div>\n )}\n </Section>\n\n <div className=\"co-form-section__separator\" />\n\n <Section label={t('public~Role')}>\n <div className=\"form-group\" data-test=\"role-dropdown\">\n <label htmlFor=\"role-dropdown\" className=\"co-required\">\n {t('public~Role name')}\n </label>\n <RoleDropdown\n fixed={!!_.get(fixed, 'roleRef.name')}\n namespace={data?.metadata?.namespace}\n onChange={changeRoleRef}\n selectedKey={_.get(fixed, 'roleRef.name') || data?.roleRef?.name}\n selectedKeyKind={_.get(fixed, 'roleRef.kind') || data?.roleRef?.kind}\n id=\"role-dropdown\"\n />\n </div>\n </Section>\n\n <div className=\"co-form-section__separator\" />\n\n <Section label={t('public~Subject')}>\n <div className=\"form-group\">\n <RadioGroup\n currentValue={subject?.kind}\n items={subjectKinds.map((obj) => ({\n ...obj,\n disabled: isSubjectDisabled,\n }))}\n onChange={changeSubjectKind}\n />\n </div>\n {subject?.kind === 'ServiceAccount' && (\n <div className=\"form-group\">\n <label htmlFor=\"subject-namespace\" className=\"co-required\">\n {t('public~Subject namespace')}\n </label>\n <NsDropdown\n id=\"subject-namespace\"\n selectedKey={subject?.namespace}\n onChange={changeSubjectNamespace}\n />\n </div>\n )}\n <div className=\"form-group\">\n <label htmlFor=\"subject-name\" className=\"co-required\">\n {t('public~Subject name')}\n </label>\n <input\n className=\"pf-v5-c-form-control\"\n type=\"text\"\n onChange={changeSubjectName}\n placeholder={t('public~Subject name')}\n value={subject?.name}\n required\n id=\"subject-name\"\n disabled={isSubjectDisabled}\n data-test=\"subject-name\"\n />\n </div>\n </Section>\n\n <div className=\"co-form-section__separator\" />\n\n <ButtonBar errorMessage={error} inProgress={inProgress}>\n <ActionGroup className=\"pf-v5-c-form\">\n <Button type=\"submit\" id=\"save-changes\" variant=\"primary\" data-test=\"save-changes\">\n {saveButtonText || t('public~Create')}\n </Button>\n <Button onClick={() => navigate(-1)} id=\"cancel\" variant=\"secondary\">\n {t('public~Cancel')}\n </Button>\n </ActionGroup>\n </ButtonBar>\n </form>\n </div>\n </div>\n );\n};\n\nexport const CreateRoleBinding = () => {\n const params = useParams();\n const location = useLocation();\n const searchParams = new URLSearchParams(location.search);\n const roleKind = searchParams.get('rolekind');\n const roleName = searchParams.get('rolename');\n const subjectName = searchParams.get('subjectName');\n const subjectKind = searchParams.get('subjectKind');\n const [namespace, setActiveNamespace] = useActiveNamespace();\n const metadata = { namespace };\n const clusterAllowed = useAccessReview({\n group: ClusterRoleBindingModel.apiGroup,\n resource: ClusterRoleBindingModel.plural,\n verb: 'create',\n });\n const fixed = {\n kind: params.ns || roleKind === 'Role' || !clusterAllowed ? 'RoleBinding' : undefined,\n metadata: { namespace: params.ns },\n roleRef: { kind: roleKind, name: roleName },\n subjectRef: { subjectName, subjectKind },\n };\n const { t } = useTranslation();\n return (\n <BaseEditRoleBinding\n metadata={metadata}\n setActiveNamespace={setActiveNamespace}\n fixed={fixed}\n isCreate={true}\n titleVerbAndKind={t('public~Create RoleBinding')}\n />\n );\n};\n\nconst getSubjectIndex = () => {\n const subjectIndex = getQueryArgument('subjectIndex') || '0';\n return parseInt(subjectIndex, 10);\n};\n\nconst BindingLoadingWrapper = (props) => {\n const [, setActiveNamespace] = useActiveNamespace();\n const fixed = {};\n _.each(props.fixedKeys, (k) => (fixed[k] = _.get(props.obj.data, k)));\n return (\n <StatusBox {...props.obj}>\n <BaseEditRoleBinding\n {...props}\n obj={props.obj.data}\n setActiveNamespace={setActiveNamespace}\n fixed={fixed}\n />\n </StatusBox>\n );\n};\n\nexport const EditRoleBinding = ({ kind }) => {\n const { t } = useTranslation();\n const params = useParams();\n return (\n <Firehose\n resources={[{ kind, name: params.name, namespace: params.ns, isList: false, prop: 'obj' }]}\n >\n <BindingLoadingWrapper\n fixedKeys={['kind', 'metadata', 'roleRef']}\n subjectIndex={getSubjectIndex()}\n titleVerbAndKind={t('public~Edit RoleBinding')}\n saveButtonText={t('public~Save')}\n />\n </Firehose>\n );\n};\n\nexport const CopyRoleBinding = ({ kind }) => {\n const { t } = useTranslation();\n const params = useParams();\n return (\n <Firehose\n resources={[{ kind, name: params.name, namespace: params.ns, isList: false, prop: 'obj' }]}\n >\n <BindingLoadingWrapper\n isCreate={true}\n fixedKeys={['kind']}\n subjectIndex={getSubjectIndex()}\n titleVerbAndKind={t('public~Duplicate RoleBinding')}\n />\n </Firehose>\n );\n};\n","import { useEffect, useState } from 'react';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useSelector } from 'react-redux';\nimport { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';\nimport { ClusterVersionModel } from '@console/internal/models';\nimport { referenceForModel, ClusterVersionKind } from '@console/internal/module/k8s';\nimport { getFlagsObject } from '@console/internal/reducers/features';\nimport { RootState } from '@console/internal/redux';\nimport { FLAGS } from '../constants';\n\nconst getClusterVersionFlag = (state: RootState) => getFlagsObject(state)?.[FLAGS.CLUSTER_VERSION];\n\nexport const useClusterVersion = (): ClusterVersionKind => {\n const isClusterVersion = useSelector(getClusterVersionFlag);\n const resource = isClusterVersion\n ? { kind: referenceForModel(ClusterVersionModel), name: 'version', isList: false }\n : null;\n const [cvData, cvLoaded, cvLoadError] = useK8sWatchResource<ClusterVersionKind>(resource);\n return cvLoaded && !cvLoadError ? cvData : null;\n};\n\nexport const useOpenShiftVersion = (): string => {\n const [openshiftVersion, setOpenShiftVersion] = useState<string>();\n const clusterVersion = useClusterVersion();\n const version = clusterVersion?.status?.history?.[0]?.version;\n useEffect(() => {\n setOpenShiftVersion(version);\n }, [version]);\n return openshiftVersion;\n};\n","import { ExtensionK8sGroupModel } from '../api/common-types';\nimport { Extension, ExtensionDeclaration } from '../types';\n\nexport enum ModelBadge {\n DEV = 'dev',\n TECH = 'tech',\n}\n\n/** Customize the display of models by overriding values retrieved and generated through API discovery. */\nexport type ModelMetadata = ExtensionDeclaration<\n 'console.model-metadata',\n {\n /** The model to customize. May specify only a group, or optional version and kind. */\n model: ExtensionK8sGroupModel;\n /** Whether to consider this model reference as tech preview or dev preview. */\n badge?: ModelBadge;\n /** The color to associate to this model. */\n color?: string;\n /** Override the label. Requires `kind` be provided. */\n label?: string;\n /** Override the plural label. Requires `kind` be provided. */\n labelPlural?: string;\n /** Customize the abbreviation. Defaults to All uppercase chars in the kind up to 4 characters long. Requires `kind` be provided. */\n abbr?: string;\n }\n>;\n\n// Type guards\n\nexport const isModelMetadata = (e: Extension): e is ModelMetadata =>\n e.type === 'console.model-metadata';\n","import * as React from 'react';\nimport { StatusComponentProps } from '../../../extensions/console-types';\nimport PopoverStatus from './PopoverStatus';\nimport StatusIconAndText from './StatusIconAndText';\n\ntype GenericStatusProps = StatusComponentProps & {\n Icon: React.ComponentType<{ title?: string }>;\n popoverTitle?: string;\n noTooltip?: boolean;\n};\n\n/**\n * Component for a generic status popover\n * @param {string} [title] - (optional) status text\n * @param {boolean} [iconOnly] - (optional) if true, only displays icon\n * @param {boolean} [noTooltip] - (optional) if true, tooltip won't be displayed\n * @param {string} [className] - (optional) additional class name for the component\n * @param {string} [popoverTitle] - (optional) title for popover\n * @param {React.ComponentType} Icon - icon to be displayed\n * @param {ReactNode} [children] - (optional) children for the component\n * @example\n * ```tsx\n * <GenericStatus Icon={CircleIcon} />\n * ```\n */\nconst GenericStatus: React.FC<GenericStatusProps> = (props) => {\n const { Icon, children, popoverTitle, title, noTooltip, iconOnly, ...restProps } = props;\n const renderIcon = iconOnly && !noTooltip ? <Icon title={title} /> : <Icon />;\n const statusBody = (\n <StatusIconAndText\n {...restProps}\n noTooltip={noTooltip}\n title={title}\n iconOnly={iconOnly}\n icon={renderIcon}\n />\n );\n return React.Children.toArray(children).length ? (\n <PopoverStatus title={popoverTitle || title} {...restProps} statusBody={statusBody}>\n {children}\n </PopoverStatus>\n ) : (\n statusBody\n );\n};\n\nexport default GenericStatus;\n","import * as React from 'react';\nimport { InProgressIcon } from '@patternfly/react-icons';\nimport { StatusComponentProps } from '../../../extensions/console-types';\nimport GenericStatus from './GenericStatus';\nimport { RedExclamationCircleIcon, GreenCheckCircleIcon, BlueInfoCircleIcon } from './icons';\n\n/**\n * Component for displaying an error status popover.\n * @param {string} [title] - (optional) status text\n * @param {boolean} [iconOnly] - (optional) if true, only displays icon\n * @param {boolean} [noTooltip] - (optional) if true, tooltip is not displayed\n * @param {string} [className] - (optional) additional class name for the component\n * @param {string} [popoverTitle] - (optional) title for popover\n * @example\n * ```tsx\n * <ErrorStatus title={errorMsg} />\n * ```\n */\nexport const ErrorStatus: React.FC<StatusComponentProps> = (props) => (\n <GenericStatus {...props} Icon={RedExclamationCircleIcon} />\n);\nErrorStatus.displayName = 'ErrorStatus';\n\n/**\n * Component for displaying an information status popover.\n * @param {string} [title] - (optional) status text\n * @param {boolean} [iconOnly] - (optional) if true, only displays icon\n * @param {boolean} [noTooltip] - (optional) if true, tooltip is not displayed\n * @param {string} [className] - (optional) additional class name for the component\n * @param {string} [popoverTitle] - (optional) title for popover\n * @example\n * ```tsx\n * <InfoStatus title={infoMsg} />\n * ```\n */\nexport const InfoStatus: React.FC<StatusComponentProps> = (props) => (\n <GenericStatus {...props} Icon={BlueInfoCircleIcon} />\n);\nInfoStatus.displayName = 'InfoStatus';\n\n/**\n * Component for displaying a progressing status popover.\n * @param {string} [title] - (optional) status text\n * @param {boolean} [iconOnly] - (optional) if true, only displays icon\n * @param {boolean} [noTooltip] - (optional) if true, tooltip is not displayed\n * @param {string} [className] - (optional) additional class name for the component\n * @param {string} [popoverTitle] - (optional) title for popover\n * @example\n * ```tsx\n * <ProgressStatus title={progressMsg} />\n * ```\n */\nexport const ProgressStatus: React.FC<StatusComponentProps> = (props) => (\n <GenericStatus {...props} Icon={InProgressIcon} />\n);\nProgressStatus.displayName = 'ProgressStatus';\n\n/**\n * Component for displaying a success status popover.\n * @param {string} [title] - (optional) status text\n * @param {boolean} [iconOnly] - (optional) if true, only displays icon\n * @param {boolean} [noTooltip] - (optional) if true, tooltip is not displayed\n * @param {string} [className] - (optional) additional class name for the component\n * @param {string} [popoverTitle] - (optional) title for popover\n * @example\n * ```tsx\n * <SuccessStatus title={successMsg} />\n * ```\n */\nexport const SuccessStatus: React.FC<StatusComponentProps> = (props) => (\n <GenericStatus {...props} Icon={GreenCheckCircleIcon} />\n);\nSuccessStatus.displayName = 'SuccessStatus';\n","import { ONE_HOUR, ONE_DAY } from './time';\n\nexport enum DurationKeys {\n OneHour = 'OneHour',\n SixHours = 'SixHours',\n TwentyFourHours = 'TwentyFourHours',\n}\n\nexport const DURATION_VALUES = {\n [DurationKeys.OneHour]: ONE_HOUR,\n [DurationKeys.SixHours]: 6 * ONE_HOUR,\n [DurationKeys.TwentyFourHours]: ONE_DAY,\n};\n\nexport const DEFAULT_DURATION_KEY = DurationKeys.OneHour;\nexport const DEFAULT_DURATION = DURATION_VALUES[DEFAULT_DURATION_KEY];\n\nexport const TOAST_TIMEOUT_LONG = 20000;\nexport const TOAST_TIMEOUT_DEFAULT = true;\n","import * as React from 'react';\nimport {\n Button,\n Divider,\n EmptyState,\n EmptyStateBody,\n Menu,\n MenuContent,\n MenuFooter,\n MenuGroup,\n MenuSearch,\n MenuSearchInput,\n MenuItem,\n MenuList,\n Switch,\n TextInput,\n EmptyStateActions,\n EmptyStateHeader,\n EmptyStateFooter,\n} from '@patternfly/react-core';\nimport fuzzysearch from 'fuzzysearch';\nimport { useTranslation } from 'react-i18next';\nimport { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';\nimport { ProjectModel, NamespaceModel } from '@console/internal/models';\nimport { K8sResourceKind } from '@console/internal/module/k8s';\nimport {\n useUserSettingsCompatibility,\n ALL_NAMESPACES_KEY,\n NAMESPACE_USERSETTINGS_PREFIX,\n NAMESPACE_LOCAL_STORAGE_KEY,\n alphanumericCompare,\n} from '@console/shared';\nimport { FLAGS } from '@console/shared/src/constants';\nimport { useFlag } from '@console/shared/src/hooks/flag';\nimport { isSystemNamespace } from './filters';\nimport NamespaceMenuToggle from './NamespaceMenuToggle';\nimport './NamespaceDropdown.scss';\n\nexport const NoResults: React.FC<{\n isProjects: boolean;\n onClear: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;\n}> = ({ isProjects, onClear }) => {\n const { t } = useTranslation();\n return (\n <>\n <Divider />\n <EmptyState>\n <EmptyStateHeader\n titleText={\n <>\n {isProjects\n ? t('console-shared~No projects found')\n : t('console-shared~No namespaces found')}\n </>\n }\n headingLevel=\"h4\"\n />\n <EmptyStateBody>{t('console-shared~No results match the filter criteria.')}</EmptyStateBody>\n <EmptyStateFooter>\n <EmptyStateActions>\n <Button\n variant=\"link\"\n onClick={onClear}\n className=\"co-namespace-selector__clear-filters\"\n >\n {t('console-shared~Clear filters')}\n </Button>\n </EmptyStateActions>\n </EmptyStateFooter>\n </EmptyState>\n </>\n );\n};\n\n/* ****************************************** */\n\nexport const Filter: React.FC<{\n filterRef: React.Ref<any>;\n onFilterChange: (filterText: string) => void;\n filterText: string;\n isProject: boolean;\n}> = ({ filterText, filterRef, onFilterChange, isProject }) => {\n const { t } = useTranslation();\n return (\n <MenuSearch>\n <MenuSearchInput>\n <TextInput\n data-test=\"dropdown-text-filter\"\n autoFocus\n value={filterText}\n aria-label={\n isProject\n ? t('console-shared~Select project...')\n : t('console-shared~Select namespace...')\n }\n type=\"search\"\n placeholder={\n isProject\n ? t('console-shared~Select project...')\n : t('console-shared~Select namespace...')\n }\n onChange={(_, value: string) => onFilterChange(value)}\n ref={filterRef}\n />\n </MenuSearchInput>\n </MenuSearch>\n );\n};\n\n/* ****************************************** */\n\nconst SystemSwitch: React.FC<{\n hasSystemNamespaces: boolean;\n isProject: boolean;\n isChecked: boolean;\n onChange: (isChecked: boolean) => void;\n}> = ({ hasSystemNamespaces, isProject, isChecked, onChange }) => {\n const { t } = useTranslation();\n return hasSystemNamespaces ? (\n <>\n <Divider />\n <MenuSearch>\n <MenuSearchInput>\n <Switch\n data-test=\"showSystemSwitch\"\n data-checked-state={isChecked}\n label={\n isProject\n ? t('console-shared~Show default projects')\n : t('console-shared~Show default namespaces')\n }\n isChecked={isChecked}\n onChange={(_, value) => onChange(value)}\n className=\"pf-v5-c-select__menu-item pf-m-action co-namespace-dropdown__switch\"\n />\n </MenuSearchInput>\n </MenuSearch>\n </>\n ) : null;\n};\n\n/* ****************************************** */\n\nexport const NamespaceGroup: React.FC<{\n isProjects: boolean;\n isFavorites?: boolean;\n options: { key: string; title: string }[];\n selectedKey: string;\n favorites?: { [key: string]: boolean }[];\n canFavorite?: boolean;\n}> = ({ isProjects, isFavorites, options, selectedKey, favorites, canFavorite = true }) => {\n const { t } = useTranslation();\n let label = isProjects ? t('console-shared~Projects') : t('console-shared~Namespaces');\n if (isFavorites) {\n label = t('console-shared~Favorites');\n }\n\n return options.length === 0 ? null : (\n <>\n <Divider />\n <MenuGroup label={label}>\n <MenuList>\n {options.map((option) => {\n return (\n <MenuItem\n key={option.key}\n itemId={option.key}\n isFavorited={canFavorite ? !!favorites?.[option.key] : undefined}\n isSelected={selectedKey === option.key}\n data-test=\"dropdown-menu-item-link\"\n >\n {option.title}\n </MenuItem>\n );\n })}\n </MenuList>\n </MenuGroup>\n </>\n );\n};\n\n/* ****************************************** */\n\n// The items in the footer are not accessible via the keyboard.\n// This is being tracked in: https://github.com/patternfly/patternfly-react/issues/6031\n\nexport const Footer: React.FC<{\n canCreateNew: boolean;\n isProject?: boolean;\n setOpen: (isOpen: boolean) => void;\n onCreateNew: () => void;\n}> = ({ canCreateNew, isProject, setOpen, onCreateNew }) => {\n const { t } = useTranslation();\n return (\n <>\n {canCreateNew ? (\n <MenuFooter className=\"co-namespace-dropdown__footer\">\n {\n <Button\n variant=\"secondary\"\n onClick={() => {\n setOpen(false);\n onCreateNew();\n }}\n data-test-dropdown-menu=\"#CREATE_RESOURCE_ACTION#\"\n >\n {isProject\n ? t('console-shared~Create Project')\n : t('console-shared~Create Namespace')}\n </Button>\n }\n </MenuFooter>\n ) : null}\n </>\n );\n};\n\n/* ****************************************** */\n\nconst NamespaceMenu: React.FC<{\n setOpen: (isOpen: boolean) => void;\n onSelect: (event: React.MouseEvent, itemId: string) => void;\n selected?: string;\n isProjects: boolean;\n allNamespacesTitle: string;\n onCreateNew: () => void;\n menuRef: React.MutableRefObject<HTMLDivElement>;\n}> = ({ setOpen, onSelect, selected, isProjects, allNamespacesTitle, onCreateNew, menuRef }) => {\n const filterRef = React.useRef(null);\n\n const [filterText, setFilterText] = React.useState('');\n\n // Bookmarking / favorites (note in <= 4.8 this feature was known as bookmarking)\n const favoritesUserSettingsKey = `${NAMESPACE_USERSETTINGS_PREFIX}.bookmarks`;\n const systemNamespacesSettingsKey = `${NAMESPACE_USERSETTINGS_PREFIX}.systemNamespace`;\n const favoriteStorageKey = `${NAMESPACE_LOCAL_STORAGE_KEY}-bookmarks`;\n const systemNamespaceKey = `${NAMESPACE_LOCAL_STORAGE_KEY}-systemNamespace`;\n const [favorites, setFavorites] = useUserSettingsCompatibility(\n favoritesUserSettingsKey,\n favoriteStorageKey,\n undefined,\n true,\n );\n\n const canList: boolean = useFlag(FLAGS.CAN_LIST_NS);\n const canCreate: boolean = useFlag(isProjects ? FLAGS.CAN_CREATE_PROJECT : FLAGS.CAN_CREATE_NS);\n const [options, optionsLoaded] = useK8sWatchResource<K8sResourceKind[]>({\n isList: true,\n kind: isProjects ? ProjectModel.kind : NamespaceModel.kind,\n optional: true,\n });\n\n const optionItems = React.useMemo(() => {\n if (!optionsLoaded) {\n return [];\n }\n const items = options.map((item) => {\n const { name } = item.metadata;\n return { title: name, key: name };\n });\n if (!items.some((option) => option.title === selected) && selected !== ALL_NAMESPACES_KEY) {\n items.push({ title: selected, key: selected }); // Add current namespace if it isn't included\n }\n items.sort((a, b) => alphanumericCompare(a.title, b.title));\n\n if (canList) {\n items.unshift({ title: allNamespacesTitle, key: ALL_NAMESPACES_KEY });\n }\n return items;\n }, [allNamespacesTitle, canList, options, optionsLoaded, selected]);\n\n const hasSystemNamespaces = React.useMemo(\n () => optionItems.some((option) => isSystemNamespace(option)),\n [optionItems],\n );\n\n const onSetFavorite = React.useCallback(\n (key, active) => {\n setFavorites((oldFavorites) => ({\n ...oldFavorites,\n [key]: active ? true : undefined,\n }));\n },\n [setFavorites],\n );\n\n const [systemNamespaces, setSystemNamespaces] = useUserSettingsCompatibility(\n systemNamespacesSettingsKey,\n systemNamespaceKey,\n false,\n true,\n );\n\n const isFavorite = React.useCallback((option) => !!favorites?.[option.key], [favorites]);\n\n const isOptionShown = React.useCallback(\n (option, checkIsFavorite: boolean) => {\n const containsFilterText = fuzzysearch(filterText.toLowerCase(), option.title.toLowerCase());\n\n if (checkIsFavorite) {\n return containsFilterText && isFavorite(option);\n }\n return (\n containsFilterText &&\n (systemNamespaces || !isSystemNamespace(option)) &&\n (!checkIsFavorite || isFavorite(option))\n );\n },\n [filterText, isFavorite, systemNamespaces],\n );\n\n const { filteredOptions, filteredFavorites } = React.useMemo(\n () =>\n optionItems.reduce(\n (filtered, option) => {\n if (isOptionShown(option, false)) {\n filtered.filteredOptions.push(option);\n }\n if (isOptionShown(option, true)) {\n filtered.filteredFavorites.push(option);\n }\n return filtered;\n },\n { filteredOptions: [], filteredFavorites: [] },\n ),\n [isOptionShown, optionItems],\n );\n\n return (\n <Menu\n className=\"co-namespace-dropdown__menu\"\n ref={menuRef}\n onSelect={(event: React.MouseEvent, itemId: string) => {\n setOpen(false);\n onSelect(event, itemId);\n }}\n onActionClick={(event: React.MouseEvent, itemID: string) => {\n const isCurrentFavorite = favorites?.[itemID];\n onSetFavorite(itemID, !isCurrentFavorite);\n }}\n activeItemId={selected}\n data-test=\"namespace-dropdown-menu\"\n isScrollable\n >\n <MenuContent maxMenuHeight=\"60vh\">\n <Filter\n filterRef={filterRef}\n onFilterChange={setFilterText}\n filterText={filterText}\n isProject={isProjects}\n />\n {filteredOptions.length === 0 ? (\n <NoResults\n isProjects={isProjects}\n onClear={(event) => {\n event.preventDefault();\n event.stopPropagation();\n setFilterText('');\n filterRef.current?.focus();\n }}\n />\n ) : null}\n <NamespaceGroup\n isProjects={isProjects}\n isFavorites\n options={filteredFavorites}\n selectedKey={selected}\n favorites={favorites}\n />\n <SystemSwitch\n hasSystemNamespaces={hasSystemNamespaces}\n isProject={isProjects}\n isChecked={systemNamespaces}\n onChange={setSystemNamespaces}\n />\n <NamespaceGroup\n isProjects={isProjects}\n options={filteredOptions}\n selectedKey={selected}\n favorites={favorites}\n />\n </MenuContent>\n <Footer\n canCreateNew={canCreate}\n isProject={isProjects}\n onCreateNew={onCreateNew}\n setOpen={setOpen}\n />\n </Menu>\n );\n};\n\n/* ****************************************** */\n\nconst NamespaceDropdown: React.FC<NamespaceDropdownProps> = ({\n disabled,\n isProjects,\n onSelect,\n selected,\n onCreateNew,\n shortCut,\n}) => {\n const { t } = useTranslation();\n const menuRef = React.useRef(null);\n const [isOpen, setOpen] = React.useState(false);\n const allNamespacesTitle = isProjects\n ? t('console-shared~All Projects')\n : t('console-shared~All Namespaces');\n\n const title = selected === ALL_NAMESPACES_KEY ? allNamespacesTitle : selected;\n\n const menuProps = {\n setOpen,\n onSelect,\n selected,\n isProjects,\n allNamespacesTitle,\n onCreateNew,\n menuRef,\n children: <></>,\n };\n\n return (\n <div className=\"co-namespace-dropdown\">\n <NamespaceMenuToggle\n disabled={disabled}\n menu={<NamespaceMenu {...menuProps} />}\n menuRef={menuRef}\n isOpen={isOpen}\n title={`${\n isProjects ? t('console-shared~Project') : t('console-shared~Namespace')\n }: ${title}`}\n onToggle={(menuState) => {\n setOpen(menuState);\n }}\n shortCut={shortCut}\n />\n </div>\n );\n};\n\ntype NamespaceDropdownProps = {\n disabled?: boolean;\n isProjects?: boolean; // Does this drop down contain projects. If not, assuming namespaces\n onSelect?: (event: React.MouseEvent | React.ChangeEvent, value: string) => void;\n onCreateNew?: () => void;\n shortCut?: string;\n selected?: string;\n};\n\nexport default NamespaceDropdown;\n","export * from './add-event-source';\nexport * from './add-trigger';\nexport * from './add-subscription';\nexport * from './sink-source';\nexport * from './knatify';\n","import * as React from 'react';\nimport * as PropTypes from 'prop-types';\nimport {\n Brand,\n Masthead as PfMasthead,\n MastheadBrand,\n MastheadContent,\n MastheadMain,\n MastheadToggle,\n PageToggleButton,\n} from '@patternfly/react-core';\nimport { BarsIcon } from '@patternfly/react-icons/dist/esm/icons/bars-icon';\nimport { useNavigate } from 'react-router-dom-v5-compat';\n\nimport { MastheadToolbar } from './masthead-toolbar';\nimport okdLogoImg from '../imgs/okd-logo.svg';\nimport openshiftLogoImg from '../imgs/openshift-logo.svg';\nimport onlineLogoImg from '../imgs/openshift-online-logo.svg';\nimport dedicatedLogoImg from '../imgs/openshift-dedicated-logo.svg';\nimport rosaLogoImg from '../imgs/openshift-service-on-aws-logo.svg';\n\nexport const getBrandingDetails = () => {\n let logoImg, productName;\n // Webpack won't bundle these images if we don't directly reference them, hence the switch\n switch (window.SERVER_FLAGS.branding) {\n case 'openshift':\n logoImg = openshiftLogoImg;\n productName = 'Red Hat OpenShift';\n break;\n case 'ocp':\n logoImg = openshiftLogoImg;\n productName = 'Red Hat OpenShift';\n break;\n case 'online':\n logoImg = onlineLogoImg;\n productName = 'Red Hat OpenShift Online';\n break;\n case 'dedicated':\n logoImg = dedicatedLogoImg;\n productName = 'Red Hat OpenShift Dedicated';\n break;\n case 'azure':\n logoImg = openshiftLogoImg;\n productName = 'Azure Red Hat OpenShift';\n break;\n case 'rosa':\n logoImg = rosaLogoImg;\n productName = 'Red Hat OpenShift Service on AWS';\n break;\n default:\n logoImg = okdLogoImg;\n productName = 'OKD';\n }\n if (window.SERVER_FLAGS.customLogoURL) {\n logoImg = window.SERVER_FLAGS.customLogoURL;\n }\n if (window.SERVER_FLAGS.customProductName) {\n productName = window.SERVER_FLAGS.customProductName;\n }\n return { logoImg, productName };\n};\n\nexport const Masthead = React.memo(({ isMastheadStacked, isNavOpen, onNavToggle }) => {\n const details = getBrandingDetails();\n const navigate = useNavigate();\n const defaultRoute = '/';\n const logoProps = {\n href: defaultRoute,\n // use onClick to prevent browser reload\n onClick: (e) => {\n e.preventDefault();\n navigate(defaultRoute);\n },\n };\n\n return (\n <PfMasthead id=\"page-main-header\" display={{ default: isMastheadStacked ? 'stack' : 'inline' }}>\n <MastheadToggle>\n <PageToggleButton onSidebarToggle={onNavToggle} isSidebarOpen={isNavOpen}>\n <BarsIcon />\n </PageToggleButton>\n </MastheadToggle>\n <MastheadMain>\n <MastheadBrand component=\"a\" {...logoProps}>\n <Brand src={details.logoImg} alt={details.productName} data-test=\"brand-image\" />\n </MastheadBrand>\n </MastheadMain>\n <MastheadContent>\n <MastheadToolbar isMastheadStacked={isMastheadStacked} />\n </MastheadContent>\n </PfMasthead>\n );\n});\n\nMasthead.propTypes = {\n isMastheadStacked: PropTypes.bool,\n isNavOpen: PropTypes.bool,\n onNavToggle: PropTypes.func,\n};\n","import { AngleDoubleDownIcon } from '@patternfly/react-icons/dist/esm/icons/angle-double-down-icon';\nimport { AngleDoubleUpIcon } from '@patternfly/react-icons/dist/esm/icons/angle-double-up-icon';\nimport { CriticalRiskIcon } from '@patternfly/react-icons/dist/esm/icons/critical-risk-icon';\nimport { EqualsIcon } from '@patternfly/react-icons/dist/esm/icons/equals-icon';\nimport { global_palette_blue_300 as blue300 } from '@patternfly/react-tokens/dist/js/global_palette_blue_300';\nimport { global_palette_blue_50 as blue50 } from '@patternfly/react-tokens/dist/js/global_palette_blue_50';\nimport { global_palette_gold_400 as gold400 } from '@patternfly/react-tokens/dist/js/global_palette_gold_400';\nimport { global_palette_orange_300 as orange300 } from '@patternfly/react-tokens/dist/js/global_palette_orange_300';\nimport { global_palette_red_200 as red200 } from '@patternfly/react-tokens/dist/js/global_palette_red_200';\nimport * as _ from 'lodash';\nimport { PrometheusResponse } from '@console/internal/components/graphs';\n\nexport const riskIcons = {\n low: AngleDoubleDownIcon,\n moderate: EqualsIcon,\n important: AngleDoubleUpIcon,\n critical: CriticalRiskIcon,\n};\n\nexport const colorScale = [red200.value, orange300.value, gold400.value, blue50.value];\n\nexport const legendColorScale = {\n low: blue300.value,\n moderate: gold400.value,\n important: orange300.value,\n critical: red200.value,\n};\n\nexport const riskSorting = {\n low: 0,\n moderate: 1,\n important: 2,\n critical: 3,\n};\n\ntype Metrics = {\n critical?: number;\n important?: number;\n low?: number;\n moderate?: number;\n};\n\ntype Conditions = {\n Available?: number;\n Degraded?: number;\n Disabled?: number;\n Progressing?: number;\n UploadDegraded?: number;\n};\n\nexport const mapMetrics = (response: PrometheusResponse): Metrics => {\n const values: Metrics = {};\n for (let i = 0; i < response?.data.result.length; i++) {\n const value = response.data?.result?.[i]?.value?.[1];\n if (_.isNil(value)) {\n return null;\n }\n const metricName = response.data?.result?.[i]?.metric?.metric;\n if (values[metricName] === -1 || values[metricName] === undefined) {\n values[metricName] = parseInt(value, 10);\n }\n }\n\n return values;\n};\n\nexport const mapConditions = (response: PrometheusResponse): Conditions =>\n response?.data?.result && Array.isArray(response.data.result)\n ? response.data.result.reduce((prev, cur) => {\n if (cur?.metric?.condition && cur?.value?.[1]) {\n prev[cur.metric.condition] = parseInt(cur.value[1], 10);\n }\n return prev;\n }, {})\n : {};\n\n// An error occurred while requesting Insights results (e.g. IO is turned off)\nexport const isError = (values: Metrics) => _.isEmpty(values);\n\n// Insights Operator has been just initialized and waiting for the first results\nexport const isWaiting = (values: Metrics) =>\n Object.values(values).some((cur: number) => cur === -1);\n\nexport const errorUpload = (conditions: Conditions) =>\n !!conditions.Degraded && !!conditions.UploadDegraded;\n","import * as _ from 'lodash';\nimport { K8sResourceKind, referenceFor } from '@console/internal/module/k8s';\nimport { useK8sModel } from '../hooks/useK8sModel';\n\nexport enum ResourceUtilizationQuery {\n MEMORY = 'MEMORY',\n CPU = 'CPU',\n FILESYSTEM = 'FILESYSTEM',\n NETWORK_IN = 'NETWORK_IN',\n NETWORK_OUT = 'NETWORK_OUT',\n QUOTA_LIMIT = 'QUOTA_LIMIT',\n QUOTA_REQUEST = 'QUOTA_REQUEST',\n}\n\nconst podMetricsQueries = {\n [ResourceUtilizationQuery.MEMORY]: _.template(\n \"sum(container_memory_working_set_bytes{pod='<%= name %>',container=''}) BY (pod)\",\n ),\n [ResourceUtilizationQuery.CPU]: _.template(\"pod:container_cpu_usage:sum{pod='<%= name %>'}\"),\n [ResourceUtilizationQuery.FILESYSTEM]: _.template(\n \"pod:container_fs_usage_bytes:sum{pod='<%= name %>'}\",\n ),\n [ResourceUtilizationQuery.NETWORK_IN]: _.template(\n \"pod_interface_network:container_network_receive_bytes:irate5m{pod='<%= name %>'}\",\n ),\n [ResourceUtilizationQuery.NETWORK_OUT]: _.template(\n \"pod_interface_network:container_network_transmit_bytes_total:irate5m{pod='<%= name %>'}\",\n ),\n [ResourceUtilizationQuery.QUOTA_LIMIT]: _.template(\n \"sum by (pod, resource) (kube_pod_resource_limit{resource='<%= resource %>',pod='<%= name %>'})\",\n ),\n [ResourceUtilizationQuery.QUOTA_REQUEST]: _.template(\n \"sum by (pod, resource) (kube_pod_resource_request{resource='<%= resource %>',pod='<%= name %>'})\",\n ),\n};\n\nconst podControllerMetricsQueries = {\n [ResourceUtilizationQuery.MEMORY]: _.template(\n \"sum(container_memory_working_set_bytes{container!=''} * on(pod) group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{workload='<%= name %>', workload_type='<%= type %>'}) by (pod)\",\n ),\n [ResourceUtilizationQuery.CPU]: _.template(\n \"sum(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{} * on(pod) group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{workload='<%= name %>', workload_type='<%= type %>'}) by (pod)\",\n ),\n [ResourceUtilizationQuery.FILESYSTEM]: _.template(\n \"sum(pod:container_fs_usage_bytes:sum * on(pod) group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{workload='<%= name %>', workload_type='<%= type %>'}) by (pod)\",\n ),\n [ResourceUtilizationQuery.NETWORK_IN]: _.template(\n \"sum(irate(container_network_receive_bytes_total[5m]) * on (pod) group_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{workload='<%= name %>', workload_type='<%= type %>'}) by (pod)\",\n ),\n [ResourceUtilizationQuery.NETWORK_OUT]: _.template(\n \"sum(irate(container_network_transmit_bytes_total[5m]) * on (pod) group_left(workload,workload_type) namespace_workload_pod:kube_pod_owner:relabel{workload='<%= name %>', workload_type='<%= type %>'}) by (pod)\",\n ),\n};\n\nexport const getPodMetricsQueries = (name: string): { [key: string]: string[] } => ({\n [ResourceUtilizationQuery.MEMORY]: [\n podMetricsQueries[ResourceUtilizationQuery.MEMORY]({ name }),\n podMetricsQueries[ResourceUtilizationQuery.QUOTA_LIMIT]({ name, resource: 'memory' }),\n podMetricsQueries[ResourceUtilizationQuery.QUOTA_REQUEST]({ name, resource: 'memmory' }),\n ],\n [ResourceUtilizationQuery.CPU]: [\n podMetricsQueries[ResourceUtilizationQuery.CPU]({ name }),\n podMetricsQueries[ResourceUtilizationQuery.QUOTA_LIMIT]({ name, resource: 'cpu' }),\n podMetricsQueries[ResourceUtilizationQuery.QUOTA_REQUEST]({ name, resource: 'cpu' }),\n ],\n [ResourceUtilizationQuery.FILESYSTEM]: [\n podMetricsQueries[ResourceUtilizationQuery.FILESYSTEM]({ name }),\n ],\n [ResourceUtilizationQuery.NETWORK_IN]: [\n podMetricsQueries[ResourceUtilizationQuery.NETWORK_IN]({ name }),\n ],\n [ResourceUtilizationQuery.NETWORK_OUT]: [\n podMetricsQueries[ResourceUtilizationQuery.NETWORK_OUT]({ name }),\n ],\n});\n\nexport const getPodControllerMetricsQueries = (\n name: string,\n type: string,\n): { [key: string]: string[] } => ({\n [ResourceUtilizationQuery.MEMORY]: [\n podControllerMetricsQueries[ResourceUtilizationQuery.MEMORY]({ name, type }),\n ],\n [ResourceUtilizationQuery.CPU]: [\n podControllerMetricsQueries[ResourceUtilizationQuery.CPU]({ name, type }),\n ],\n [ResourceUtilizationQuery.FILESYSTEM]: [\n podControllerMetricsQueries[ResourceUtilizationQuery.FILESYSTEM]({ name, type }),\n ],\n [ResourceUtilizationQuery.NETWORK_IN]: [\n podControllerMetricsQueries[ResourceUtilizationQuery.NETWORK_IN]({ name, type }),\n ],\n [ResourceUtilizationQuery.NETWORK_OUT]: [\n podControllerMetricsQueries[ResourceUtilizationQuery.NETWORK_OUT]({ name, type }),\n ],\n});\n\nexport const useResourceMetricsQueries = (obj: K8sResourceKind): { [key: string]: string[] } => {\n const [model] = useK8sModel(referenceFor(obj));\n if (model) {\n return model.id === 'pod'\n ? getPodMetricsQueries(obj.metadata.name)\n : getPodControllerMetricsQueries(obj.metadata.name, model.id);\n }\n return null;\n};\n","export const IDEAL_CELL_WIDTH = 260;\nexport const IDEAL_SPACE_BW_TILES = 25;\nexport const HEADER_FIXED_HEIGHT = 30;\nexport const OVERSCAN_ROW_COUNT = 6;\nexport const DEFAULT_CELL_HEIGHT = 250;\nexport const ESTIMATED_ROW_SIZE = 270;\n","import { applyCodeRefSymbol } from '@console/dynamic-plugin-sdk/src/coderefs/coderef-resolver';\n\nexport const eventSourceBreadcrumbsProvider = applyCodeRefSymbol(() =>\n import(\n './useEventSourceDetailPageBreadcrumbs' /* webpackChunkName: \"event-source-breadcrumbs-provider\" */\n ).then((m) => m.useEventSourceDetailPageBreadcrumbs),\n);\n\nexport const eventSourceModelsProviderForBreadcrumbs = applyCodeRefSymbol(() =>\n import(\n './useEventSourceDetailPageBreadcrumbs' /* webpackChunkName: \"event-source-models-provider-breadcrumbs\" */\n ).then((m) => m.getEventSourceModelsForBreadcrumbs),\n);\n\nexport const channelBreadcrumbsProvider = applyCodeRefSymbol(() =>\n import(\n './useChannelDetailPageBreadcrumbs' /* webpackChunkName: \"channel-breadcrumbs-provider\" */\n ).then((m) => m.useChannelDetailPageBreadcrumbs),\n);\n\nexport const channelModelsProviderForBreadcrumbs = applyCodeRefSymbol(() =>\n import(\n '../utils/fetch-dynamic-eventsources-utils' /* webpackChunkName: \"channel-models-provider-breadcrumbs\" */\n ).then((m) => m.getChannelModels),\n);\n\nexport const brokerBreadcrumbsProvider = applyCodeRefSymbol(() =>\n import(\n './useBrokerDetailPageBreadcrumbs' /* webpackChunkName: \"broker-breadcrumbs-provider\" */\n ).then((m) => m.useBrokerDetailPageBreadcrumbs),\n);\n\nexport const brokerModelProviderForBreadcrumbs = applyCodeRefSymbol(() =>\n import(\n './useBrokerDetailPageBreadcrumbs' /* webpackChunkName: \"broker-model-provider-breadcrumbs\" */\n ).then((m) => m.getBrokerModel),\n);\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { Helmet } from 'react-helmet';\nimport { useParams, useLocation } from 'react-router-dom-v5-compat';\nimport { getBadgeFromType, getTitleForNodeKind } from '@console/shared';\nimport { PageTitleContext } from '@console/shared/src/components/pagetitle/PageTitleContext';\nimport { connectToPlural } from '../kinds';\nimport { ErrorPage404 } from './error';\nimport { withStartGuide } from './start-guide';\nimport { AsyncComponent, LoadingBox } from './utils';\nimport { DefaultPage, DefaultDetailsPage } from './default-resource';\nimport { getResourceListPages, getResourceDetailsPages } from './resource-pages';\nimport {\n apiVersionForReference,\n isGroupVersionKind,\n K8sKind,\n K8sResourceKindReference,\n kindForReference,\n referenceForExtensionModel,\n referenceForModel,\n} from '../module/k8s';\nimport {\n useExtensions,\n isResourceDetailsPage,\n ResourceDetailsPage as ResourceDetailsPageExt,\n ResourceListPage as ResourceListPageExt,\n isResourceListPage,\n} from '@console/plugin-sdk';\nimport {\n ResourceDetailsPage as DynamicResourceDetailsPage,\n isResourceDetailsPage as isDynamicResourceDetailsPage,\n ResourceListPage as DynamicResourceListPage,\n isResourceListPage as isDynamicResourceListPage,\n} from '@console/dynamic-plugin-sdk';\n\n// Parameters can be in pros.params (in URL) or in props.route (attribute of Route tag)\nconst allParams = (props) => Object.assign({}, _.get(props, 'params'), props);\n\nconst ResourceListPage_ = connectToPlural(\n withStartGuide((props: ResourceListPageProps) => {\n const resourceListPageExtensions = useExtensions<ResourceListPageExt>(isResourceListPage);\n const dynamicResourceListPageExtensions = useExtensions<DynamicResourceListPage>(\n isDynamicResourceListPage,\n );\n const { kindObj, kindsInFlight, modelRef, noProjectsAvailable, ns, plural } = allParams(props);\n\n if (!kindObj) {\n if (kindsInFlight) {\n return <LoadingBox />;\n }\n const missingType = isGroupVersionKind(plural)\n ? `\"${kindForReference(plural)}\" in \"${apiVersionForReference(plural)}\"`\n : `\"${plural}\"`;\n return (\n <ErrorPage404\n message={`The server doesn't have a resource type ${missingType}. Try refreshing the page if it was recently added.`}\n />\n );\n }\n const ref = referenceForModel(kindObj);\n const componentLoader = getResourceListPages(\n resourceListPageExtensions,\n dynamicResourceListPageExtensions,\n ).get(ref, () => Promise.resolve(DefaultPage));\n\n return (\n <div className=\"co-m-list\">\n <Helmet>\n <title>{kindObj.labelPlural}</title>\n </Helmet>\n <AsyncComponent\n autoFocus={!noProjectsAvailable}\n kind={modelRef}\n loader={componentLoader}\n mock={noProjectsAvailable}\n namespace={ns}\n badge={getBadgeFromType(kindObj.badge)}\n />\n </div>\n );\n }),\n);\n\nexport const ResourceListPage = (props) => {\n const params = useParams();\n return <ResourceListPage_ {...props} params={params} />;\n};\n\nconst ResourceDetailsPage_ = connectToPlural((props: ResourceDetailsPageProps) => {\n const detailsPageExtensions = useExtensions<ResourceDetailsPageExt>(isResourceDetailsPage);\n const dynamicResourceDetailsPageExtensions = useExtensions<DynamicResourceDetailsPage>(\n isDynamicResourceDetailsPage,\n );\n const location = useLocation();\n\n const { name, ns, kindObj, kindsInFlight } = allParams(props);\n const decodedName = decodeURIComponent(name);\n\n if (!name || !kindObj) {\n if (kindsInFlight) {\n return <LoadingBox />;\n }\n return <ErrorPage404 />;\n }\n\n const ref =\n location.pathname.indexOf('customresourcedefinitions') === -1\n ? referenceForModel(kindObj)\n : null;\n const componentLoader =\n getResourceDetailsPages(detailsPageExtensions, dynamicResourceDetailsPageExtensions).get(ref) ||\n getResourceDetailsPages(detailsPageExtensions, dynamicResourceDetailsPageExtensions).get(\n referenceForExtensionModel({\n group: kindObj.apiGroup,\n version: kindObj.apiVersion,\n kind: kindObj.kind,\n }),\n );\n const defaultPage = () => Promise.resolve(DefaultDetailsPage);\n\n const titleProviderValues = {\n telemetryPrefix: props.kindObj?.kind,\n titlePrefix: `${props.params.name} · ${getTitleForNodeKind(props.kindObj?.kind)}`,\n };\n\n return (\n <PageTitleContext.Provider value={titleProviderValues}>\n <AsyncComponent\n loader={componentLoader || defaultPage}\n namespace={ns}\n kind={props.modelRef}\n kindObj={kindObj}\n name={decodedName}\n badge={getBadgeFromType(kindObj.badge)}\n />\n </PageTitleContext.Provider>\n );\n});\n\nexport const ResourceDetailsPage = (props) => {\n const params = useParams();\n return <ResourceDetailsPage_ {...props} params={params} />;\n};\n\nexport type ResourceListPageProps = {\n flags: any;\n kindObj: K8sKind;\n kindsInFlight: boolean;\n params?: any;\n modelRef: K8sResourceKindReference;\n};\n\nexport type ResourceDetailsPageProps = {\n kindObj: K8sKind;\n kindsInFlight: boolean;\n params?: any;\n modelRef: K8sResourceKindReference;\n};\n\nResourceListPage.displayName = 'ResourceListPage';\nResourceDetailsPage.displayName = 'ResourceDetailsPage';\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CamelCaseWrap } from '@console/dynamic-plugin-sdk';\nimport { LinkifyExternal, Timestamp } from './utils';\nimport { ClusterServiceVersionCondition, K8sResourceCondition } from '../module/k8s';\n\n/**\n * Since ClusterServiceVersionCondition type is different from K8sResourceCondition, but InstallPlanCondition and SubscriptionCondition are identical, we will use the following enum to render the proper conditions table based on type.\n */\nexport enum ConditionTypes {\n ClusterServiceVersion = 'ClusterServiceVersion',\n K8sResource = 'K8sResource',\n}\n\nexport const Conditions: React.FC<ConditionsProps> = ({\n conditions,\n type = ConditionTypes.K8sResource,\n}) => {\n const { t } = useTranslation();\n\n const getStatusLabel = (status: string) => {\n switch (status) {\n case 'True':\n return t('public~True');\n case 'False':\n return t('public~False');\n default:\n return status;\n }\n };\n\n const rows = (conditions as Array<K8sResourceCondition | ClusterServiceVersionCondition>)?.map?.(\n (condition: K8sResourceCondition & ClusterServiceVersionCondition, i: number) => (\n <div\n className=\"row\"\n data-test={type === ConditionTypes.ClusterServiceVersion ? condition.phase : condition.type}\n key={i}\n >\n {type === ConditionTypes.ClusterServiceVersion ? (\n <div className=\"col-xs-4 col-sm-2 col-md-2\" data-test={`condition[${i}].phase`}>\n <CamelCaseWrap value={condition.phase} />\n </div>\n ) : (\n <>\n <div className=\"col-xs-4 col-sm-2 col-md-2\" data-test={`condition[${i}].type`}>\n <CamelCaseWrap value={condition.type} />\n </div>\n <div className=\"col-xs-4 col-sm-2 col-md-2\" data-test={`condition[${i}].status`}>\n {getStatusLabel(condition.status)}\n </div>\n </>\n )}\n <div\n className=\"hidden-xs hidden-sm col-md-2\"\n data-test={`condition[${i}].lastTransitionTime`}\n >\n <Timestamp timestamp={condition.lastTransitionTime} />\n </div>\n <div className=\"col-xs-4 col-sm-3 col-md-2\" data-test={`condition[${i}].reason`}>\n <CamelCaseWrap value={condition.reason} />\n </div>\n {/* remove initial newline which appears in route messages */}\n <div\n className=\"hidden-xs col-sm-5 col-md-4 co-break-word co-pre-line co-conditions__message\"\n data-test={`condition[${i}].message`}\n >\n <LinkifyExternal>{condition.message?.trim() || '-'}</LinkifyExternal>\n </div>\n </div>\n ),\n );\n\n return (\n <>\n {conditions?.length ? (\n <div className=\"co-m-table-grid co-m-table-grid--bordered\">\n <div className=\"row co-m-table-grid__head\">\n {type === ConditionTypes.ClusterServiceVersion ? (\n <div className=\"col-xs-4 col-sm-2 col-md-2\">{t('public~Phase')}</div>\n ) : (\n <>\n <div className=\"col-xs-4 col-sm-2 col-md-2\">{t('public~Type')}</div>\n <div className=\"col-xs-4 col-sm-2 col-md-2\">{t('public~Status')}</div>\n </>\n )}\n <div className=\"hidden-xs hidden-sm col-md-2\">{t('public~Updated')}</div>\n <div className=\"col-xs-4 col-sm-3 col-md-2\">{t('public~Reason')}</div>\n <div className=\"hidden-xs col-sm-5 col-md-4\">{t('public~Message')}</div>\n </div>\n <div className=\"co-m-table-grid__body\">{rows}</div>\n </div>\n ) : (\n <div className=\"cos-status-box\">\n <div className=\"pf-v5-u-text-align-center\">{t('public~No conditions found')}</div>\n </div>\n )}\n </>\n );\n};\nConditions.displayName = 'Conditions';\n\nexport type ConditionsProps = {\n conditions: K8sResourceCondition[] | ClusterServiceVersionCondition[];\n title?: string;\n subTitle?: string;\n type?: keyof typeof ConditionTypes;\n};\n","export const ALLOW_SERVICE_BINDING_FLAG = 'ALLOW_SERVICE_BINDING';\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport { Link, redirect } from 'react-router-dom-v5-compat';\nimport { Trans, useTranslation } from 'react-i18next';\nimport * as classNames from 'classnames';\nimport { sortable } from '@patternfly/react-table';\nimport {\n Alert,\n Grid,\n GridItem,\n Card,\n CardBody,\n CardHeader,\n CardTitle,\n} from '@patternfly/react-core';\n\nimport { ONE_HOUR, ONE_MINUTE, Status, usePrometheusGate } from '@console/shared';\nimport { ByteDataTypes } from '@console/shared/src/graph-helper/data-utils';\nimport { getGroupVersionKindForModel } from '@console/dynamic-plugin-sdk/src/utils/k8s/k8s-ref';\nimport {\n K8sResourceKindReference,\n referenceFor,\n K8sResourceKind,\n k8sPatch,\n K8sKind,\n} from '../module/k8s';\nimport { cloneBuild, getBuildNumber } from '../module/k8s/builds';\nimport { DetailsPage, ListPage, Table, TableData, RowFunctionArgs } from './factory';\nimport { errorModal, confirmModal } from './modals';\nimport {\n AsyncComponent,\n BuildHooks,\n BuildStrategy,\n DetailsItem,\n documentationURLs,\n ExternalLink,\n getDocumentationURL,\n humanizeBinaryBytes,\n humanizeCpuCores,\n isManaged,\n isUpstream,\n Kebab,\n KebabAction,\n navFactory,\n ResourceKebab,\n ResourceLink,\n resourceObjPath,\n resourcePath,\n ResourceSummary,\n SectionHeading,\n Timestamp,\n} from './utils';\nimport { BuildPipeline, BuildPipelineLogLink } from './build-pipeline';\nimport { BuildLogs } from './build-logs';\nimport { ResourceEventStream } from './events';\nimport { Area } from './graphs';\nimport { BuildConfigModel, BuildModel } from '../models';\nimport { timeFormatter, timeFormatterWithSeconds } from './utils/datetime';\nimport Dashboard from '@console/shared/src/components/dashboard/Dashboard';\nimport { displayDurationInWords } from './utils/build-utils';\n\nconst BuildsReference: K8sResourceKindReference = 'Build';\n\nconst CloneBuildAction: KebabAction = (kind: K8sKind, build: K8sResourceKind) => ({\n // t('public~Rebuild')\n labelKey: 'public~Rebuild',\n callback: () =>\n cloneBuild(build)\n .then((clone) => {\n redirect(resourceObjPath(clone, referenceFor(clone)));\n })\n .catch((err) => {\n const error = err.message;\n errorModal({ error });\n }),\n accessReview: {\n group: kind.apiGroup,\n resource: kind.plural,\n subresource: 'clone',\n name: build.metadata.name,\n namespace: build.metadata.namespace,\n verb: 'create',\n },\n});\n\nconst CancelAction: KebabAction = (kind: K8sKind, build: K8sResourceKind) => ({\n // t('public~Cancel build')\n labelKey: 'public~Cancel build',\n hidden:\n build.status.phase !== 'Running' &&\n build.status.phase !== 'Pending' &&\n build.status.phase !== 'New',\n callback: () =>\n confirmModal({\n // t('public~Cancel build'),\n // t('public~Are you sure you want to cancel this build?'),\n // t('public~Yes, cancel'),\n // t(\"public~No, don't cancel\"),\n titleKey: 'public~Cancel build',\n messageKey: 'public~Are you sure you want to cancel this build?',\n btnTextKey: 'public~Yes, cancel',\n cancelTextKey: \"public~No, don't cancel\",\n executeFn: () =>\n k8sPatch(kind, build, [{ op: 'add', path: '/status/cancelled', value: true }]),\n }),\n accessReview: {\n group: kind.apiGroup,\n resource: kind.plural,\n name: build.metadata.name,\n namespace: build.metadata.namespace,\n verb: 'patch',\n },\n});\n\nconst menuActions = [\n CloneBuildAction,\n CancelAction,\n ...Kebab.getExtensionsActionsForKind(BuildModel),\n ...Kebab.factory.common,\n];\n\nexport enum BuildStrategyType {\n Docker = 'Docker',\n Devfile = 'Devfile',\n Custom = 'Custom',\n JenkinsPipeline = 'JenkinsPipeline',\n Source = 'Source',\n}\n\nexport const BuildLogLink = ({ build }) => {\n const {\n metadata: { name, namespace },\n } = build;\n const isPipeline = _.get(build, 'spec.strategy.type') === BuildStrategyType.JenkinsPipeline;\n const { t } = useTranslation();\n return isPipeline ? (\n <BuildPipelineLogLink obj={build} />\n ) : (\n <Link to={`${resourcePath('Build', name, namespace)}/logs`}>{t('public~View logs')}</Link>\n );\n};\n\nexport const BuildNumberLink = ({ build }) => {\n const {\n metadata: { name, namespace },\n } = build;\n const buildNumber = getBuildNumber(build);\n const title = _.isFinite(buildNumber) ? `#${buildNumber}` : name;\n\n return <Link to={resourcePath('Build', name, namespace)}>{title}</Link>;\n};\n\n// TODO update to use QueryBrowser for each graph\nconst BuildMetrics = ({ obj }) => {\n const { t } = useTranslation();\n const podName = obj.metadata.annotations?.['openshift.io/build.pod-name'];\n const endTime = obj.status.completionTimestamp\n ? new Date(obj.status.completionTimestamp).getTime()\n : Date.now();\n const runTime = obj.status.startTimestamp\n ? endTime - new Date(obj.status.startTimestamp).getTime()\n : ONE_HOUR;\n const timespan = Math.max(runTime, ONE_MINUTE); // Minimum timespan of one minute\n const namespace = obj.metadata.namespace;\n const domain = React.useMemo(() => ({ x: [endTime - timespan, endTime] }), [endTime, timespan]);\n const areaProps = React.useMemo(\n () => ({\n namespace,\n endTime,\n timespan,\n formatDate: (d) =>\n timespan < 5 * ONE_MINUTE ? timeFormatterWithSeconds.format(d) : timeFormatter.format(d),\n domain, // force domain to match queried timespan\n }),\n [domain, endTime, namespace, timespan],\n );\n\n return podName ? (\n <Dashboard className=\"resource-metrics-dashboard\">\n <Grid hasGutter>\n <GridItem xl={6} lg={12}>\n <Card className=\"resource-metrics-dashboard__card\">\n <CardHeader>\n <CardTitle>{t('public~Memory usage')}</CardTitle>\n </CardHeader>\n <CardBody className=\"resource-metrics-dashboard__card-body\">\n <Area\n byteDataType={ByteDataTypes.BinaryBytes}\n humanize={humanizeBinaryBytes}\n query={`sum(container_memory_working_set_bytes{pod='${podName}',namespace='${namespace}',container=''}) BY (pod, namespace)`}\n {...areaProps}\n />\n </CardBody>\n </Card>\n </GridItem>\n <GridItem xl={6} lg={12}>\n <Card className=\"resource-metrics-dashboard__card\">\n <CardHeader>\n <CardTitle>{t('public~CPU usage')}</CardTitle>\n </CardHeader>\n <CardBody className=\"resource-metrics-dashboard__card-body\">\n <Area\n humanize={humanizeCpuCores}\n query={`pod:container_cpu_usage:sum{pod='${podName}',container='',namespace='${namespace}'}`}\n {...areaProps}\n />\n </CardBody>\n </Card>\n </GridItem>\n <GridItem xl={6} lg={12}>\n <Card className=\"resource-metrics-dashboard__card\">\n <CardHeader>\n <CardTitle>{t('public~Filesystem')}</CardTitle>\n </CardHeader>\n <CardBody className=\"resource-metrics-dashboard__card-body\">\n <Area\n byteDataType={ByteDataTypes.BinaryBytes}\n humanize={humanizeBinaryBytes}\n query={`pod:container_fs_usage_bytes:sum{pod='${podName}',container='',namespace='${namespace}'}`}\n {...areaProps}\n />\n </CardBody>\n </Card>\n </GridItem>\n </Grid>\n <br />\n </Dashboard>\n ) : null;\n};\n\nconst OpenShiftPipelines: React.FC = () => {\n const { t } = useTranslation();\n const text = t('public~OpenShift Pipelines based on Tekton');\n return isUpstream() || isManaged() ? (\n <>{text}</>\n ) : (\n <ExternalLink href={getDocumentationURL(documentationURLs.pipelines)} text={text} />\n );\n};\n\nexport const PipelineBuildStrategyAlert: React.FC<BuildsDetailsProps> = () => {\n const { t } = useTranslation();\n return (\n <Alert\n isInline\n className=\"co-alert\"\n variant=\"info\"\n title={t('public~Pipeline build strategy deprecation')}\n >\n <Trans t={t} ns=\"public\">\n With the release of <OpenShiftPipelines />, the pipelines build strategy has been\n deprecated. Users should either use Jenkins files directly on Jenkins or use cloud-native\n CI/CD with Openshift Pipelines.{' '}\n <ExternalLink\n href=\"https://github.com/openshift/pipelines-tutorial/\"\n text={t('public~Try the OpenShift Pipelines tutorial')}\n />\n </Trans>\n </Alert>\n );\n};\n\nexport const BuildsDetails: React.SFC<BuildsDetailsProps> = ({ obj: build }) => {\n const { logSnippet, message, startTimestamp, completionTimestamp } = build.status;\n const triggeredBy = _.map(build.spec.triggeredBy, 'message').join(', ');\n const hasPipeline = build.spec.strategy.type === BuildStrategyType.JenkinsPipeline;\n const { t } = useTranslation();\n const BUILDCONFIG_TO_BUILD_REFERENCE_LABEL = 'openshift.io/build-config.name';\n const buildConfigName =\n build.status.config?.name || build.metadata.labels?.[BUILDCONFIG_TO_BUILD_REFERENCE_LABEL];\n return (\n <>\n <div className=\"co-m-pane__body\">\n {hasPipeline && <PipelineBuildStrategyAlert obj={build} />}\n <SectionHeading text={t('public~Build details')} />\n {hasPipeline && (\n <div className=\"row\">\n <div className=\"col-xs-12\">\n <BuildPipeline obj={build} />\n </div>\n </div>\n )}\n <div className=\"row\">\n <div className=\"col-sm-6\">\n <ResourceSummary resource={build}>\n <DetailsItem\n label={t('public~Triggered by')}\n obj={build}\n path=\"spec.triggeredBy\"\n hideEmpty\n >\n {triggeredBy}\n </DetailsItem>\n </ResourceSummary>\n </div>\n <div className=\"col-sm-6\">\n <BuildStrategy resource={build}>\n <DetailsItem label={t('public~Status')} obj={build} path=\"status.phase\">\n <Status status={build.status.phase} />\n </DetailsItem>\n\n {buildConfigName && (\n <DetailsItem label={t('public~BuildConfig')} obj={build} path=\"status.config\">\n <ResourceLink\n groupVersionKind={getGroupVersionKindForModel(BuildConfigModel)}\n namespace={build.metadata.namespace}\n name={buildConfigName}\n />\n </DetailsItem>\n )}\n <DetailsItem\n label={t('public~Start time')}\n obj={build}\n path=\"status.startTimestamp\"\n hideEmpty\n >\n <Timestamp timestamp={startTimestamp} />\n </DetailsItem>\n <DetailsItem\n label={t('public~Completion time')}\n obj={build}\n path=\"status.completionTimestamp\"\n hideEmpty\n >\n <Timestamp timestamp={completionTimestamp} />\n </DetailsItem>\n <DetailsItem label={t('public~Duration')} obj={build} path=\"status.duration\">\n {displayDurationInWords(\n build?.status?.startTimestamp,\n build?.status?.completionTimestamp,\n )}\n </DetailsItem>\n <DetailsItem label={t('public~Message')} obj={build} path=\"status.message\" hideEmpty>\n {message}\n </DetailsItem>\n <DetailsItem\n label={t('public~Log snippet')}\n obj={build}\n path=\"status.logSnippet\"\n hideEmpty\n >\n <pre className=\"co-pre\">{logSnippet}</pre>\n </DetailsItem>\n </BuildStrategy>\n </div>\n </div>\n </div>\n <BuildHooks resource={build} />\n </>\n );\n};\n\nexport const getStrategyType = (strategy: BuildStrategyType) => {\n switch (strategy) {\n case BuildStrategyType.Docker:\n return 'dockerStrategy';\n case BuildStrategyType.Devfile:\n return 'devfileStrategy';\n case BuildStrategyType.Custom:\n return 'customStrategy';\n case BuildStrategyType.JenkinsPipeline:\n return 'jenkinsPipelineStrategy';\n case BuildStrategyType.Source:\n return 'sourceStrategy';\n default:\n return null;\n }\n};\n\nexport const getEnvPath = (props) => {\n const strategyType = getStrategyType(props.obj.spec.strategy.type);\n return strategyType ? ['spec', 'strategy', strategyType] : null;\n};\n\nconst EnvironmentPage = (props) => (\n <AsyncComponent\n loader={() => import('./environment.jsx').then((c) => c.EnvironmentPage)}\n {...props}\n />\n);\n\nexport const BuildEnvironmentComponent = (props) => {\n const { obj } = props;\n const readOnly = obj.kind === 'Build';\n const envPath = getEnvPath(props);\n const { t } = useTranslation();\n if (envPath) {\n return (\n <EnvironmentPage\n obj={obj}\n rawEnvData={obj.spec.strategy[getStrategyType(obj.spec.strategy.type)]}\n envPath={getEnvPath(props)}\n readOnly={readOnly}\n />\n );\n }\n return (\n <div className=\"cos-status-box\">\n <div className=\"pf-v5-u-text-align-center\">\n {t('public~The environment variable editor does not support build strategy: {{ type }}', {\n type: obj.spec.strategy.type,\n })}\n .\n </div>\n </div>\n );\n};\n\nexport const BuildsDetailsPage: React.SFC = (props) => {\n const prometheusIsAvailable = usePrometheusGate();\n return (\n <DetailsPage\n {...props}\n kind={BuildsReference}\n menuActions={menuActions}\n pages={[\n navFactory.details(BuildsDetails),\n ...(prometheusIsAvailable ? [navFactory.metrics(BuildMetrics)] : []),\n navFactory.editYaml(),\n navFactory.envEditor(BuildEnvironmentComponent),\n navFactory.logs(BuildLogs),\n navFactory.events(ResourceEventStream),\n ]}\n />\n );\n};\nBuildsDetailsPage.displayName = 'BuildsDetailsPage';\n\nconst tableColumnClasses = [\n '',\n '',\n 'pf-m-hidden pf-m-visible-on-md',\n 'pf-m-hidden pf-m-visible-on-lg',\n Kebab.columnClass,\n];\n\nconst BuildsTableRow: React.FC<RowFunctionArgs<K8sResourceKind>> = ({ obj }) => {\n return (\n <>\n <TableData className={tableColumnClasses[0]}>\n <ResourceLink\n kind={BuildsReference}\n name={obj.metadata.name}\n namespace={obj.metadata.namespace}\n />\n </TableData>\n <TableData\n className={classNames(tableColumnClasses[1], 'co-break-word')}\n columnID=\"namespace\"\n >\n <ResourceLink kind=\"Namespace\" name={obj.metadata.namespace} />\n </TableData>\n <TableData className={tableColumnClasses[2]}>\n <Status status={obj.status?.phase} />\n </TableData>\n <TableData className={tableColumnClasses[3]}>\n <Timestamp timestamp={obj.status?.startTimestamp} />\n </TableData>\n <TableData className={tableColumnClasses[3]}>\n {displayDurationInWords(obj.status?.startTimestamp, obj.status?.completionTimestamp)}\n </TableData>\n <TableData className={tableColumnClasses[4]}>\n <ResourceKebab actions={menuActions} kind={BuildsReference} resource={obj} />\n </TableData>\n </>\n );\n};\n\nexport const BuildsList: React.SFC = (props) => {\n const { t } = useTranslation();\n const BuildsTableHeader = () => {\n return [\n {\n title: t('public~Name'),\n sortField: 'metadata.name',\n transforms: [sortable],\n props: { className: tableColumnClasses[0] },\n },\n {\n title: t('public~Namespace'),\n sortField: 'metadata.namespace',\n transforms: [sortable],\n props: { className: tableColumnClasses[1] },\n id: 'namespace',\n },\n {\n title: t('public~Status'),\n sortField: 'status.phase',\n transforms: [sortable],\n props: { className: tableColumnClasses[2] },\n },\n {\n title: t('public~Start time'),\n sortField: 'status.startTimestamp',\n transforms: [sortable],\n props: { className: tableColumnClasses[3] },\n },\n {\n title: t('public~Duration'),\n sortField: 'status.duration',\n transforms: [sortable],\n props: { className: tableColumnClasses[3] },\n },\n {\n title: '',\n props: { className: tableColumnClasses[4] },\n },\n ];\n };\n BuildsTableHeader.displayName = 'BuildsTableHeader';\n\n return (\n <Table\n {...props}\n aria-label={t('public~Builds')}\n Header={BuildsTableHeader}\n Row={BuildsTableRow}\n virtualize\n />\n );\n};\n\nBuildsList.displayName = 'BuildsList';\n\nexport const buildPhase = (build) => build.status.phase;\n\nexport const allPhases = ['New', 'Pending', 'Running', 'Complete', 'Failed', 'Error', 'Cancelled'];\n\nexport const BuildsPage: React.SFC<BuildsPageProps> = (props) => {\n const { t } = useTranslation();\n return (\n <ListPage\n {...props}\n title={t('public~Builds')}\n kind={BuildsReference}\n ListComponent={BuildsList}\n canCreate={false}\n rowFilters={[\n {\n filterGroupName: t('public~Status'),\n type: 'build-status',\n reducer: buildPhase,\n items: _.map(allPhases, (phase) => ({\n id: phase,\n title: phase,\n })),\n },\n ]}\n />\n );\n};\nBuildsPage.displayName = 'BuildsListPage';\n\nexport type BuildsDetailsProps = {\n obj: any;\n};\n\nexport type BuildsPageProps = {\n showTitle?: boolean;\n namespace?: string;\n selector?: any;\n};\n","/* eslint-disable */\nimport { UseActivePerspective } from '../extensions/console-types';\n\n/**\n * Hook that provides the currently active perspective and a callback for setting the active perspective\n * @returns A tuple containing the current active perspective and setter callback.\n * @example\n * ```tsx\n * const Component: React.FC = (props) => {\n * const [activePerspective, setActivePerspective] = useActivePerspective();\n * return <select\n * value={activePerspective}\n * onChange={(e) => setActivePerspective(e.target.value)}\n * >\n * {\n * // ...perspective options\n * }\n * </select>\n * }\n * ```\n */\nexport const useActivePerspective: UseActivePerspective = require('@console/dynamic-plugin-sdk/src/perspective/useActivePerspective')\n .default;\n\nexport * from '../perspective/perspective-context';\n\n// Dynamic plugin SDK core APIs\nexport * from './dynamic-core-api';\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { Button } from '@patternfly/react-core';\nimport { useTranslation, Trans } from 'react-i18next';\n\nimport { FLAGS } from '@console/shared/src/constants';\nimport { useActiveNamespace } from '@console/shared/src/hooks/useActiveNamespace';\nimport { useActivePerspective } from '@console/dynamic-plugin-sdk';\nimport { createProjectMessageStateToProps } from '../reducers/ui';\nimport { Disabled, HintBlock, ExternalLink, openshiftHelpBase, LinkifyExternal } from './utils';\nimport { connectToFlags } from '../reducers/connectToFlags';\nimport { ProjectModel } from '../models';\nimport { K8sResourceKind } from '../module/k8s/types';\nimport { useCreateNamespaceOrProjectModal } from '@console/shared/src/hooks/useCreateNamespaceOrProjectModal';\n\nexport const OpenShiftGettingStarted = connect(createProjectMessageStateToProps)(\n ({ canCreate = true, createProjectMessage }: OpenShiftGettingStartedProps) => {\n const { t } = useTranslation();\n const [, setActiveNamespace] = useActiveNamespace();\n const [perspective] = useActivePerspective();\n const createNamespaceOrProjectModal = useCreateNamespaceOrProjectModal();\n\n return (\n <>\n {canCreate ? (\n <p>\n {t(\n 'public~OpenShift helps you quickly develop, host, and scale applications. To get started, create a project for your application.',\n )}\n </p>\n ) : (\n <p>\n {t(\n \"public~OpenShift helps you quickly develop, host, and scale applications. To get started, you'll need a project. Currently, you can't create or access any projects.\",\n )}\n {!createProjectMessage && (\n <> {t(\"public~You'll need to contact a cluster administrator for help.\")}</>\n )}\n </p>\n )}\n {createProjectMessage && (\n <p className=\"co-pre-line\">\n <LinkifyExternal>{createProjectMessage}</LinkifyExternal>\n </p>\n )}\n <p>\n <Trans t={t} ns=\"public\">\n To learn more, visit the OpenShift{' '}\n <ExternalLink href={openshiftHelpBase}>documentation</ExternalLink>.\n </Trans>\n </p>\n <p>\n <Trans t={t} ns=\"public\">\n Download the <Link to=\"/command-line-tools\">command-line tools</Link>\n </Trans>\n </p>\n {canCreate ? (\n <Button\n variant=\"link\"\n onClick={() =>\n createNamespaceOrProjectModal({\n onSubmit:\n perspective !== 'admin'\n ? (project: K8sResourceKind) => {\n setActiveNamespace(project.metadata?.name);\n }\n : undefined,\n })\n }\n >\n {t('public~Create a new project')}\n </Button>\n ) : null}\n </>\n );\n },\n);\n\ntype WithStartGuide = <P>(\n WrappedComponent: React.ComponentType<P & WithStartGuideProps>,\n disable?: boolean,\n) => React.ComponentType<P>;\n\nexport const withStartGuide: WithStartGuide = (WrappedComponent, disable = true) =>\n connectToFlags<any>(\n FLAGS.SHOW_OPENSHIFT_START_GUIDE,\n FLAGS.CAN_CREATE_NS,\n FLAGS.CAN_CREATE_PROJECT,\n )(({ flags, ...rest }: any) => {\n const { kindObj } = rest;\n const kind = _.get(kindObj, 'kind', rest.kind);\n\n // The start guide does not need to be shown on the Projects list page.\n if (kind === ProjectModel.kind) {\n return <WrappedComponent {...rest} />;\n }\n\n if (flags[FLAGS.SHOW_OPENSHIFT_START_GUIDE]) {\n return (\n <>\n <div className=\"co-m-pane__body\">\n <HintBlock title=\"Getting Started\">\n <OpenShiftGettingStarted\n canCreate={flags[FLAGS.CAN_CREATE_NS] || flags[FLAGS.CAN_CREATE_PROJECT]}\n />\n </HintBlock>\n </div>\n {!disable || (rest.kindObj && !rest.kindObj.namespaced) ? (\n <WrappedComponent {...rest} noProjectsAvailable />\n ) : (\n <Disabled>\n <WrappedComponent {...rest} noProjectsAvailable />\n </Disabled>\n )}\n </>\n );\n }\n return <WrappedComponent {...rest} />;\n });\n\ntype OpenShiftGettingStartedProps = {\n canCreate: boolean;\n createProjectMessage: string;\n};\n\nexport type WithStartGuideProps = {\n noProjectsAvailable?: boolean;\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport * as classNames from 'classnames';\nimport * as PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { useTranslation, withTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router-dom-v5-compat';\nimport { Divider } from '@patternfly/react-core';\nimport { impersonateStateToProps, useSafetyFirst } from '@console/dynamic-plugin-sdk';\nimport { useUserSettingsCompatibility } from '@console/shared';\nimport { CaretDownIcon } from '@patternfly/react-icons/dist/esm/icons/caret-down-icon';\nimport { CheckIcon } from '@patternfly/react-icons/dist/esm/icons/check-icon';\nimport { StarIcon } from '@patternfly/react-icons/dist/esm/icons/star-icon';\n\nimport { checkAccess } from './rbac';\nimport { KebabItems } from './kebab';\nimport { ResourceName } from './resource-icon';\n\nclass DropdownMixin extends React.PureComponent {\n constructor(props) {\n super(props);\n this.listener = this._onWindowClick.bind(this);\n this.state = { active: !!props.active, selectedKey: props.selectedKey };\n this.toggle = this.toggle.bind(this);\n this.dropdownElement = React.createRef();\n this.dropdownList = React.createRef();\n }\n\n _onWindowClick(event) {\n if (!this.state.active) {\n return;\n }\n\n const { current } = this.dropdownElement;\n if (!current) {\n return;\n }\n\n if (event.target === current || (current && current.contains(event.target))) {\n return;\n }\n\n this.hide(event);\n }\n\n UNSAFE_componentWillReceiveProps({ selectedKey, items }) {\n if (selectedKey !== this.props.selectedKey) {\n const title = items[selectedKey] || this.props.title;\n this.setState({ selectedKey, title });\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('click', this.listener);\n }\n\n onClick_(selectedKey, e) {\n e.preventDefault();\n e.stopPropagation();\n e.nativeEvent?.stopImmediatePropagation?.();\n\n const { items, actionItems, onChange, noSelection, title } = this.props;\n\n if (onChange) {\n onChange(selectedKey, e);\n }\n\n const newTitle = items[selectedKey];\n\n if (!actionItems || !_.some(actionItems, { actionKey: selectedKey })) {\n this.setState({\n selectedKey,\n title: noSelection ? title : newTitle,\n });\n }\n\n this.hide();\n }\n\n toggle(e) {\n e.preventDefault();\n\n if (this.props.disabled) {\n return;\n }\n\n if (this.state.active) {\n this.hide(e);\n } else {\n this.show(e);\n }\n }\n\n show() {\n /* If you're wondering why this isn't in componentDidMount, it's because\n * kebabs are dropdowns. A list of 200 pods would mean 200 global event\n * listeners. This is bad for performance. - ggreer\n */\n window.removeEventListener('click', this.listener);\n window.addEventListener('click', this.listener);\n this.setState({ active: true });\n }\n\n hide(e) {\n e && e.stopPropagation();\n window.removeEventListener('click', this.listener);\n this.setState({ active: false });\n }\n}\n\nclass DropDownRowWithTranslation extends React.PureComponent {\n render() {\n const {\n itemKey,\n content,\n onclick,\n className,\n selected,\n hover,\n autocompleteFilter,\n isBookmarked,\n onBookmark,\n favoriteKey,\n canFavorite,\n onFavorite,\n t,\n } = this.props;\n\n let prefix;\n const contentString = _.isString(content) ? content : '';\n\n if (!autocompleteFilter && !onBookmark) {\n //use pf4 markup if not using the autocomplete dropdown\n return (\n <li key={itemKey}>\n <button\n className=\"pf-v5-c-dropdown__menu-item\"\n id={`${itemKey}-link`}\n data-test-id=\"dropdown-menu\"\n data-test-dropdown-menu={itemKey}\n onClick={(e) => onclick(itemKey, e)}\n >\n {content}\n </button>\n </li>\n );\n }\n if (onBookmark) {\n prefix = (\n <a\n href=\"#\"\n className={classNames(\n 'pf-v5-c-menu__item-action pf-m-favorite',\n { hover, focus: selected },\n { 'pf-m-favorited': isBookmarked },\n )}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onBookmark(itemKey, !isBookmarked);\n }}\n aria-label={\n isBookmarked\n ? t('public~Remove bookmark {{content}}', { content: contentString })\n : t('public~Add bookmark {{content}}', { content: contentString })\n }\n >\n <span className=\"pf-v5-c-menu__item-action-icon\">\n <StarIcon />\n </span>\n </a>\n );\n }\n\n let suffix;\n if (isBookmarked && canFavorite) {\n const isFavorite = favoriteKey === itemKey;\n suffix = (\n <a\n href=\"#\"\n className={classNames('bookmarker', { hover, focus: selected })}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onFavorite(isFavorite ? null : itemKey);\n }}\n aria-label={\n isFavorite\n ? t('public~Remove favorite {{content}}', { content: contentString })\n : t('public~Add favorite {{content}}', { content: contentString })\n }\n >\n <StarIcon className={classNames({ favorite: isFavorite })} />\n </a>\n );\n }\n\n return (\n <li role=\"option\" className={classNames('pf-v5-c-menu__list-item', className)} key={itemKey}>\n <a\n href=\"#\"\n ref={this.link}\n id={`${itemKey}-link`}\n data-test=\"dropdown-menu-item-link\"\n className={classNames('pf-v5-c-menu__item', {\n 'pf-m-selected': selected,\n })}\n onClick={(e) => onclick(itemKey, e)}\n >\n <span className=\"pf-v5-c-menu__item-main\">\n <span className=\"pf-v5-c-menu__item-text\">{content}</span>\n <span className=\"pf-v5-c-menu__item-select-icon\">\n <CheckIcon />\n </span>\n </span>\n </a>\n {prefix}\n {suffix}\n </li>\n );\n }\n}\n\nconst DropDownRow = withTranslation()(DropDownRowWithTranslation);\n\nclass Dropdown_ extends DropdownMixin {\n constructor(props) {\n super(props);\n this.onClick = (...args) => this.onClick_(...args);\n\n this.state.items = props.items;\n this.state.title = props.noSelection\n ? props.title\n : _.get(props.items, props.selectedKey, props.title);\n\n this.onKeyDown = (e) => this.onKeyDown_(e);\n this.changeTextFilter = (e) => this.applyTextFilter_(e.target.value, this.props.items);\n const { shortCut } = this.props;\n\n this.globalKeyDown = (e) => {\n if (e.key === 'Escape' && this.state.active) {\n this.hide(e);\n return;\n }\n\n const { nodeName } = e.target;\n\n if (nodeName === 'INPUT' || nodeName === 'TEXTAREA') {\n return;\n }\n\n if (!shortCut || e.key !== shortCut) {\n return;\n }\n\n if (e.ctrlKey || e.altKey || e.metaKey || e.shiftKey) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n this.show(e);\n };\n }\n\n componentDidMount() {\n if (this.props.shortCut) {\n window.addEventListener('keydown', this.globalKeyDown);\n }\n }\n\n componentWillUnmount() {\n super.componentWillUnmount();\n window.removeEventListener('keydown', this.globalKeyDown);\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n super.UNSAFE_componentWillReceiveProps(nextProps);\n const props = this.props;\n\n if (_.isEqual(nextProps.items, props.items) && nextProps.title === props.title) {\n return;\n }\n const title = nextProps.title || props.title;\n this.setState({ title });\n\n this.applyTextFilter_(this.state.autocompleteText, nextProps.items);\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (!prevState.active && this.state.active && this.input) {\n // Clear any previous filter when reopening the dropdown.\n this.applyTextFilter_('', this.props.items);\n }\n }\n\n applyTextFilter_(autocompleteText, items) {\n const { autocompleteFilter } = this.props;\n if (autocompleteFilter && !_.isEmpty(autocompleteText)) {\n items = _.pickBy(items, (item, key) => autocompleteFilter(autocompleteText, item, key));\n }\n this.setState({ autocompleteText, items });\n }\n\n onKeyDown_(e) {\n const { key } = e;\n\n if (key !== 'ArrowDown' && key !== 'ArrowUp' && key !== 'Enter') {\n return;\n }\n\n const { keyboardHoverKey } = this.state;\n const { items } = this.props;\n\n if (key === 'Enter') {\n if (this.state.active && items[keyboardHoverKey]) {\n this.onClick(keyboardHoverKey, e);\n }\n return;\n }\n\n const keys = _.keys(items);\n\n let index = _.indexOf(keys, keyboardHoverKey);\n\n if (key === 'ArrowDown') {\n index += 1;\n } else {\n index -= 1;\n }\n\n // periodic boundaries\n if (index >= keys.length) {\n index = 0;\n }\n if (index < 0) {\n index = keys.length - 1;\n }\n\n const newKey = keys[index];\n this.setState({ keyboardHoverKey: newKey });\n e.stopPropagation();\n }\n\n renderActionItem() {\n const { actionItems } = this.props;\n if (actionItems) {\n const { selectedKey, keyboardHoverKey, noSelection } = this.props;\n return (\n <>\n {actionItems.map((ai) => (\n <DropDownRow\n className={classNames({ active: ai.actionKey === selectedKey && !noSelection })}\n key={`${ai.actionKey}-${ai.actionTitle}`}\n itemKey={ai.actionKey}\n content={ai.actionTitle}\n onclick={this.onClick}\n selected={ai.actionKey === selectedKey && !noSelection}\n hover={ai.actionKey === keyboardHoverKey}\n />\n ))}\n <Divider component=\"li\" />\n </>\n );\n }\n return null;\n }\n\n render() {\n const { active, autocompleteText, selectedKey, items, title, keyboardHoverKey } = this.state;\n const {\n ariaLabel,\n autocompleteFilter,\n autocompletePlaceholder,\n className,\n buttonClassName,\n menuClassName,\n storageKey,\n dropDownClassName,\n titlePrefix,\n describedBy,\n disabled,\n bookmarks,\n onBookmark,\n favoriteKey,\n canFavorite,\n onFavorite,\n } = this.props;\n const spacerBefore = this.props.spacerBefore || new Set();\n const headerBefore = this.props.headerBefore || {};\n const rows = [];\n const bookMarkRows = [];\n\n const addItem = (key, content) => {\n const selected = key === selectedKey && !this.props.noSelection;\n const hover = key === keyboardHoverKey;\n const klass = classNames({ active: selected });\n if (storageKey && bookmarks && bookmarks[key]) {\n bookMarkRows.push(\n <DropDownRow\n className={klass}\n key={key}\n itemKey={key}\n content={content}\n onclick={this.onClick}\n selected={selected}\n hover={hover}\n isBookmarked\n onBookmark={onBookmark}\n favoriteKey={favoriteKey}\n canFavorite={canFavorite}\n onFavorite={onFavorite}\n />,\n );\n return;\n }\n if (spacerBefore.has(key)) {\n rows.push(\n <li key={`${key}-spacer`}>\n <div className=\"dropdown-menu__divider\" />\n </li>,\n );\n }\n\n if (_.has(headerBefore, key)) {\n rows.push(\n <li key={`${key}-header`}>\n <div className=\"dropdown-menu__header\">{headerBefore[key]}</div>\n </li>,\n );\n }\n rows.push(\n <DropDownRow\n className={klass}\n key={key}\n itemKey={key}\n content={content}\n onBookmark={storageKey && onBookmark}\n onclick={this.onClick}\n selected={selected}\n hover={hover}\n autocompleteFilter={autocompleteFilter}\n />,\n );\n };\n\n _.each(items, (v, k) => addItem(k, v));\n //render PF4 dropdown markup if this is not the autocomplete filter\n if (autocompleteFilter) {\n return (\n <div className={className} ref={this.dropdownElement} style={this.props.style}>\n <div\n className={classNames(\n 'pf-v5-c-dropdown',\n { 'pf-m-expanded': this.state.active },\n dropDownClassName,\n )}\n >\n <button\n aria-label={ariaLabel}\n aria-haspopup=\"true\"\n onClick={this.toggle}\n onKeyDown={this.onKeyDown}\n type=\"button\"\n className={classNames('pf-v5-c-dropdown__toggle', buttonClassName)}\n id={this.props.id}\n aria-describedby={describedBy}\n disabled={disabled}\n data-test={this.props.dataTest}\n >\n <div className=\"pf-v5-c-dropdown__content-wrap\">\n <span className=\"pf-v5-c-dropdown__toggle-text\">\n {titlePrefix && `${titlePrefix}: `}\n {title}\n </span>\n <CaretDownIcon className=\"pf-c-dropdown__toggle-icon\" />\n </div>\n </button>\n {active && (\n // Style the Application menu to match the Project selection menu\n <div className=\"pf-v5-c-menu pf-m-scrollable co-namespace-dropdown__menu\">\n <div className=\"pf-v5-c-menu__content\" style={{ maxHeight: '60vh' }}>\n {autocompleteFilter && (\n <>\n <div className=\"pf-v5-c-menu__search\">\n <input\n autoFocus\n type=\"text\"\n ref={(input) => (this.input = input)}\n onChange={this.changeTextFilter}\n placeholder={autocompletePlaceholder}\n value={autocompleteText || ''}\n autoCapitalize=\"none\"\n onKeyDown={this.onKeyDown}\n className=\"pf-v5-c-form-control pf-m-search\"\n onClick={(e) => e.stopPropagation()}\n data-test-id=\"dropdown-text-filter\"\n />\n </div>\n <Divider />\n </>\n )}\n {_.size(bookMarkRows) ? (\n <h1 className=\"pf-v5-c-menu__group-title\">Favorites</h1>\n ) : null}\n <ul\n role=\"listbox\"\n ref={this.dropdownList}\n className=\"pf-v5-c-menu__list dropdown-menu__autocomplete-filter\"\n >\n {this.renderActionItem()}\n {bookMarkRows}\n {_.size(bookMarkRows) && _.size(rows) ? <Divider component=\"li\" /> : null}\n {rows}\n </ul>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n }\n\n //pf4 markup\n return (\n <div className={className} ref={this.dropdownElement} style={this.props.style}>\n <div\n className={classNames(\n { 'pf-v5-c-dropdown': true, 'pf-m-expanded': this.state.active },\n dropDownClassName,\n )}\n >\n <button\n aria-label={ariaLabel}\n aria-haspopup=\"true\"\n aria-expanded={this.state.active}\n className={classNames('pf-v5-c-dropdown__toggle', buttonClassName)}\n data-test-id=\"dropdown-button\"\n onClick={this.toggle}\n onKeyDown={this.onKeyDown}\n type=\"button\"\n id={this.props.id}\n data-test={this.props.dataTest}\n aria-describedby={describedBy}\n disabled={disabled}\n >\n <span className=\"pf-v5-c-dropdown__toggle-text\">\n {titlePrefix && `${titlePrefix}: `}\n {title}\n </span>\n <CaretDownIcon className=\"pf-c-dropdown__toggle-icon\" />\n </button>\n {active && (\n <ul\n ref={this.dropdownList}\n className={classNames('pf-v5-c-dropdown__menu', menuClassName)}\n >\n {rows}\n </ul>\n )}\n </div>\n </div>\n );\n }\n}\n\nexport const Dropdown = (props) => {\n const { userSettingsPrefix, storageKey } = props;\n\n // Should be undefined so that we don't save undefined-xxx.\n const favoriteUserSettingsKey = userSettingsPrefix ? `${userSettingsPrefix}.favorite` : undefined;\n const favoriteStorageKey = storageKey ? storageKey : undefined;\n const bookmarkUserSettingsKey = userSettingsPrefix\n ? `${userSettingsPrefix}.bookmarks`\n : undefined;\n const bookmarkStorageKey = storageKey ? `${storageKey}-bookmarks` : undefined;\n\n const [favoriteKey, setFavoriteKey] = useUserSettingsCompatibility(\n favoriteUserSettingsKey,\n favoriteStorageKey,\n undefined,\n true,\n );\n const [bookmarks, setBookmarks] = useUserSettingsCompatibility(\n bookmarkUserSettingsKey,\n bookmarkStorageKey,\n undefined,\n true,\n );\n\n const onBookmark = React.useCallback(\n (key, active) => {\n setBookmarks((oldBookmarks) => ({ ...oldBookmarks, [key]: active ? true : undefined }));\n },\n [setBookmarks],\n );\n\n return (\n <Dropdown_\n {...props}\n bookmarks={bookmarks}\n onBookmark={onBookmark}\n favoriteKey={favoriteKey}\n onFavorite={setFavoriteKey}\n />\n );\n};\n\nDropdown.displayName = 'Dropdown';\n\nDropdown.propTypes = {\n actionItems: PropTypes.arrayOf(\n PropTypes.shape({\n actionKey: PropTypes.string,\n actionTitle: PropTypes.string,\n }),\n ),\n autocompleteFilter: PropTypes.func,\n autocompletePlaceholder: PropTypes.string,\n canFavorite: PropTypes.bool,\n className: PropTypes.string,\n dropDownClassName: PropTypes.string,\n enableBookmarks: PropTypes.bool,\n headerBefore: PropTypes.objectOf(PropTypes.string),\n items: PropTypes.object.isRequired,\n menuClassName: PropTypes.string,\n buttonClassName: PropTypes.string,\n noSelection: PropTypes.bool,\n userSettingsPrefix: PropTypes.string,\n storageKey: PropTypes.string,\n spacerBefore: PropTypes.instanceOf(Set),\n textFilter: PropTypes.string,\n title: PropTypes.node,\n disabled: PropTypes.bool,\n id: PropTypes.string,\n onChange: PropTypes.func,\n selectedKey: PropTypes.string,\n titlePrefix: PropTypes.string,\n ariaLabel: PropTypes.string,\n name: PropTypes.string,\n autoSelect: PropTypes.bool,\n describedBy: PropTypes.string,\n required: PropTypes.bool,\n dataTest: PropTypes.string,\n};\n\nconst ActionsMenuDropdown = (props) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const [active, setActive] = React.useState(!!props.active);\n\n const dropdownElement = React.useRef();\n\n const show = () => {\n setActive(true);\n };\n\n const hide = (e) => {\n e?.stopPropagation();\n setActive(false);\n };\n\n const listener = React.useCallback(\n (event) => {\n if (!active) {\n return;\n }\n\n const { current } = dropdownElement;\n if (!current) {\n return;\n }\n\n if (event.target === current || current.contains(event.target)) {\n return;\n }\n\n hide(event);\n },\n [active, dropdownElement],\n );\n\n React.useEffect(() => {\n if (active) {\n window.addEventListener('click', listener);\n } else {\n window.removeEventListener('click', listener);\n }\n return () => {\n window.removeEventListener('click', listener);\n };\n }, [active, listener]);\n\n const toggle = (e) => {\n e.preventDefault();\n\n if (props.disabled) {\n return;\n }\n\n if (active) {\n hide(e);\n } else {\n show(e);\n }\n };\n\n const onClick = (event, option) => {\n event.preventDefault();\n\n if (option.callback) {\n option.callback();\n }\n\n if (option.href) {\n navigate(option.href);\n }\n\n hide();\n };\n\n return (\n <div\n ref={dropdownElement}\n className={classNames({\n 'co-actions-menu pf-v5-c-dropdown': true,\n 'pf-m-expanded': active,\n })}\n >\n <button\n type=\"button\"\n aria-haspopup=\"true\"\n aria-label={t('public~Actions')}\n aria-expanded={active}\n className=\"pf-v5-c-dropdown__toggle\"\n onClick={toggle}\n data-test-id=\"actions-menu-button\"\n >\n <span className=\"pf-v5-c-dropdown__toggle-text\">{props.title || t('public~Actions')}</span>\n <CaretDownIcon className=\"pf-c-dropdown__toggle-icon\" />\n </button>\n {active && <KebabItems options={props.actions} onClick={onClick} />}\n </div>\n );\n};\n\nconst ActionsMenu_ = ({ actions, impersonate, title = undefined }) => {\n const [isVisible, setVisible] = useSafetyFirst(false);\n\n // Check if any actions are visible when actions have access reviews.\n React.useEffect(() => {\n if (!actions.length) {\n setVisible(false);\n return;\n }\n const promises = actions.reduce((acc, action) => {\n if (action.accessReview) {\n acc.push(checkAccess(action.accessReview));\n }\n return acc;\n }, []);\n\n // Only need to resolve if all actions require access review\n if (promises.length !== actions.length) {\n setVisible(true);\n return;\n }\n Promise.all(promises)\n .then((results) => setVisible(_.some(results, 'status.allowed')))\n .catch(() => setVisible(true));\n }, [actions, impersonate, setVisible]);\n return isVisible ? <ActionsMenuDropdown actions={actions} title={title} /> : null;\n};\n\nexport const ActionsMenu = connect(impersonateStateToProps)(ActionsMenu_);\n\nActionsMenu.propTypes = {\n actions: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.node,\n labelKey: PropTypes.string,\n href: PropTypes.string,\n callback: PropTypes.func,\n accessReview: PropTypes.object,\n }),\n ).isRequired,\n title: PropTypes.node,\n};\n\nconst containerLabel = (container) => (\n <ResourceName name={container ? container.name : ''} kind=\"Container\" />\n);\n\nexport const ContainerDropdown = (props) => {\n const { t } = useTranslation();\n\n const getSpacer = (container) => {\n const spacerBefore = new Set();\n return container ? spacerBefore.add(container.name) : spacerBefore;\n };\n\n const getHeaders = (container, initContainer) => {\n return initContainer\n ? {\n [container.name]: t('public~Containers'),\n [initContainer.name]: t('public~Init containers'),\n }\n : {};\n };\n\n const { currentKey, containers, initContainers, onChange } = props;\n if (_.isEmpty(containers) && _.isEmpty(initContainers)) {\n return null;\n }\n const firstInitContainer = _.find(initContainers, { order: 0 });\n const firstContainer = _.find(containers, { order: 0 });\n const spacerBefore = getSpacer(firstInitContainer);\n const headerBefore = getHeaders(firstContainer, firstInitContainer);\n const dropdownItems = _.mapValues(_.merge(containers, initContainers), containerLabel);\n const title = _.get(dropdownItems, currentKey) || containerLabel(firstContainer);\n return (\n <Dropdown\n headerBefore={headerBefore}\n items={dropdownItems}\n spacerBefore={spacerBefore}\n title={title}\n onChange={onChange}\n selectedKey={currentKey}\n />\n );\n};\n\nContainerDropdown.propTypes = {\n containers: PropTypes.oneOfType([PropTypes.object, PropTypes.array]).isRequired,\n currentKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n initContainers: PropTypes.object,\n onChange: PropTypes.func.isRequired,\n};\n\nContainerDropdown.defaultProps = {\n currentKey: '',\n initContainers: {},\n};\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport * as _ from 'lodash-es';\nimport * as React from 'react';\nimport * as classNames from 'classnames';\nimport { connect } from 'react-redux';\n/* eslint-disable import/named */\nimport { useTranslation } from 'react-i18next';\nimport i18next from 'i18next';\nimport { KeyTypes, Tooltip, FocusTrap } from '@patternfly/react-core';\nimport { AngleRightIcon } from '@patternfly/react-icons/dist/esm/icons/angle-right-icon';\nimport { EllipsisVIcon } from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';\nimport { useNavigate } from 'react-router-dom-v5-compat';\nimport { subscribeToExtensions } from '@console/plugin-sdk/src/api/pluginSubscriptionService';\nimport { KebabActions, isKebabActions } from '@console/plugin-sdk/src/typings/kebab-actions';\nimport Popper from '@console/shared/src/components/popper/Popper';\nimport {\n HelmChartRepositoryModel,\n ProjectHelmChartRepositoryModel,\n} from '@console/helm-plugin/src/models';\nimport { impersonateStateToProps, ImpersonateKind } from '@console/dynamic-plugin-sdk';\nimport {\n annotationsModalLauncher,\n configureReplicaCountModal,\n taintsModal,\n tolerationsModal,\n labelsModalLauncher,\n podSelectorModal,\n deleteModal,\n expandPVCModal,\n clonePVCModal,\n restorePVCModal,\n} from '../modals';\nimport { asAccessReview, checkAccess, resourceObjPath, useAccessReview } from './index';\nimport {\n AccessReviewResourceAttributes,\n K8sKind,\n K8sResourceKind,\n K8sResourceKindReference,\n referenceFor,\n referenceForModel,\n VolumeSnapshotKind,\n} from '../../module/k8s';\nimport { connectToModel } from '../../kinds';\nimport {\n BuildConfigModel,\n ConfigMapModel,\n DeploymentConfigModel,\n DeploymentModel,\n RouteModel,\n VolumeSnapshotModel,\n} from '../../models';\n\nexport const kebabOptionsToMenu = (options: KebabOption[]): KebabMenuOption[] => {\n const subs: { [key: string]: KebabSubMenu } = {};\n const menuOptions: KebabMenuOption[] = [];\n\n options.forEach((o) => {\n if (!o.hidden) {\n if (o.pathKey || o.path) {\n const parts = o.pathKey ? o.pathKey.split('/') : o.path.split('/');\n parts.forEach((p, i) => {\n let subMenu = subs[p];\n if (!subs[p]) {\n subMenu = o.pathKey\n ? {\n labelKey: p,\n children: [],\n }\n : {\n label: p,\n children: [],\n };\n subs[p] = subMenu;\n if (i === 0) {\n menuOptions.push(subMenu);\n } else {\n subs[parts[i - 1]].children.push(subMenu);\n }\n }\n });\n subs[parts[parts.length - 1]].children.push(o);\n } else {\n menuOptions.push(o);\n }\n }\n });\n return menuOptions;\n};\n\nconst KebabItem_: React.FC<KebabItemProps & { isAllowed: boolean }> = ({\n option,\n onClick,\n onEscape,\n autoFocus,\n isAllowed,\n}) => {\n const { t } = useTranslation();\n const handleEscape = (e) => {\n if (e.keyCode === KeyTypes.Escape) {\n onEscape();\n }\n };\n const disabled = !isAllowed || option.isDisabled || (!option.href && !option.callback);\n const classes = classNames('pf-v5-c-dropdown__menu-item', { 'pf-m-disabled': disabled });\n return (\n <button\n className={classes}\n onClick={(e) => !disabled && onClick(e, option)}\n autoFocus={autoFocus}\n onKeyDown={onEscape && handleEscape}\n disabled={disabled}\n data-test-action={option.labelKey ? t(option.labelKey, option.labelKind) : option.label}\n >\n {option.icon && <span className=\"oc-kebab__icon\">{option.icon}</span>}\n {option.labelKey ? t(option.labelKey, option.labelKind) : option.label}\n </button>\n );\n};\nexport const KebabItemAccessReview_ = (\n props: KebabItemProps & { impersonate: ImpersonateKind },\n) => {\n const { option, impersonate } = props;\n const isAllowed = useAccessReview(option.accessReview, impersonate);\n return <KebabItem_ {...props} isAllowed={isAllowed} />;\n};\n\nconst KebabItemAccessReview = connect(impersonateStateToProps)(KebabItemAccessReview_);\n\ntype KebabSubMenuProps = {\n option: KebabSubMenu;\n onClick: KebabItemProps['onClick'];\n};\n\nconst KebabSubMenu: React.FC<KebabSubMenuProps> = ({ option, onClick }) => {\n const { t } = useTranslation();\n const [open, setOpen] = React.useState(false);\n const nodeRef = React.useRef(null);\n const subMenuRef = React.useRef(null);\n const referenceCb = React.useCallback(() => nodeRef.current, []);\n // use a callback ref because FocusTrap is old and doesn't support non-function refs\n const subMenuCbRef = React.useCallback((node) => (subMenuRef.current = node), []);\n\n return (\n <>\n <button\n ref={nodeRef}\n className=\"oc-kebab__sub pf-v5-c-dropdown__menu-item\"\n data-test-action={option.labelKey || option.label}\n // mouse enter will open the sub menu\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={(e) => {\n // if the mouse leaves this item, close the sub menu only if the mouse did not enter the sub menu itself\n if (!subMenuRef.current || !subMenuRef.current.contains(e.relatedTarget as Node)) {\n setOpen(false);\n }\n }}\n onKeyDown={(e) => {\n // open the sub menu on enter or right arrow\n if (e.keyCode === 39 || e.keyCode === 13) {\n setOpen(true);\n e.stopPropagation();\n }\n }}\n >\n {option.labelKey ? t(option.labelKey) : option.label}\n <AngleRightIcon className=\"oc-kebab__arrow\" />\n </button>\n <Popper\n open={open}\n placement=\"right-start\"\n closeOnEsc\n closeOnOutsideClick\n onRequestClose={(e) => {\n // only close the sub menu if clicking anywhere outside the menu item that owns the sub menu\n if (!e || !nodeRef.current || !nodeRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }}\n reference={referenceCb}\n >\n <FocusTrap\n focusTrapOptions={{\n clickOutsideDeactivates: true,\n fallbackFocus: () => subMenuRef.current, // fallback to popover content wrapper div if there are no tabbable elements\n }}\n >\n <div\n ref={subMenuCbRef}\n role=\"presentation\"\n className=\"pf-v5-c-dropdown pf-m-expanded\"\n tabIndex={-1}\n onMouseLeave={(e) => {\n // only close the sub menu if the mouse does not enter the item\n if (!nodeRef.current || !nodeRef.current.contains(e.relatedTarget as Node)) {\n setOpen(false);\n }\n }}\n onKeyDown={(e) => {\n // close the sub menu on left arrow\n if (e.keyCode === 37) {\n setOpen(false);\n e.stopPropagation();\n }\n }}\n >\n <KebabMenuItems\n options={option.children}\n onClick={onClick}\n className=\"oc-kebab__popper-items\"\n focusItem={option.children[0]}\n />\n </div>\n </FocusTrap>\n </Popper>\n </>\n );\n};\n\nexport const isKebabSubMenu = (option: KebabMenuOption): option is KebabSubMenu => {\n // only a sub menu has children\n return Array.isArray((option as KebabSubMenu).children);\n};\n\nexport const KebabItem: React.FC<KebabItemProps> = (props) => {\n const { option } = props;\n let item;\n\n if (option.accessReview) {\n item = <KebabItemAccessReview {...props} />;\n } else {\n item = <KebabItem_ {...props} isAllowed />;\n }\n const tooltip = option.tooltipKey ? i18next.t(option.tooltipKey) : option.tooltip;\n\n return tooltip ? (\n <Tooltip position=\"left\" content={tooltip}>\n {item}\n </Tooltip>\n ) : (\n item\n );\n};\n\ntype KebabMenuItemsProps = {\n options: KebabMenuOption[];\n onClick: (event: React.MouseEvent<{}>, option: KebabOption) => void;\n focusItem?: KebabOption;\n className?: string;\n};\n\nexport const KebabMenuItems: React.FC<KebabMenuItemsProps> = ({\n className,\n options,\n onClick,\n focusItem,\n}) => (\n <ul\n className={classNames('pf-v5-c-dropdown__menu pf-m-align-right', className)}\n data-test-id=\"action-items\"\n >\n {_.map(options, (o, index) => (\n <li key={index}>\n {isKebabSubMenu(o) ? (\n <KebabSubMenu option={o} onClick={onClick} />\n ) : (\n <KebabItem\n option={o}\n onClick={onClick}\n autoFocus={focusItem ? o === focusItem : undefined}\n />\n )}\n </li>\n ))}\n </ul>\n);\n\nexport const KebabItems: React.FC<KebabItemsProps> = ({ options, ...props }) => {\n const menuOptions = kebabOptionsToMenu(options);\n return <KebabMenuItems {...props} options={menuOptions} />;\n};\n\nconst kebabFactory: KebabFactory = {\n Delete: (kind, obj) => ({\n // t('public~Delete {{kind}}', {kind: kind.label})\n labelKey: 'public~Delete {{kind}}',\n labelKind: { kind: kind.labelKey ? i18next.t(kind.labelKey) : kind.label },\n callback: () =>\n deleteModal({\n kind,\n resource: obj,\n }),\n accessReview: asAccessReview(kind, obj, 'delete'),\n }),\n Edit: (kind, obj) => {\n let href: string;\n switch (kind.kind) {\n case ConfigMapModel.kind:\n case RouteModel.kind:\n case BuildConfigModel.kind:\n case DeploymentModel.kind:\n case DeploymentConfigModel.kind:\n href = `${resourceObjPath(obj, kind.crd ? referenceForModel(kind) : kind.kind)}/form`;\n break;\n case HelmChartRepositoryModel.kind:\n href = `/k8s/cluster/helmchartrepositories/${obj.metadata.name}/form?kind=${referenceFor(\n obj,\n )}`;\n break;\n case ProjectHelmChartRepositoryModel.kind:\n href = `/ns/${obj.metadata.namespace}/helmchartrepositories/${\n obj.metadata.name\n }/form?kind=${referenceFor(obj)}`;\n break;\n default:\n href = `${resourceObjPath(obj, kind.crd ? referenceForModel(kind) : kind.kind)}/yaml`;\n }\n return {\n // t('public~Edit {{kind}}', {kind: kind.label})\n labelKey: 'public~Edit {{kind}}',\n labelKind: { kind: kind.labelKey ? i18next.t(kind.labelKey) : kind.label },\n dataTest: `Edit ${kind.label}`,\n href,\n // TODO: Fallback to \"View YAML\"? We might want a similar fallback for annotations, labels, etc.\n accessReview: asAccessReview(kind, obj, 'update'),\n };\n },\n ModifyLabels: (kind, obj) => ({\n // t('public~Edit labels')\n labelKey: 'public~Edit labels',\n callback: () =>\n labelsModalLauncher({\n kind,\n resource: obj,\n blocking: true,\n }),\n accessReview: asAccessReview(kind, obj, 'patch'),\n }),\n ModifyPodSelector: (kind, obj) => ({\n // t('public~Edit Pod selector')\n labelKey: 'public~Edit Pod selector',\n callback: () =>\n podSelectorModal({\n kind,\n resource: obj,\n blocking: true,\n }),\n accessReview: asAccessReview(kind, obj, 'patch'),\n }),\n ModifyAnnotations: (kind, obj) => ({\n // t('public~Edit annotations')\n labelKey: 'public~Edit annotations',\n callback: () =>\n annotationsModalLauncher({\n kind,\n resource: obj,\n blocking: true,\n }),\n accessReview: asAccessReview(kind, obj, 'patch'),\n }),\n ModifyCount: (kind, obj) => ({\n // t('public~Edit Pod count')\n labelKey: 'public~Edit Pod count',\n callback: () =>\n configureReplicaCountModal({\n resourceKind: kind,\n resource: obj,\n }),\n accessReview: asAccessReview(kind, obj, 'patch', 'scale'),\n }),\n ModifyTaints: (kind, obj) => ({\n // t('public~Edit taints')\n labelKey: 'public~Edit taints',\n callback: () =>\n taintsModal({\n resourceKind: kind,\n resource: obj,\n modalClassName: 'modal-lg',\n }),\n accessReview: asAccessReview(kind, obj, 'patch'),\n }),\n ModifyTolerations: (kind, obj) => ({\n // t('public~Edit tolerations')\n labelKey: 'public~Edit tolerations',\n callback: () =>\n tolerationsModal({\n resourceKind: kind,\n resource: obj,\n modalClassName: 'modal-lg',\n }),\n accessReview: asAccessReview(kind, obj, 'patch'),\n }),\n AddStorage: (kind, obj) => ({\n // t('public~Add storage')\n labelKey: 'public~Add storage',\n href: `${resourceObjPath(obj, kind.crd ? referenceForModel(kind) : kind.kind)}/attach-storage`,\n accessReview: asAccessReview(kind, obj, 'patch'),\n }),\n ExpandPVC: (kind, obj) => ({\n // t('public~Expand PVC')\n labelKey: 'public~Expand PVC',\n callback: () =>\n expandPVCModal({\n kind,\n resource: obj,\n }),\n accessReview: asAccessReview(kind, obj, 'patch'),\n }),\n PVCSnapshot: (kind, obj) => ({\n // t('public~Create snapshot')\n labelKey: 'public~Create snapshot',\n isDisabled: obj?.status?.phase !== 'Bound',\n tooltip: obj?.status?.phase !== 'Bound' ? 'PVC is not Bound' : '',\n href: `/k8s/ns/${obj.metadata.namespace}/${VolumeSnapshotModel.plural}/~new/form?pvc=${obj.metadata.name}`,\n accessReview: asAccessReview(kind, obj, 'create'),\n }),\n ClonePVC: (kind, obj) => ({\n // t('public~Clone PVC')\n labelKey: 'public~Clone PVC',\n isDisabled: obj?.status?.phase !== 'Bound',\n tooltip: obj?.status?.phase !== 'Bound' ? 'PVC is not Bound' : '',\n callback: () =>\n clonePVCModal({\n kind,\n resource: obj,\n }),\n accessReview: asAccessReview(kind, obj, 'create'),\n }),\n RestorePVC: (kind, obj: VolumeSnapshotKind) => ({\n // t('public~Restore as new PVC')\n labelKey: 'public~Restore as new PVC',\n isDisabled: !obj?.status?.readyToUse,\n tooltip: !obj?.status?.readyToUse ? 'Volume Snapshot is not Ready' : '',\n callback: () =>\n restorePVCModal({\n kind,\n resource: obj,\n }),\n accessReview: asAccessReview(kind, obj, 'create'),\n }),\n};\n\n// The common menu actions that most resource share\nkebabFactory.common = [\n kebabFactory.ModifyLabels,\n kebabFactory.ModifyAnnotations,\n kebabFactory.Edit,\n kebabFactory.Delete,\n];\n\nlet kebabActionExtensions: KebabActions[] = [];\n\nsubscribeToExtensions<KebabActions>((extensions) => {\n kebabActionExtensions = extensions;\n}, isKebabActions);\n\nexport const getExtensionsKebabActionsForKind = (kind: K8sKind) => {\n const actionsForKind: KebabAction[] = [];\n kebabActionExtensions.forEach((e) => {\n e.properties.getKebabActionsForKind(kind).forEach((kebabAction) => {\n actionsForKind.push(kebabAction);\n });\n });\n return actionsForKind;\n};\n\nexport const ResourceKebab = connectToModel((props: ResourceKebabProps) => {\n const { t } = useTranslation();\n const { actions, kindObj, resource, isDisabled, customData, terminatingTooltip } = props;\n\n if (!kindObj) {\n return null;\n }\n const options = _.reject(\n actions.map((a) => a(kindObj, resource, null, customData)),\n 'hidden',\n );\n return (\n <Kebab\n options={options}\n key={resource.metadata.uid}\n isDisabled={isDisabled ?? _.has(resource.metadata, 'deletionTimestamp')}\n terminatingTooltip={\n _.has(resource.metadata, 'deletionTimestamp')\n ? terminatingTooltip || t('Resource is being deleted.')\n : ''\n }\n />\n );\n});\n\nexport const Kebab: KebabComponent = (props) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { options, isDisabled, terminatingTooltip } = props;\n const dropdownElement = React.useRef<HTMLButtonElement>();\n const divElement = React.useRef<HTMLDivElement>();\n const [active, setActive] = React.useState(false);\n\n const onClick = (event, option: KebabOption) => {\n event.preventDefault();\n if (option.callback) {\n option.callback();\n }\n hide();\n if (option.href) {\n navigate(option.href);\n }\n };\n\n const hide = () => {\n dropdownElement.current && dropdownElement.current.focus();\n setActive(false);\n };\n\n const toggle = () => {\n setActive((prev) => !prev);\n };\n\n const onHover = () => {\n // Check access when hovering over a kebab to minimize flicker when opened.\n // This depends on `checkAccess` being memoized.\n _.each(options, (option: KebabOption) => {\n if (option.accessReview) {\n checkAccess(option.accessReview).catch((e) => {\n // eslint-disable-next-line no-console\n console.warn('Error while check action menu access review', e);\n });\n }\n });\n };\n\n const handleRequestClose = (e?: MouseEvent) => {\n if (!e || !dropdownElement.current || !dropdownElement.current.contains(e.target as Node)) {\n hide();\n }\n };\n\n const getPopperReference = () => dropdownElement.current;\n\n const getDivReference = () => divElement.current;\n\n const menuOptions = kebabOptionsToMenu(options);\n\n return (\n <Tooltip\n content={terminatingTooltip}\n trigger={isDisabled && terminatingTooltip ? 'mouseenter' : 'manual'}\n >\n <div\n className={classNames({\n 'pf-v5-c-dropdown': true,\n 'pf-m-expanded': active,\n })}\n >\n <button\n id={props.id}\n ref={dropdownElement}\n type=\"button\"\n aria-expanded={active}\n aria-haspopup=\"true\"\n aria-label={t('public~Actions')}\n className=\"pf-v5-c-dropdown__toggle pf-m-plain\"\n data-test-id=\"kebab-button\"\n disabled={isDisabled}\n onClick={toggle}\n onFocus={onHover}\n onMouseEnter={onHover}\n >\n <EllipsisVIcon />\n </button>\n <Popper\n open={!isDisabled && active}\n placement=\"bottom-end\"\n closeOnEsc\n closeOnOutsideClick\n onRequestClose={handleRequestClose}\n reference={getPopperReference}\n >\n <FocusTrap\n focusTrapOptions={{\n clickOutsideDeactivates: true,\n returnFocusOnDeactivate: false,\n fallbackFocus: getDivReference, // fallback to popover content wrapper div if there are no tabbable elements\n }}\n >\n <div ref={divElement} className=\"pf-v5-c-dropdown pf-m-expanded\" tabIndex={-1}>\n <KebabMenuItems\n options={menuOptions}\n onClick={onClick}\n className=\"oc-kebab__popper-items\"\n focusItem={menuOptions[0]}\n />\n </div>\n </FocusTrap>\n </Popper>\n </div>\n </Tooltip>\n );\n};\nKebab.factory = kebabFactory;\nKebab.columnClass = 'dropdown-kebab-pf pf-v5-c-table__action';\nKebab.getExtensionsActionsForKind = getExtensionsKebabActionsForKind;\n\nexport type KebabOption = {\n hidden?: boolean;\n label?: React.ReactNode;\n labelKey?: string;\n labelKind?: { [key: string]: string | string[] };\n href?: string;\n callback?: () => any;\n accessReview?: AccessReviewResourceAttributes;\n isDisabled?: boolean;\n tooltip?: string;\n tooltipKey?: string;\n // a `/` separated string where each segment denotes a new sub menu entry\n // Eg. `Menu 1/Menu 2/Menu 3`\n path?: string;\n pathKey?: string;\n icon?: React.ReactNode;\n};\n\nexport type KebabAction = (\n kind: K8sKind,\n obj: K8sResourceKind,\n resources?: any,\n customData?: any,\n) => KebabOption;\n\nexport type ResourceKebabProps = {\n kindObj: K8sKind;\n actions: KebabAction[];\n kind: K8sResourceKindReference;\n resource: K8sResourceKind;\n isDisabled?: boolean;\n customData?: { [key: string]: any };\n terminatingTooltip?: string;\n};\n\n// eslint-disable-next-line no-redeclare\ntype KebabSubMenu = {\n label?: string;\n labelKey?: string;\n children: KebabMenuOption[];\n};\n\nexport type KebabMenuOption = KebabSubMenu | KebabOption;\n\ntype KebabProps = {\n options: KebabOption[];\n isDisabled?: boolean;\n terminatingTooltip?: string;\n active?: boolean;\n id?: string;\n};\n\ntype KebabItemProps = {\n option: KebabOption;\n onClick: (event: React.MouseEvent<{}>, option: KebabOption) => void;\n autoFocus?: boolean;\n onEscape?: () => void;\n};\n\nexport type KebabItemsProps = {\n options: KebabOption[];\n onClick: (event: React.MouseEvent<{}>, option: KebabOption) => void;\n focusItem?: KebabOption;\n className?: string;\n};\n\nexport type KebabFactory = { [name: string]: KebabAction } & { common?: KebabAction[] };\n\ntype KebabStaticProperties = {\n columnClass: string;\n factory: KebabFactory;\n getExtensionsActionsForKind: (kind: K8sKind) => KebabAction[];\n};\n\ntype KebabComponent = React.FC<KebabProps> & KebabStaticProperties;\nKebabItems.displayName = 'KebabItems';\nResourceKebab.displayName = 'ResourceKebab';\n","import * as _ from 'lodash-es';\n\nexport const units = {};\nexport const validate = {};\n\nconst TYPES = {\n numeric: {\n units: ['', 'k', 'm', 'b'],\n space: false,\n divisor: 1000,\n },\n decimalBytes: {\n units: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB'],\n space: true,\n divisor: 1000,\n },\n decimalBytesWithoutB: {\n units: ['', 'k', 'M', 'G', 'T', 'P', 'E'],\n space: true,\n divisor: 1000,\n },\n binaryBytes: {\n units: ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'],\n space: true,\n divisor: 1024,\n },\n binaryBytesWithoutB: {\n units: ['i', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei'],\n space: true,\n divisor: 1024,\n },\n SI: {\n units: ['', 'k', 'M', 'G', 'T', 'P', 'E'],\n space: false,\n divisor: 1000,\n },\n decimalBytesPerSec: {\n units: ['Bps', 'KBps', 'MBps', 'GBps', 'TBps', 'PBps', 'EBps'],\n space: true,\n divisor: 1000,\n },\n packetsPerSec: {\n units: ['pps', 'kpps'],\n space: true,\n divisor: 1000,\n },\n seconds: {\n units: ['ns', 'μs', 'ms', 's'],\n space: true,\n divisor: 1000,\n },\n};\n\nexport const getType = (name) => {\n const type = TYPES[name];\n if (!_.isPlainObject(type)) {\n return {\n units: [],\n space: false,\n divisor: 1000,\n };\n }\n return type;\n};\n\nconst convertBaseValueToUnits = (value, unitArray, divisor, initialUnit, preferredUnit) => {\n const sliceIndex = initialUnit ? unitArray.indexOf(initialUnit) : 0;\n const units_ = unitArray.slice(sliceIndex);\n\n if (preferredUnit || preferredUnit === '') {\n const unitIndex = units_.indexOf(preferredUnit);\n if (unitIndex !== -1) {\n return {\n value: value / divisor ** unitIndex,\n unit: preferredUnit,\n };\n }\n }\n\n let unit = units_.shift();\n while (value >= divisor && units_.length > 0) {\n value = value / divisor;\n unit = units_.shift();\n }\n return { value, unit };\n};\n\nconst convertValueWithUnitsToBaseValue = (value, unitArray, divisor) => {\n const defaultReturn = { value, unit: '' };\n if (typeof value !== 'string') {\n return defaultReturn;\n }\n\n let units_ = unitArray.slice().reverse();\n\n // find which unit we're given\n let truncateStringAt = -1;\n const startingUnitIndex = _.findIndex(units_, function (currentUnitValue) {\n const index = value.indexOf(currentUnitValue);\n if (index > -1) {\n truncateStringAt = index;\n return true;\n }\n return false;\n });\n if (startingUnitIndex <= 0) {\n // can't parse\n return defaultReturn;\n }\n\n // get the numeric value & prepare unit array for conversion\n units_ = units_.slice(startingUnitIndex);\n value = value.substring(0, truncateStringAt);\n value = _.toNumber(value);\n\n let unit = units_.shift();\n while (units_.length > 0) {\n value = value * divisor;\n unit = units_.shift();\n }\n\n return { value, unit };\n};\n\nconst getDefaultFractionDigits = (value) => {\n if (value < 1) {\n return 3;\n }\n if (value < 100) {\n return 2;\n }\n return 1;\n};\n\nconst formatValue = (value, options) => {\n const fractionDigits = getDefaultFractionDigits(value);\n const { locales, ...rest } = _.defaults(options, {\n maximumFractionDigits: fractionDigits,\n });\n\n // 2nd check converts -0 to 0.\n if (!isFinite(value) || value === 0) {\n value = 0;\n }\n return Intl.NumberFormat(locales, rest).format(value);\n};\n\nconst round = (units.round = (value, fractionDigits) => {\n if (!isFinite(value)) {\n return 0;\n }\n const multiplier = Math.pow(10, fractionDigits || getDefaultFractionDigits(value));\n return Math.round(value * multiplier) / multiplier;\n});\n\nconst humanize = (units.humanize = (\n value,\n typeName,\n useRound = false,\n initialUnit,\n preferredUnit,\n) => {\n const type = getType(typeName);\n\n if (!isFinite(value)) {\n value = 0;\n }\n\n let converted = convertBaseValueToUnits(\n value,\n type.units,\n type.divisor,\n initialUnit,\n preferredUnit,\n );\n\n if (useRound) {\n converted.value = round(converted.value);\n converted = convertBaseValueToUnits(\n converted.value,\n type.units,\n type.divisor,\n converted.unit,\n preferredUnit,\n );\n }\n\n const formattedValue = formatValue(converted.value);\n\n return {\n string: type.space ? `${formattedValue} ${converted.unit}` : formattedValue + converted.unit,\n unit: converted.unit,\n value: converted.value,\n };\n});\n\nconst formatPercentage = (value, options) => {\n const { locales, ...rest } = _.defaults(\n { style: 'percent' }, // Don't allow perent style to be overridden.\n options,\n {\n maximumFractionDigits: 1,\n },\n );\n return Intl.NumberFormat(locales, rest).format(value);\n};\n\nexport const humanizeBinaryBytesWithoutB = (v, initialUnit, preferredUnit) =>\n humanize(v, 'binaryBytesWithoutB', true, initialUnit, preferredUnit);\nexport const humanizeBinaryBytes = (v, initialUnit, preferredUnit) =>\n humanize(v, 'binaryBytes', true, initialUnit, preferredUnit);\nexport const humanizeDecimalBytes = (v, initialUnit, preferredUnit) =>\n humanize(v, 'decimalBytes', true, initialUnit, preferredUnit);\nexport const humanizeDecimalBytesPerSec = (v, initialUnit, preferredUnit) =>\n humanize(v, 'decimalBytesPerSec', true, initialUnit, preferredUnit);\nexport const humanizePacketsPerSec = (v, initialUnit, preferredUnit) =>\n humanize(v, 'packetsPerSec', true, initialUnit, preferredUnit);\nexport const humanizeNumber = (v, initialUnit, preferredUnit) =>\n humanize(v, 'numeric', true, initialUnit, preferredUnit);\nexport const humanizeNumberSI = (v, initialUnit, preferredUnit) =>\n humanize(v, 'SI', true, initialUnit, preferredUnit);\nexport const humanizeSeconds = (v, initialUnit, preferredUnit) =>\n humanize(v, 'seconds', true, initialUnit, preferredUnit);\nexport const humanizeCpuCores = (v) => {\n const value = v < 1 ? round(v * 1000) : v;\n const unit = v < 1 ? 'm' : '';\n return {\n string: `${formatValue(value)}${unit}`,\n unit,\n value,\n };\n};\nexport const humanizePercentage = (value) => {\n // 2nd check converts -0 to 0.\n if (!isFinite(value) || value === 0) {\n value = 0;\n }\n return {\n string: formatPercentage(value / 100),\n unit: '%',\n value: round(value, 1),\n };\n};\n\nunits.dehumanize = (value, typeName) => {\n const type = getType(typeName);\n return convertValueWithUnitsToBaseValue(value, type.units, type.divisor);\n};\n\nvalidate.split = (value) => {\n const index = value.search(/([a-zA-Z]+)/g);\n let number, unit;\n if (index === -1) {\n number = value;\n } else {\n number = value.slice(0, index);\n unit = value.slice(index);\n }\n return [parseFloat(number, 10), unit];\n};\n\nconst baseUnitedValidation = (value) => {\n if (value === null || value.length === 0) {\n return;\n }\n if (value.search(/\\s/g) !== -1) {\n return 'white space is not allowed';\n }\n};\n\nconst validateNumber = (float = '') => {\n if (float < 0) {\n return 'must be positive';\n }\n if (!isFinite(float)) {\n return 'must be a number';\n }\n};\nconst validCPUUnits = new Set(['m', '']);\nconst validateCPUUnit = (value = '') => {\n if (validCPUUnits.has(value)) {\n return;\n }\n return `unrecongnized unit: ${value}`;\n};\n\nvalidate.CPU = (value = '') => {\n if (!value) {\n return;\n }\n const error = baseUnitedValidation(value);\n if (error) {\n return error;\n }\n\n const [number, unit] = validate.split(value);\n\n if (!unit) {\n return validateNumber(number);\n }\n\n return validateNumber(number) || validateCPUUnit(unit);\n};\n\nconst validMemUnits = new Set(['E', 'P', 'T', 'G', 'M', 'k', 'Pi', 'Ti', 'Gi', 'Mi', 'Ki']);\nconst validateMemUnit = (value = '') => {\n if (validMemUnits.has(value)) {\n return;\n }\n return `unrecongnized unit: ${value}`;\n};\n\nconst validTimeUnits = new Set(['s', 'm', 'h', 'd', 'M', 'y']);\nconst validateTimeUnit = (value = '') => {\n if (validTimeUnits.has(value)) {\n return;\n }\n return `unrecongnized unit: ${value}`;\n};\n\nvalidate.time = (value = '') => {\n if (!value) {\n return;\n }\n const error = baseUnitedValidation(value);\n if (error) {\n return error;\n }\n\n const [number, unit] = validate.split(value);\n\n if (!unit) {\n return 'number and unit required';\n }\n\n return validateNumber(number) || validateTimeUnit(unit);\n};\n\nvalidate.memory = (value = '') => {\n if (!value) {\n return;\n }\n const error = baseUnitedValidation(value);\n if (error) {\n return error;\n }\n\n const [number, unit] = validate.split(value);\n\n if (!unit) {\n return validateNumber(value);\n }\n\n return validateNumber(number) || validateMemUnit(unit);\n};\n\n// Convert k8s compute resources values to a base value for comparison.\n// If the value has no unit, it just returns the number, so this function\n// can be used for any quota resource (resource counts). `units.dehumanize`\n// is problematic for comparing quota resources because you need to know\n// what unit you're dealing with already (e.g. decimal vs binary). Returns\n// null if value isn't recognized as valid.\nexport const convertToBaseValue = (value) => {\n if (!_.isString(value)) {\n return null;\n }\n\n const [number, unit] = validate.split(value);\n const validationError = validateNumber(number);\n if (validationError) {\n return null;\n }\n\n if (!unit) {\n return number;\n }\n\n // Handle CPU millicores specifically.\n if (unit === 'm') {\n return number / 1000;\n }\n\n if (TYPES.binaryBytesWithoutB.units.includes(unit)) {\n return units.dehumanize(value, 'binaryBytesWithoutB').value;\n }\n\n if (TYPES.decimalBytesWithoutB.units.includes(unit)) {\n return units.dehumanize(value, 'decimalBytesWithoutB').value;\n }\n\n // Unrecognized unit.\n return null;\n};\n\nexport const secondsToNanoSeconds = (value) => {\n const val = Number(value);\n return Number.isFinite(val) ? val * 1000 ** 3 : 0;\n};\n\nexport const formatToFractionalDigits = (value, digits) =>\n Intl.NumberFormat(undefined, {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n }).format(value);\n\nexport const formatBytesAsMiB = (bytes) => {\n const mib = bytes / 1024 / 1024;\n return formatToFractionalDigits(mib, 1);\n};\n\nexport const formatBytesAsGiB = (bytes) => {\n const gib = bytes / 1024 / 1024 / 1024;\n return formatToFractionalDigits(gib, 2);\n};\n\nexport const formatCores = (cores) => formatToFractionalDigits(cores, 3);\n","import * as _ from 'lodash-es';\nimport { createBrowserHistory, createMemoryHistory, History } from 'history';\n\nlet createHistory;\n\ntry {\n if (process.env.NODE_ENV === 'test') {\n // Running in node. Can't use browser history\n createHistory = createMemoryHistory;\n } else {\n createHistory = createBrowserHistory;\n }\n} catch (unused) {\n createHistory = createBrowserHistory;\n}\n\nexport const history: History = createHistory({ basename: window.SERVER_FLAGS.basePath });\n\nconst removeBasePath = (url = '/') =>\n _.startsWith(url, window.SERVER_FLAGS.basePath)\n ? url.slice(window.SERVER_FLAGS.basePath.length - 1)\n : url;\n\n// Monkey patch history to slice off the base path\n(history as any).__replace__ = history.replace;\nhistory.replace = (url: string) => (history as any).__replace__(removeBasePath(url));\n\n(history as any).__push__ = history.push;\nhistory.push = (url: string) => (history as any).__push__(removeBasePath(url));\n\nexport const getQueryArgument = (arg: string) =>\n new URLSearchParams(window.location.search).get(arg);\n\nexport const setQueryArgument = (k: string, v: string) => {\n const params = new URLSearchParams(window.location.search);\n if (params.get(k) !== v) {\n params.set(k, v);\n const url = new URL(window.location.href);\n history.replace(`${url.pathname}?${params.toString()}${url.hash}`);\n }\n};\n\nexport const setQueryArguments = (newParams: { [k: string]: string }) => {\n const params = new URLSearchParams(window.location.search);\n let update = false;\n _.each(newParams, (v, k) => {\n if (params.get(k) !== v) {\n update = true;\n params.set(k, v);\n }\n });\n if (update) {\n const url = new URL(window.location.href);\n history.replace(`${url.pathname}?${params.toString()}${url.hash}`);\n }\n};\n\nexport const setAllQueryArguments = (newParams: { [k: string]: string }) => {\n const params = new URLSearchParams();\n let update = false;\n _.each(newParams, (v, k) => {\n if (params.get(k) !== v) {\n update = true;\n params.set(k, v);\n }\n });\n if (update) {\n const url = new URL(window.location.href);\n history.replace(`${url.pathname}?${params.toString()}${url.hash}`);\n }\n};\n\nexport const removeQueryArgument = (k: string) => {\n const params = new URLSearchParams(window.location.search);\n if (params.has(k)) {\n params.delete(k);\n const url = new URL(window.location.href);\n history.replace(`${url.pathname}?${params.toString()}${url.hash}`);\n }\n};\n\nexport const removeQueryArguments = (...keys: string[]) => {\n const params = new URLSearchParams(window.location.search);\n let update = false;\n keys.forEach((k) => {\n if (params.has(k)) {\n update = true;\n params.delete(k);\n }\n });\n if (update) {\n const url = new URL(window.location.href);\n history.replace(`${url.pathname}?${params.toString()}${url.hash}`);\n }\n};\n\nexport const setOrRemoveQueryArgument = (k: string, v: string) =>\n v ? setQueryArgument(k, v) : removeQueryArgument(k);\n","import * as React from 'react';\nimport { CreateProjectModalProps } from '@console/dynamic-plugin-sdk/src';\nimport { useModal } from '@console/dynamic-plugin-sdk/src/app/modal-support/useModal';\nimport { FLAGS } from '@console/shared/src/constants/common';\nimport { useFlag } from '@console/shared/src/hooks/flag';\nimport { CreateNamespaceModal } from '../components/modals/CreateNamespaceModal';\nimport { CreateProjectModal } from '../components/modals/CreateProjectModal';\n\nexport const useCreateNamespaceOrProjectModal: UseCreateProjectModal = () => {\n const launcher = useModal();\n const isOpenShift = useFlag(FLAGS.OPENSHIFT);\n const ModalComponent = isOpenShift ? CreateProjectModal : CreateNamespaceModal;\n return React.useCallback((props) => launcher(ModalComponent, props), [launcher, ModalComponent]);\n};\n\ntype UseCreateProjectModal = () => (props: CreateProjectModalProps) => void;\n","import { Map as ImmutableMap } from 'immutable';\nimport { ResourceDetailsPage, ResourcePage, ResourceListPage } from '@console/plugin-sdk';\nimport {\n ResourceDetailsPage as DynamicResourceDetailsPage,\n ResourceListPage as DynamicResourceListPage,\n} from '@console/dynamic-plugin-sdk';\nimport { referenceForModel, GroupVersionKind, referenceForExtensionModel } from '../module/k8s';\nimport {\n AlertmanagerModel,\n AppliedClusterResourceQuotaModel,\n BuildConfigModel,\n BuildModel,\n ClusterOperatorModel,\n ClusterRoleModel,\n ClusterVersionModel,\n ConfigMapModel,\n ContainerModel,\n CronJobModel,\n ClusterResourceQuotaModel,\n CustomResourceDefinitionModel,\n DaemonSetModel,\n DeploymentConfigModel,\n DeploymentModel,\n GroupModel,\n HorizontalPodAutoscalerModel,\n ImageStreamModel,\n ImageStreamTagModel,\n JobModel,\n LimitRangeModel,\n MachineAutoscalerModel,\n MachineConfigModel,\n MachineConfigPoolModel,\n MachineHealthCheckModel,\n MachineModel,\n MachineSetModel,\n NamespaceModel,\n NodeModel,\n PersistentVolumeClaimModel,\n PersistentVolumeModel,\n PodModel,\n ProjectModel,\n PrometheusModel,\n ReplicaSetModel,\n ReplicationControllerModel,\n ResourceQuotaModel,\n RoleBindingModel,\n RoleModel,\n SecretModel,\n ServiceAccountModel,\n ServiceMonitorModel,\n StatefulSetModel,\n StorageClassModel,\n TemplateInstanceModel,\n UserModel,\n VolumeSnapshotModel,\n VolumeSnapshotClassModel,\n ClusterRoleBindingModel,\n} from '../models';\nimport { PodDisruptionBudgetModel } from '@console/app/src/models';\n\nconst addResourcePage = (\n map: ImmutableMap<ResourceMapKey, ResourceMapValue>,\n page: ResourcePage,\n) => {\n const key = page.properties?.modelParser\n ? page.properties?.modelParser(page.properties.model)\n : referenceForModel(page.properties.model);\n if (!map.has(key)) {\n map.set(key, page.properties.loader);\n }\n};\n\nconst addDynamicResourcePage = (\n map: ImmutableMap<ResourceMapKey, ResourceMapValue>,\n page: DynamicResourcePage,\n) => {\n const key = referenceForExtensionModel(page.properties.model);\n if (!map.has(key)) {\n map.set(key, page.properties.component);\n }\n};\n\ntype ResourceMapKey = GroupVersionKind | string;\ntype ResourceMapValue = () => Promise<React.ComponentType<any>>;\ntype DynamicResourcePage = DynamicResourceListPage | DynamicResourceDetailsPage;\n\nexport const baseDetailsPages = ImmutableMap<ResourceMapKey, ResourceMapValue>()\n .set(referenceForModel(ConfigMapModel), () =>\n import('./configmap' /* webpackChunkName: \"configmap\" */).then((m) => m.ConfigMapsDetailsPage),\n )\n .set(referenceForModel(ContainerModel), () =>\n import('./container' /* webpackChunkName: \"container\" */).then((m) => m.ContainersDetailsPage),\n )\n .set(referenceForModel(DaemonSetModel), () =>\n import('./daemon-set' /* webpackChunkName: \"daemon-set\" */).then(\n (m) => m.DaemonSetsDetailsPage,\n ),\n )\n .set(referenceForModel(DeploymentConfigModel), () =>\n import('./deployment-config' /* webpackChunkName: \"deployment-config\" */).then(\n (m) => m.DeploymentConfigsDetailsPage,\n ),\n )\n .set(referenceForModel(DeploymentModel), () =>\n import('./deployment' /* webpackChunkName: \"deployment\" */).then(\n (m) => m.DeploymentsDetailsPage,\n ),\n )\n .set(referenceForModel(BuildConfigModel), () =>\n import('./build-config' /* webpackChunkName: \"build-config\" */).then(\n (m) => m.BuildConfigsDetailsPage,\n ),\n )\n .set(referenceForModel(BuildModel), () =>\n import('./build' /* webpackChunkName: \"build\" */).then((m) => m.BuildsDetailsPage),\n )\n .set(referenceForModel(ImageStreamModel), () =>\n import('./image-stream' /* webpackChunkName: \"image-stream\" */).then(\n (m) => m.ImageStreamsDetailsPage,\n ),\n )\n .set(referenceForModel(ImageStreamTagModel), () =>\n import('./image-stream-tag' /* webpackChunkName: \"image-stream-tag\" */).then(\n (m) => m.ImageStreamTagsDetailsPage,\n ),\n )\n .set(referenceForModel(JobModel), () =>\n import('./job' /* webpackChunkName: \"job\" */).then((m) => m.JobsDetailsPage),\n )\n .set(referenceForModel(CronJobModel), () =>\n import('./cron-job' /* webpackChunkName: \"cron-job\" */).then((m) => m.CronJobsDetailsPage),\n )\n .set(referenceForModel(ProjectModel), () =>\n import('./namespace' /* webpackChunkName: \"namespace\" */).then((m) => m.ProjectsDetailsPage),\n )\n .set(referenceForModel(NamespaceModel), () =>\n import('./namespace' /* webpackChunkName: \"namespace\" */).then((m) => m.NamespacesDetailsPage),\n )\n .set(referenceForModel(NodeModel), () =>\n import(\n '@console/app/src/components/nodes/NodeDetailsPage' /* webpackChunkName: \"node-detail\" */\n ).then((m) => m.default),\n )\n .set(referenceForModel(MachineAutoscalerModel), () =>\n import('./machine-autoscaler' /* webpackChunkName: \"machine-autoscaler\" */).then(\n (m) => m.MachineAutoscalerDetailsPage,\n ),\n )\n .set(referenceForModel(MachineConfigModel), () =>\n import('./machine-config' /* webpackChunkName: \"machine-config\" */).then(\n (m) => m.MachineConfigDetailsPage,\n ),\n )\n .set(referenceForModel(MachineConfigPoolModel), () =>\n import('./machine-config-pool' /* webpackChunkName: \"machine-config-pool\" */).then(\n (m) => m.MachineConfigPoolDetailsPage,\n ),\n )\n .set(referenceForModel(MachineModel), () =>\n import('./machine' /* webpackChunkName: \"machine\" */).then((m) => m.MachineDetailsPage),\n )\n .set(referenceForModel(MachineSetModel), () =>\n import('./machine-set' /* webpackChunkName: \"machine-set\" */).then(\n (m) => m.MachineSetDetailsPage,\n ),\n )\n .set(referenceForModel(MachineHealthCheckModel), () =>\n import('./machine-health-check' /* webpackChunkName: \"machine-health-check\" */).then(\n (m) => m.MachineHealthCheckDetailsPage,\n ),\n )\n .set(referenceForModel(PodModel), () =>\n import('./pod' /* webpackChunkName: \"pod\" */).then((m) => m.PodsDetailsPage),\n )\n .set(referenceForModel(ReplicaSetModel), () =>\n import('./replicaset' /* webpackChunkName: \"replicaset\" */).then(\n (m) => m.ReplicaSetsDetailsPage,\n ),\n ) //TODO should be replica-set\n .set(referenceForModel(ReplicationControllerModel), () =>\n import('./replication-controller' /* webpackChunkName: \"replication-controller\" */).then(\n (m) => m.ReplicationControllersDetailsPage,\n ),\n )\n .set(referenceForModel(SecretModel), () =>\n import('./secret' /* webpackChunkName: \"secret\" */).then((m) => m.SecretsDetailsPage),\n )\n .set(referenceForModel(ServiceAccountModel), () =>\n import('./service-account' /* webpackChunkName: \"service-account\" */).then(\n (m) => m.ServiceAccountsDetailsPage,\n ),\n )\n .set(referenceForModel(ClusterRoleModel), () =>\n import('./RBAC/role' /* webpackChunkName: \"role\" */).then((m) => m.ClusterRolesDetailsPage),\n )\n .set(referenceForModel(RoleModel), () =>\n import('./RBAC/role' /* webpackChunkName: \"role\" */).then((m) => m.RolesDetailsPage),\n )\n .set(referenceForModel(ClusterRoleBindingModel), () =>\n import('./RBAC/role' /* webpackChunkName: \"role\" */).then(\n (m) => m.ClusterRoleBindingsDetailsPage,\n ),\n )\n .set(referenceForModel(UserModel), () =>\n import('./user' /* webpackChunkName: \"user\" */).then((m) => m.UserDetailsPage),\n )\n .set(referenceForModel(GroupModel), () =>\n import('./group' /* webpackChunkName: \"group\" */).then((m) => m.GroupDetailsPage),\n )\n .set(referenceForModel(AlertmanagerModel), () =>\n import('./alert-manager' /* webpackChunkName: \"alert-manager\" */).then(\n (m) => m.AlertManagersDetailsPage,\n ),\n )\n .set(referenceForModel(StatefulSetModel), () =>\n import('./stateful-set' /* webpackChunkName: \"stateful-set\" */).then(\n (m) => m.StatefulSetsDetailsPage,\n ),\n )\n .set(referenceForModel(ResourceQuotaModel), () =>\n import('./resource-quota' /* webpackChunkName: \"resource-quota\" */).then(\n (m) => m.ResourceQuotasDetailsPage,\n ),\n )\n .set(referenceForModel(ClusterResourceQuotaModel), () =>\n import('./resource-quota' /* webpackChunkName: \"resource-quota\" */).then(\n (m) => m.ResourceQuotasDetailsPage,\n ),\n )\n .set(referenceForModel(AppliedClusterResourceQuotaModel), () =>\n import('./resource-quota' /* webpackChunkName: \"resource-quota\" */).then(\n (m) => m.AppliedClusterResourceQuotasDetailsPage,\n ),\n )\n .set(referenceForModel(LimitRangeModel), () =>\n import('./limit-range' /* webpackChunkName: \"limit-range\" */).then(\n (m) => m.LimitRangeDetailsPage,\n ),\n )\n .set(referenceForModel(HorizontalPodAutoscalerModel), () =>\n import('./hpa' /* webpackChunkName: \"hpa\" */).then(\n (m) => m.HorizontalPodAutoscalersDetailsPage,\n ),\n )\n .set(referenceForModel(PersistentVolumeModel), () =>\n import('./persistent-volume' /* webpackChunkName: \"persistent-volume\" */).then(\n (m) => m.PersistentVolumesDetailsPage,\n ),\n )\n .set(referenceForModel(PersistentVolumeClaimModel), () =>\n import('./persistent-volume-claim' /* webpackChunkName: \"persistent-volume-claim\" */).then(\n (m) => m.PersistentVolumeClaimsDetailsPage,\n ),\n )\n .set(referenceForModel(StorageClassModel), () =>\n import('./storage-class' /* webpackChunkName: \"storage-class\" */).then(\n (m) => m.StorageClassDetailsPage,\n ),\n )\n .set(referenceForModel(TemplateInstanceModel), () =>\n import('./template-instance' /* webpackChunkName: \"template-instance\" */).then(\n (m) => m.TemplateInstanceDetailsPage,\n ),\n )\n .set(referenceForModel(CustomResourceDefinitionModel), () =>\n import(\n './custom-resource-definition' /* webpackChunkName: \"custom-resource-definition\" */\n ).then((m) => m.CustomResourceDefinitionsDetailsPage),\n )\n .set(referenceForModel(ClusterOperatorModel), () =>\n import('./cluster-settings/cluster-operator' /* webpackChunkName: \"cluster-operator\" */).then(\n (m) => m.ClusterOperatorDetailsPage,\n ),\n )\n .set(referenceForModel(ClusterVersionModel), () =>\n import('./cluster-settings/cluster-version' /* webpackChunkName: \"cluster-version\" */).then(\n (m) => m.ClusterVersionDetailsPage,\n ),\n )\n .set(referenceForModel(PodDisruptionBudgetModel), () =>\n import('@console/app/src/components/pdb/PDBDetailsPage' /* webpackChunkName: \"pdb\" */).then(\n (m) => m.PodDisruptionBudgetDetailsPage,\n ),\n )\n .set(referenceForModel(VolumeSnapshotModel), () =>\n import(\n '@console/app/src/components/volume-snapshot/volume-snapshot-details' /* webpackChunkName: \"volume-snapshot-details\" */\n ).then((m) => m.default),\n )\n .set(referenceForModel(VolumeSnapshotClassModel), () =>\n import(\n '@console/app/src/components/volume-snapshot/volume-snapshot-class-details' /* webpackChunkName: \"volume-snapshot-class-details\" */\n ).then((m) => m.default),\n );\n\nexport const getResourceDetailsPages = (\n pluginPages: ResourceDetailsPage[] = [],\n dynamicPluginPages: DynamicResourceDetailsPage[] = [],\n) =>\n ImmutableMap<ResourceMapKey, ResourceMapValue>()\n .merge(baseDetailsPages)\n .withMutations((map) => {\n pluginPages.forEach((page) => {\n addResourcePage(map, page);\n });\n dynamicPluginPages.forEach((page) => {\n addDynamicResourcePage(map, page);\n });\n });\n\nexport const baseListPages = ImmutableMap<ResourceMapKey, ResourceMapValue>()\n .set(referenceForModel(ConfigMapModel), () =>\n import('./configmap' /* webpackChunkName: \"configmap\" */).then((m) => m.ConfigMapsPage),\n )\n .set(referenceForModel(DaemonSetModel), () =>\n import('./daemon-set' /* webpackChunkName: \"daemon-set\" */).then((m) => m.DaemonSetsPage),\n )\n .set(referenceForModel(DeploymentConfigModel), () =>\n import('./deployment-config' /* webpackChunkName: \"deployment-config\" */).then(\n (m) => m.DeploymentConfigsPage,\n ),\n )\n .set(referenceForModel(DeploymentModel), () =>\n import('./deployment' /* webpackChunkName: \"deployment\" */).then((m) => m.DeploymentsPage),\n )\n .set(referenceForModel(BuildConfigModel), () =>\n import('./build-config' /* webpackChunkName: \"build-config\" */).then((m) => m.BuildConfigsPage),\n )\n .set(referenceForModel(BuildModel), () =>\n import('./build' /* webpackChunkName: \"build\" */).then((m) => m.BuildsPage),\n )\n .set(referenceForModel(ImageStreamModel), () =>\n import('./image-stream' /* webpackChunkName: \"image-stream\" */).then((m) => m.ImageStreamsPage),\n )\n .set(referenceForModel(JobModel), () =>\n import('./job' /* webpackChunkName: \"job\" */).then((m) => m.JobsPage),\n )\n .set(referenceForModel(CronJobModel), () =>\n import('./cron-job' /* webpackChunkName: \"cron-job\" */).then((m) => m.CronJobsPage),\n )\n .set(referenceForModel(ProjectModel), () =>\n import('./namespace' /* webpackChunkName: \"namespace\" */).then((m) => m.ProjectsPage),\n )\n .set(referenceForModel(NamespaceModel), () =>\n import('./namespace' /* webpackChunkName: \"namespace\" */).then((m) => m.NamespacesPage),\n )\n .set(referenceForModel(NodeModel), () =>\n import('@console/app/src/components/nodes/NodesPage' /* webpackChunkName: \"node\" */).then(\n (m) => m.default,\n ),\n )\n .set(referenceForModel(MachineAutoscalerModel), () =>\n import('./machine-autoscaler' /* webpackChunkName: \"machine-autoscaler\" */).then(\n (m) => m.MachineAutoscalerPage,\n ),\n )\n .set(referenceForModel(MachineConfigModel), () =>\n import('./machine-config' /* webpackChunkName: \"machine-config\" */).then(\n (m) => m.MachineConfigPage,\n ),\n )\n .set(referenceForModel(MachineConfigPoolModel), () =>\n import('./machine-config-pool' /* webpackChunkName: \"machine-config-pool\" */).then(\n (m) => m.MachineConfigPoolPage,\n ),\n )\n .set(referenceForModel(MachineModel), () =>\n import('./machine' /* webpackChunkName: \"machine\" */).then((m) => m.MachinePage),\n )\n .set(referenceForModel(MachineHealthCheckModel), () =>\n import('./machine-health-check' /* webpackChunkName: \"machine-health-check\" */).then(\n (m) => m.MachineHealthCheckPage,\n ),\n )\n .set(referenceForModel(MachineSetModel), () =>\n import('./machine-set' /* webpackChunkName: \"machine-set\" */).then((m) => m.MachineSetPage),\n )\n .set(referenceForModel(PodModel), () =>\n import('./pod' /* webpackChunkName: \"pod\" */).then((m) => m.PodsPage),\n )\n .set(referenceForModel(ReplicaSetModel), () =>\n import('./replicaset' /* webpackChunkName: \"replicaset\" */).then((m) => m.ReplicaSetsPage),\n ) //TODO should be replica-set\n .set(referenceForModel(ReplicationControllerModel), () =>\n import('./replication-controller' /* webpackChunkName: \"replication-controller\" */).then(\n (m) => m.ReplicationControllersPage,\n ),\n )\n .set(referenceForModel(SecretModel), () =>\n import('./secret' /* webpackChunkName: \"secret\" */).then((m) => m.SecretsPage),\n )\n .set(referenceForModel(ServiceAccountModel), () =>\n import('./service-account' /* webpackChunkName: \"service-account\" */).then(\n (m) => m.ServiceAccountsPage,\n ),\n )\n .set(referenceForModel(RoleModel), () =>\n import('./RBAC/role' /* webpackChunkName: \"role\" */).then((m) => m.RolesPage),\n )\n .set(referenceForModel(RoleBindingModel), () =>\n import('./RBAC/bindings' /* webpackChunkName: \"bindings\" */).then((m) => m.RoleBindingsPage),\n )\n .set(referenceForModel(UserModel), () =>\n import('./user' /* webpackChunkName: \"user\" */).then((m) => m.UserPage),\n )\n .set(referenceForModel(GroupModel), () =>\n import('./group' /* webpackChunkName: \"group\" */).then((m) => m.GroupPage),\n )\n .set(referenceForModel(PrometheusModel), () =>\n import('./prometheus' /* webpackChunkName: \"prometheus\" */).then(\n (m) => m.PrometheusInstancesPage,\n ),\n )\n .set(referenceForModel(ServiceMonitorModel), () =>\n import('./service-monitor' /* webpackChunkName: \"service-monitor\" */).then(\n (m) => m.ServiceMonitorsPage,\n ),\n )\n .set(referenceForModel(AlertmanagerModel), () =>\n import('./alert-manager' /* webpackChunkName: \"alert-manager\" */).then(\n (m) => m.AlertManagersPage,\n ),\n )\n .set(referenceForModel(StatefulSetModel), () =>\n import('./stateful-set' /* webpackChunkName: \"stateful-set\" */).then((m) => m.StatefulSetsPage),\n )\n .set(referenceForModel(ResourceQuotaModel), () =>\n import('./resource-quota' /* webpackChunkName: \"resource-quota\" */).then(\n (m) => m.ResourceQuotasPage,\n ),\n )\n .set(referenceForModel(AppliedClusterResourceQuotaModel), () =>\n import('./resource-quota' /* webpackChunkName: \"resource-quota\" */).then(\n (m) => m.AppliedClusterResourceQuotasPage,\n ),\n )\n .set(referenceForModel(LimitRangeModel), () =>\n import('./limit-range' /* webpackChunkName: \"limit-range\" */).then((m) => m.LimitRangeListPage),\n )\n .set(referenceForModel(HorizontalPodAutoscalerModel), () =>\n import('./hpa' /* webpackChunkName: \"hpa\" */).then((m) => m.HorizontalPodAutoscalersPage),\n )\n .set(referenceForModel(PersistentVolumeModel), () =>\n import('./persistent-volume' /* webpackChunkName: \"persistent-volume\" */).then(\n (m) => m.PersistentVolumesPage,\n ),\n )\n .set(referenceForModel(PersistentVolumeClaimModel), () =>\n import('./persistent-volume-claim' /* webpackChunkName: \"persistent-volume-claim\" */).then(\n (m) => m.PersistentVolumeClaimsPage,\n ),\n )\n .set(referenceForModel(StorageClassModel), () =>\n import('./storage-class' /* webpackChunkName: \"storage-class\" */).then(\n (m) => m.StorageClassPage,\n ),\n )\n .set(referenceForModel(TemplateInstanceModel), () =>\n import('./template-instance' /* webpackChunkName: \"template-instance\" */).then(\n (m) => m.TemplateInstancePage,\n ),\n )\n .set(referenceForModel(CustomResourceDefinitionModel), () =>\n import(\n './custom-resource-definition' /* webpackChunkName: \"custom-resource-definition\" */\n ).then((m) => m.CustomResourceDefinitionsPage),\n )\n .set(referenceForModel(ClusterOperatorModel), () =>\n import('./cluster-settings/cluster-operator' /* webpackChunkName: \"cluster-operator\" */).then(\n (m) => m.ClusterOperatorPage,\n ),\n )\n .set(referenceForModel(PodDisruptionBudgetModel), () =>\n import('@console/app/src/components/pdb/PDBPage' /* webpackChunkName: \"pdb\" */).then(\n (m) => m.PodDisruptionBudgetsPage,\n ),\n )\n .set(referenceForModel(VolumeSnapshotModel), () =>\n import(\n '@console/app/src/components/volume-snapshot/volume-snapshot' /* webpackChunkName: \"volume-snapshot\" */\n ).then((m) => m.default),\n )\n .set(referenceForModel(VolumeSnapshotClassModel), () =>\n import(\n '@console/app/src/components/volume-snapshot/volume-snapshot-class' /* webpackChunkName: \"volume-snapshot-class\" */\n ).then((m) => m.default),\n );\n\nexport const getResourceListPages = (\n pluginPages: ResourceListPage[] = [],\n dynamicPluginPages: DynamicResourceListPage[] = [],\n) =>\n ImmutableMap<ResourceMapKey, ResourceMapValue>()\n .merge(baseListPages)\n .withMutations((map) => {\n pluginPages.forEach((page) => {\n addResourcePage(map, page);\n });\n dynamicPluginPages.forEach((page) => {\n addDynamicResourcePage(map, page);\n });\n });\n","import i18next from 'i18next';\nimport { K8sKind } from '../../module/k8s';\nimport { LAST_NAMESPACE_NAME_LOCAL_STORAGE_KEY } from '@console/shared/src/constants';\nimport { ALL_NAMESPACES_KEY } from '@console/shared/src/constants/common';\nimport { breadcrumbsForGlobalConfig } from '../cluster-settings/global-config';\n\nexport const getLastNamespace = () => sessionStorage.getItem(LAST_NAMESPACE_NAME_LOCAL_STORAGE_KEY);\n\nexport const getBreadcrumbPath = (params: any, customPlural?: string) => {\n if (params.ns) {\n return getLastNamespace() === ALL_NAMESPACES_KEY\n ? `/k8s/all-namespaces/${customPlural || params.plural}`\n : `/k8s/ns/${params.ns}/${customPlural || params.plural}`;\n }\n return `/k8s/cluster/${customPlural || params.plural}`;\n};\n\nexport const breadcrumbsForDetailsPage = (kindObj: K8sKind, params: any, location: any) => () =>\n (kindObj.apiGroup === 'config.openshift.io' && params.name === 'cluster') ||\n kindObj.apiGroup === 'operator.openshift.io'\n ? breadcrumbsForGlobalConfig(i18next.t(kindObj.labelKey) || kindObj.label, location.pathname)\n : [\n {\n name:\n (kindObj.labelPluralKey && i18next.t(kindObj.labelPluralKey)) || kindObj.labelPlural,\n path: getBreadcrumbPath(params),\n },\n {\n name: i18next.t('public~{{kind}} details', {\n kind: (kindObj.labelKey && i18next.t(kindObj.labelKey)) || kindObj.label,\n }),\n path: `${location.pathname}`,\n },\n ];\n","import { requirementFromString } from './selector-requirement';\nimport { MatchExpression } from './index';\n\ntype Options = { undefinedWhenEmpty?: boolean; basic?: boolean };\n\nexport const fromRequirements = (requirements: MatchExpression[], options = {} as Options) => {\n options = options || {};\n const selector = {\n matchLabels: {},\n matchExpressions: [],\n };\n\n if (options.undefinedWhenEmpty && requirements.length === 0) {\n return;\n }\n\n requirements.forEach((r) => {\n if (r.operator === 'Equals') {\n selector.matchLabels[r.key] = r.values[0];\n } else {\n selector.matchExpressions.push(r);\n }\n });\n\n // old selector format?\n if (options.basic) {\n return selector.matchLabels;\n }\n\n return selector;\n};\n\nexport const split = (str: string) => (str.trim() ? str.split(/,(?![^(]*\\))/) : []); // [''] -> []\n\nexport const selectorFromString = (str: string) => {\n const requirements = split(str || '').map(requirementFromString) as MatchExpression[];\n return fromRequirements(requirements);\n};\n","export { default } from './CloseButton';\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport { useLocation } from 'react-router-dom-v5-compat';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useDispatch } from 'react-redux';\nimport {\n Badge,\n Button,\n Toolbar,\n ToolbarChip,\n ToolbarContent,\n ToolbarFilter,\n ToolbarGroup,\n ToolbarItem,\n ToolbarToggleGroup,\n Tooltip,\n} from '@patternfly/react-core';\nimport {\n Select as SelectDeprecated,\n SelectGroup as SelectGroupDeprecated,\n SelectOption as SelectOptionDeprecated,\n SelectVariant as SelectVariantDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { FilterIcon } from '@patternfly/react-icons/dist/esm/icons/filter-icon';\nimport { ColumnsIcon } from '@patternfly/react-icons/dist/esm/icons/columns-icon';\nimport {\n RowFilterItem,\n ColumnLayout,\n OnFilterChange,\n FilterValue,\n RowSearchFilter,\n} from '@console/dynamic-plugin-sdk';\nimport {\n Dropdown as DropdownInternal,\n setOrRemoveQueryArgument,\n} from '@console/internal/components/utils';\nimport { useTranslation } from 'react-i18next';\nimport AutocompleteInput from './autocomplete';\nimport { storagePrefix } from './row-filter';\nimport { createColumnManagementModal } from './modals';\nimport { useDebounceCallback, useDeepCompareMemoize } from '@console/shared/src';\nimport { TextFilter } from './factory';\nimport { filterList } from '@console/dynamic-plugin-sdk/src/app/k8s/actions/k8s';\nimport useRowFilterFix from './useRowFilterFix';\nimport useLabelSelectionFix from './useLabelSelectionFix';\nimport useSearchFilters from './useSearchFilters';\n\n/**\n * Housing both the row filter and name/label filter in the same file.\n */\n\nenum FilterType {\n NAME = 'Name',\n LABEL = 'Label',\n}\n\nexport const filterTypeMap = Object.freeze({\n [FilterType.LABEL]: 'labels',\n [FilterType.NAME]: 'name',\n});\n\ntype Filter = {\n [key: string]: string[];\n};\n\ntype FilterKeys = {\n [key: string]: string;\n};\n\nexport const FilterToolbar: React.FC<FilterToolbarProps> = ({\n rowFilters,\n data,\n hideColumnManagement,\n hideLabelFilter,\n hideNameLabelFilters,\n columnLayout,\n nameFilterPlaceholder,\n nameFilterTitle,\n labelFilterPlaceholder,\n textFilter = filterTypeMap[FilterType.NAME],\n labelFilter = filterTypeMap[FilterType.LABEL],\n uniqueFilterName,\n reduxIDs,\n onFilterChange,\n labelPath,\n rowSearchFilters = [],\n}) => {\n const dispatch = useDispatch();\n const location = useLocation();\n\n const { t } = useTranslation();\n\n const translatedNameFilterTitle = nameFilterTitle ?? t('public~Name');\n\n const { searchFiltersObject, searchFiltersState, changeSearchFiltersState } = useSearchFilters(\n rowSearchFilters,\n uniqueFilterName,\n );\n\n const translateFilterType = (value: string) => {\n switch (value) {\n case 'Name':\n return translatedNameFilterTitle;\n case 'Label':\n return t('public~Label');\n default:\n return searchFiltersObject?.[value]?.filterGroupName || value;\n }\n };\n\n const filterDropdownItems: Record<string, string> = {\n ...Object.keys(searchFiltersObject || {}).reduce(\n (acc, key) => ({\n ...acc,\n [key]: searchFiltersObject[key].filterGroupName,\n }),\n {},\n ),\n };\n\n if (!hideLabelFilter && !hideNameLabelFilters) {\n filterDropdownItems.LABEL = t('public~Label');\n }\n\n if (!hideNameLabelFilters) {\n filterDropdownItems.NAME = translatedNameFilterTitle;\n }\n\n // use unique name only when only when more than 1 table is in the view\n const nameFilterQueryArgumentKey = uniqueFilterName\n ? `${uniqueFilterName}-${textFilter}`\n : textFilter;\n const labelFilterQueryArgumentKey = uniqueFilterName\n ? `${uniqueFilterName}-${labelFilter}`\n : labelFilter;\n\n const params = new URLSearchParams(location.search);\n const [isOpen, setOpen] = React.useState(false);\n const [nameInputText, setNameInputText] = React.useState(\n params.get(nameFilterQueryArgumentKey) ?? '',\n );\n const [labelInputText, setLabelInputText] = React.useState('');\n\n const [filterType, setFilterType] = React.useState(\n nameInputText || !hideNameLabelFilters\n ? FilterType.NAME\n : Object.keys(searchFiltersState)?.[0] || rowSearchFilters?.[0]?.type,\n );\n\n // Generate rowFilter items and counts. Memoize to minimize re-renders.\n const generatedRowFilters = useDeepCompareMemoize(\n (rowFilters ?? []).map((rowFilter) => ({\n ...rowFilter,\n items: rowFilter.items.map((item) => ({\n ...item,\n count: (rowFilter as RowMatchFilter).isMatch\n ? _.filter(data, (d) => (rowFilter as RowMatchFilter).isMatch(d, item.id)).length\n : _.countBy(data, (rowFilter as RowReducerFilter).reducer)?.[item.id] ?? '0',\n })),\n })),\n );\n\n // Reduce generatedRowFilters once and memoize\n const [filters, filtersNameMap, filterKeys, defaultSelections] = React.useMemo<\n [Filter, FilterKeys, FilterKeys, string[]]\n >(\n () =>\n generatedRowFilters.reduce(\n (\n [filtersAcc, filtersNameMapAcc, filterKeysAcc, defaultSelectedAcc],\n { defaultSelected, filterGroupName, items, type },\n ) => [\n // (rowFilters) => {'rowFilterTypeA': ['staA', 'staB'], 'rowFilterTypeB': ['stbA'] }\n {\n ...filtersAcc,\n [filterGroupName]: (items ?? []).map(({ id }) => id),\n },\n // {id: 'a' , title: 'A'} => filterNameMap['a'] = A\n {\n ...filtersNameMapAcc,\n ...(items ?? []).reduce(\n (itemAcc, { id, title }) => ({\n ...itemAcc,\n [id]: title,\n }),\n {},\n ),\n },\n // (storagePrefix, rowFilters) => { 'rowFilterTypeA' = 'storagePrefix-filterTypeA' ...}\n {\n ...filterKeysAcc,\n [filterGroupName]: `${storagePrefix}${type}`,\n },\n // Default selections\n _.uniq([...defaultSelectedAcc, ...(defaultSelected ?? [])]),\n ],\n [{}, {}, {}, []],\n ),\n [generatedRowFilters],\n );\n const [selectedRowFilters, onRowFilterSearchParamChange, rowFiltersInitialized] = useRowFilterFix(\n params,\n filters,\n filterKeys,\n defaultSelections,\n );\n const [labelSelection, onLabelSelectionChange, labelSelectionInitialized] = useLabelSelectionFix(\n params,\n labelFilterQueryArgumentKey,\n );\n\n // Map row filters to select groups\n const dropdownItems = generatedRowFilters.map((rowFilter) => (\n <SelectGroupDeprecated key={rowFilter.filterGroupName} label={rowFilter.filterGroupName}>\n {rowFilter.items?.map?.((item) =>\n item.hideIfEmpty && (item.count === 0 || item.count === '0') ? (\n <React.Fragment key={item.id} />\n ) : (\n <SelectOptionDeprecated\n data-test-row-filter={item.id}\n key={item.id}\n inputId={item.id}\n value={item.id}\n >\n <span className=\"co-filter-dropdown-item__name\">{item.title}</span>\n <Badge key={item.id} isRead>\n {item.count}\n </Badge>\n </SelectOptionDeprecated>\n ),\n )}\n </SelectGroupDeprecated>\n ));\n\n const applyFilters = React.useCallback(\n (type: string, input: FilterValue) =>\n onFilterChange\n ? onFilterChange(type, input)\n : reduxIDs?.forEach?.((id) => dispatch(filterList(id, type, input))),\n [onFilterChange, reduxIDs, dispatch],\n );\n\n const applyTextFilter = React.useCallback(\n (value: string, filterName: string) => {\n applyFilters(filterName, { selected: [value] });\n },\n [applyFilters],\n );\n\n const searchRowFilters = rowSearchFilters.map((searchFilter) => (\n <ToolbarFilter\n key={searchFilter.type}\n categoryName={translateFilterType(searchFilter.type)}\n deleteChip={() => {\n changeSearchFiltersState(searchFilter.type, '');\n applyTextFilter('', searchFilter.type);\n }}\n chips={searchFiltersState[searchFilter.type] ? [searchFiltersState[searchFilter.type]] : []}\n >\n <></>\n </ToolbarFilter>\n ));\n\n const applyRowFilter = (selected: string[]) => {\n generatedRowFilters?.forEach?.(({ items, type }) => {\n const all = items?.map?.(({ id }) => id) ?? [];\n const recognized = _.intersection(selected, all);\n applyFilters(type, { selected: [...new Set(recognized)], all });\n });\n };\n\n const updateRowFilterSelected = (id: string[]) => {\n const selectedNew = _.xor(selectedRowFilters, id);\n onRowFilterSearchParamChange(selectedNew);\n applyRowFilter(selectedNew);\n };\n\n const clearAllRowFilter = (f: string) => {\n updateRowFilterSelected(_.intersection(filters[f], selectedRowFilters));\n };\n\n const onRowFilterSelect = (event) => {\n updateRowFilterSelected([event?.target?.id]);\n };\n\n const applyLabelFilters = (values: string[]) => {\n setLabelInputText('');\n onLabelSelectionChange(values);\n applyFilters(labelFilter, { all: values });\n };\n\n const applyNameFilter = React.useCallback(\n (value: string) => {\n setOrRemoveQueryArgument(nameFilterQueryArgumentKey, value);\n applyFilters(textFilter, { selected: [value] });\n },\n [applyFilters, nameFilterQueryArgumentKey, textFilter],\n );\n\n const debounceApplyNameFilter = useDebounceCallback(applyNameFilter, 250);\n const debounceApplyTextFilter = useDebounceCallback(applyTextFilter, 250);\n\n const clearAll = () => {\n updateRowFilterSelected(selectedRowFilters);\n if (!hideNameLabelFilters) {\n setNameInputText('');\n applyNameFilter('');\n }\n if (!hideNameLabelFilters || !hideLabelFilter) {\n setLabelInputText('');\n applyLabelFilters([]);\n }\n\n if (rowSearchFilters.length > 0) {\n Object.keys(searchFiltersState).forEach((key) => {\n changeSearchFiltersState(key, '');\n applyTextFilter('', key);\n });\n }\n };\n\n // Run once on mount to apply filters from query params\n React.useEffect(() => {\n if (!hideNameLabelFilters || !hideLabelFilter) {\n applyFilters(labelFilter, { all: labelSelection });\n }\n if (!hideNameLabelFilters) {\n applyFilters(textFilter, { selected: [nameInputText] });\n }\n\n if (rowSearchFilters.length > 0) {\n Object.keys(searchFiltersState).forEach((key) => {\n applyFilters(key, { selected: [searchFiltersState[key]] });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n /**\n * Initialize any external data filters based on the hack-fix data when they are finished init\n * TODO: Remove during https://issues.redhat.com/browse/CONSOLE-3147\n */\n React.useEffect(() => {\n if (rowFiltersInitialized && labelSelectionInitialized) {\n applyFilters(labelFilter, { all: labelSelection });\n applyRowFilter(selectedRowFilters);\n }\n // Trigger the update only when we are initialized to sync the url params with the data\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rowFiltersInitialized, labelSelectionInitialized]);\n\n const showSearchFilters = Object.keys(filterDropdownItems).length !== 0;\n\n const showSearchFiltersDropdown = Object.keys(filterDropdownItems).length > 1;\n return (\n <Toolbar\n className=\"co-toolbar-no-padding pf-m-toggle-group-container\"\n data-test=\"filter-toolbar\"\n id=\"filter-toolbar\"\n clearAllFilters={clearAll}\n clearFiltersButtonText={t('public~Clear all filters')}\n >\n <ToolbarContent>\n {(rowFilters?.length > 0 || !hideNameLabelFilters) && (\n <ToolbarToggleGroup toggleIcon={<FilterIcon />} breakpoint=\"md\">\n {rowFilters?.length > 0 && (\n <ToolbarItem>\n {_.reduce(\n Object.keys(filters),\n (acc, key) => (\n <ToolbarFilter\n key={key}\n chips={_.intersection(selectedRowFilters, filters[key]).map((item) => {\n return {\n key: item,\n node: filtersNameMap[item],\n };\n })}\n deleteChip={(_filter, chip: ToolbarChip) =>\n updateRowFilterSelected([chip.key])\n }\n categoryName={key}\n deleteChipGroup={() => clearAllRowFilter(key)}\n chipGroupCollapsedText={t('public~{{numRemaining}} more', {\n numRemaining: '${remaining}',\n })}\n chipGroupExpandedText={t('public~Show less')}\n >\n {acc}\n </ToolbarFilter>\n ),\n <div data-test-id=\"filter-dropdown-toggle\">\n <SelectDeprecated\n placeholderText={\n <span>\n <FilterIcon className=\"span--icon__right-margin\" />\n {t('public~Filter')}\n </span>\n }\n isOpen={isOpen}\n onToggle={(_toggleEvent, isExpanded) => setOpen(isExpanded)}\n onSelect={onRowFilterSelect}\n variant={SelectVariantDeprecated.checkbox}\n selections={selectedRowFilters}\n isCheckboxSelectionBadgeHidden\n isGrouped\n maxHeight=\"60vh\"\n >\n {dropdownItems}\n </SelectDeprecated>\n </div>,\n )}\n </ToolbarItem>\n )}\n {showSearchFilters && (\n <ToolbarItem className=\"co-filter-search--full-width\">\n {searchRowFilters}\n <ToolbarFilter\n deleteChipGroup={() => {\n setLabelInputText('');\n applyLabelFilters([]);\n }}\n chips={labelSelection}\n deleteChip={(f, chip: string) => {\n setLabelInputText('');\n applyLabelFilters(_.difference(labelSelection, [chip]));\n }}\n categoryName={t('public~Label')}\n >\n <ToolbarFilter\n chips={nameInputText ? [nameInputText] : []}\n deleteChip={() => {\n setNameInputText('');\n applyNameFilter('');\n }}\n categoryName={translatedNameFilterTitle}\n >\n <div className=\"pf-v5-c-input-group co-filter-group\">\n {showSearchFiltersDropdown && (\n <DropdownInternal\n items={filterDropdownItems}\n onChange={(type) => setFilterType(FilterType[type] || type)}\n selectedKey={filterType}\n title={translateFilterType(filterType)}\n />\n )}\n {filterType === FilterType.LABEL && (\n <AutocompleteInput\n className=\"co-text-node\"\n onSuggestionSelect={(selected) => {\n applyLabelFilters(_.uniq([...labelSelection, selected]));\n }}\n showSuggestions\n textValue={labelInputText}\n setTextValue={setLabelInputText}\n placeholder={labelFilterPlaceholder ?? t('public~Search by label...')}\n data={data}\n labelPath={labelPath}\n />\n )}\n\n {filterType === FilterType.NAME && (\n <TextFilter\n data-test=\"name-filter-input\"\n value={nameInputText}\n onChange={(_event, value: string) => {\n setNameInputText(value);\n debounceApplyNameFilter(value);\n }}\n placeholder={nameFilterPlaceholder ?? t('public~Search by name...')}\n />\n )}\n\n {searchFiltersObject[filterType] && (\n <TextFilter\n data-test={`${filterType}-filter-input`}\n value={searchFiltersState[filterType]}\n onChange={(_event, value: string) => {\n changeSearchFiltersState(filterType, value);\n debounceApplyTextFilter(value, filterType);\n }}\n placeholder={searchFiltersObject[filterType].placeholder}\n />\n )}\n </div>\n </ToolbarFilter>\n </ToolbarFilter>\n </ToolbarItem>\n )}\n </ToolbarToggleGroup>\n )}\n {columnLayout?.id && !hideColumnManagement && (\n <ToolbarGroup>\n <ToolbarItem>\n <Tooltip content={t('public~Manage columns')} trigger=\"mouseenter\">\n <Button\n variant=\"plain\"\n onClick={() =>\n createColumnManagementModal({\n columnLayout,\n })\n }\n aria-label={t('public~Column management')}\n data-test=\"manage-columns\"\n >\n <ColumnsIcon />\n </Button>\n </Tooltip>\n </ToolbarItem>\n </ToolbarGroup>\n )}\n </ToolbarContent>\n </Toolbar>\n );\n};\n\ntype RowFilterBase<R> = {\n filterGroupName: string;\n type: string;\n items: RowFilterItem[];\n filter?: (input: FilterValue, obj: R) => boolean;\n defaultSelected?: string[];\n};\n\nexport type RowMatchFilter<R = any> = RowFilterBase<R> & {\n isMatch: (obj: R, id: string) => boolean;\n};\n\nexport type RowReducerFilter<R = any> = RowFilterBase<R> & {\n reducer: (obj: R) => React.ReactText;\n};\n\nexport type RowFilter<R = any> = RowMatchFilter<R> | RowReducerFilter<R>;\n\ntype FilterToolbarProps = {\n rowFilters?: RowFilter[];\n data?: any;\n reduxIDs?: string[];\n textFilter?: string;\n hideColumnManagement?: boolean;\n hideLabelFilter?: boolean;\n hideNameLabelFilters?: boolean;\n labelFilter?: string;\n parseAutoComplete?: any;\n kinds?: any;\n labelPath?: string;\n columnLayout?: ColumnLayout;\n nameFilterPlaceholder?: string;\n nameFilterTitle?: string;\n labelFilterPlaceholder?: string;\n // Used when multiple tables are in the same page\n uniqueFilterName?: string;\n onFilterChange?: OnFilterChange;\n rowSearchFilters?: RowSearchFilter[];\n};\n\nFilterToolbar.displayName = 'FilterToolbar';\n","export * from '@console/dynamic-plugin-sdk/src/utils/k8s/ws-factory';\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport { connect } from 'react-redux';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { AlertVariant } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { useResolvedExtensions } from '@console/dynamic-plugin-sdk/src/api/useResolvedExtensions';\nimport { RootState } from '../../redux';\nimport {\n K8sKind,\n k8sList,\n referenceForModel,\n getResourceDescription,\n modelFor,\n referenceForGroupVersionKind,\n} from '../../module/k8s';\nimport { EmptyBox, ExpandableAlert, Kebab, LoadingBox, resourcePathFromModel } from '../utils';\nimport { TextFilter } from '../factory';\nimport { fuzzyCaseInsensitive } from '../factory/table-filters';\nimport i18next from 'i18next';\nimport {\n ClusterGlobalConfig,\n isClusterGlobalConfig,\n} from '@console/dynamic-plugin-sdk/src/extensions/cluster-settings';\nimport { useCanClusterUpgrade } from '@console/shared';\nimport filterNonUpgradableResources from './filterNonUpgradableResources';\nimport { IDP_TYPES } from '@console/shared/src/constants/auth';\n\ntype ConfigDataType = { model: K8sKind; id: string; name: string; namespace: string };\n\nconst stateToProps = (state: RootState) => ({\n configResources: state.k8s.getIn(['RESOURCES', 'configResources']),\n clusterOperatorConfigResources: state.k8s.getIn(['RESOURCES', 'clusterOperatorConfigResources']),\n});\n\nexport const breadcrumbsForGlobalConfig = (detailsPageKind: string, detailsPagePath: string) => [\n {\n name: i18next.t('public~Configuration'),\n path: '/settings/cluster/globalconfig',\n },\n {\n name: i18next.t('public~{{kind}} details', { kind: detailsPageKind }),\n path: detailsPagePath,\n },\n];\n\nconst ItemRow = ({ item, showAPIGroup }) => {\n return (\n <div className=\"row co-resource-list__item\" data-test-action={item.label}>\n <div className=\"col-xs-10 col-sm-4\">\n <Link to={item.path} data-test-id={item.label}>\n {item.label}\n </Link>\n {showAPIGroup && <div className=\"text-muted small\">{item.apiGroup}</div>}\n </div>\n <div className=\"hidden-xs col-sm-7\">\n <div className=\"co-line-clamp\">{item.description || '-'}</div>\n </div>\n <div className=\"dropdown-kebab-pf\">\n <Kebab options={item.menuItems} />\n </div>\n </div>\n );\n};\n\nconst GlobalConfigPage_: React.FC<GlobalConfigPageProps & GlobalConfigPageExtensionProps> = ({\n clusterOperatorConfigResources,\n configResources,\n globalConfigs,\n}) => {\n const [errors, setErrors] = React.useState([]);\n const [items, setItems] = React.useState([]);\n const [loading, setLoading] = React.useState(true);\n const [textFilter, setTextFilter] = React.useState('');\n const { t } = useTranslation();\n\n React.useEffect(() => {\n const oauthMenuItems = _.map(IDP_TYPES, (label: string, id: string) => ({\n label: t('public~{{label}}', { label }),\n href: `/settings/idp/${id}`,\n }));\n const editYAMLMenuItem = (name: string, resourceLink: string) => ({\n label: t('public~Edit {{name}} resource', { name }),\n href: `${resourceLink}/yaml`,\n });\n const viewAPIExplorerMenuItem = (name: string, apiExplorerLink: string) => ({\n label: t('public~Explore {{name}} API', { name }),\n href: apiExplorerLink,\n });\n let isSubscribed = true;\n Promise.all(\n [...configResources, ...clusterOperatorConfigResources].map((model: K8sKind) => {\n return k8sList(model)\n .catch(({ response: { status }, message = `Could not get resource ${model.kind}` }) => {\n if (status !== 403) {\n setErrors((current) => [...current, message]);\n }\n return [];\n })\n .then((resources) => resources.map((i: K8sKind) => ({ ...i, model })));\n }),\n ).then((responses) => {\n const flattenedResponses = _.flatten(responses);\n const winnowedResponses: ConfigDataType[] = flattenedResponses.map((item) => ({\n model: item.model,\n id: item.metadata.uid,\n name: item.metadata.name,\n namespace: item.metadata.namespace,\n }));\n const usableConfigs: ConfigDataType[] = globalConfigs.map(({ properties }) => {\n const { group, version, kind } = properties.model;\n return {\n ...properties,\n model: modelFor(referenceForGroupVersionKind(group)(version)(kind)),\n };\n });\n const allItems = [...winnowedResponses, ...usableConfigs]\n .flatMap((item) => {\n if (item.model) {\n const apiExplorerLink = `/api-resource/cluster/${referenceForModel(item.model)}`;\n const resourceLink = resourcePathFromModel(item.model, item.name, item.namespace);\n return {\n label: item.model.kind,\n apiGroup: item.model.apiGroup,\n id: item.id,\n description: getResourceDescription(item.model),\n path: resourceLink,\n menuItems: [\n editYAMLMenuItem(item.model.kind, resourceLink),\n viewAPIExplorerMenuItem(item.model.kind, apiExplorerLink),\n ...(item.model.kind === 'OAuth' ? oauthMenuItems : []),\n ],\n };\n }\n return [];\n })\n .concat([\n {\n label: 'Alertmanager',\n apiGroup: 'monitoring.coreos.com',\n id: 'alertmanager',\n description: 'Configure grouping and routing of alerts',\n path: '/monitoring/alertmanagerconfig',\n menuItems: [\n {\n label: t('public~Create Receiver'),\n href: '/monitoring/alertmanagerconfig/receivers/~new',\n },\n {\n label: t('public~Edit configuration YAML'),\n href: `/monitoring/alertmanageryaml`,\n },\n ],\n },\n ]);\n const sortedItems = _.sortBy(_.flatten(allItems), 'label', 'asc');\n if (isSubscribed) {\n setItems(sortedItems);\n setLoading(false);\n }\n });\n return () => (isSubscribed = false);\n }, [clusterOperatorConfigResources, configResources, globalConfigs, t]);\n const visibleItems = items.filter(({ label, description = '' }) => {\n return (\n fuzzyCaseInsensitive(textFilter, label) ||\n description.toLowerCase().indexOf(textFilter.toLowerCase()) !== -1\n );\n });\n const groupedItems = _.groupBy(visibleItems, _.property('label'));\n const showAPIGroup = (item) => groupedItems?.[item]?.length > 1;\n\n return (\n <div className=\"co-m-pane__body\">\n {!loading && (\n <>\n <p className=\"co-help-text co-cluster-paragraph\">\n {t('public~Edit the following resources to manage the configuration of your cluster.')}\n </p>\n <div className=\"co-m-pane__filter-row\">\n <TextFilter\n value={textFilter}\n label={t('public~by name or description')}\n onChange={(_event, val) => setTextFilter(val)}\n />\n </div>\n </>\n )}\n {!_.isEmpty(errors) && (\n <ExpandableAlert\n variant={AlertVariant.danger}\n alerts={errors.map((error, i) => (\n <div key={i}>{error}</div>\n ))}\n />\n )}\n {loading && <LoadingBox />}\n {!loading &&\n (_.isEmpty(visibleItems) ? (\n <EmptyBox label={t('public~Configuration resources')} />\n ) : (\n <div className=\"co-m-table-grid co-m-table-grid--bordered\">\n <div className=\"row co-m-table-grid__head\">\n <div className=\"col-xs-10 col-sm-4\">{t('public~Configuration resource')}</div>\n <div className=\"hidden-xs col-sm-7\">{t('public~Description')}</div>\n </div>\n <div className=\"co-m-table-grid__body\">\n {_.map(visibleItems, (item) => (\n <ItemRow item={item} key={item.id} showAPIGroup={showAPIGroup(item.label)} />\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n};\n\nexport const GlobalConfigPage = connect(stateToProps)(({ configResources, ...props }) => {\n const [resolvedExtensions] = useResolvedExtensions<ClusterGlobalConfig>(isClusterGlobalConfig);\n\n const canClusterUpgrade = useCanClusterUpgrade();\n const adjustedConfigResources = canClusterUpgrade\n ? configResources\n : configResources.filter(filterNonUpgradableResources);\n\n return (\n <GlobalConfigPage_\n globalConfigs={resolvedExtensions}\n configResources={adjustedConfigResources}\n {...props}\n />\n );\n});\n\ntype GlobalConfigPageExtensionProps = {\n globalConfigs: ClusterGlobalConfig[];\n};\n\ntype GlobalConfigPageProps = GlobalConfigPageExtensionProps & {\n clusterOperatorConfigResources: K8sKind[];\n configResources: K8sKind[];\n};\n","import * as React from 'react';\nimport { useForceRender } from '@console/shared/src/hooks/useForceRender';\nimport { DynamicPluginInfo } from '../store';\nimport { subscribeToDynamicPlugins } from './pluginSubscriptionService';\n\n/**\n * React hook for consuming Console dynamic plugin runtime information.\n *\n * When the runtime status of a dynamic plugin changes, the React component\n * is re-rendered with the hook returning an up-to-date plugin information.\n *\n * Example usage:\n *\n * ```ts\n * const Example = () => {\n * const [pluginInfoEntries, allPluginsProcessed] = useDynamicPluginInfo();\n * // process plugin entries and render your component\n * };\n * ```\n *\n * The hook's result elements are guaranteed to be referentially stable across re-renders.\n *\n * @returns Console dynamic plugin runtime information.\n */\nexport const useDynamicPluginInfo = (): [DynamicPluginInfo[], boolean] => {\n const forceRender = useForceRender();\n\n const isMountedRef = React.useRef(true);\n const unsubscribeRef = React.useRef<VoidFunction>(null);\n const pluginInfoEntriesRef = React.useRef<DynamicPluginInfo[]>([]);\n const allPluginsProcessedRef = React.useRef<boolean>(false);\n\n const trySubscribe = React.useCallback(() => {\n if (unsubscribeRef.current === null) {\n unsubscribeRef.current = subscribeToDynamicPlugins((pluginInfoEntries) => {\n pluginInfoEntriesRef.current = pluginInfoEntries;\n allPluginsProcessedRef.current = pluginInfoEntries.every((i) => i.status !== 'Pending');\n isMountedRef.current && forceRender();\n });\n }\n }, [forceRender]);\n\n const tryUnsubscribe = React.useCallback(() => {\n if (unsubscribeRef.current !== null) {\n unsubscribeRef.current();\n unsubscribeRef.current = null;\n }\n }, []);\n\n trySubscribe();\n\n React.useEffect(\n () => () => {\n isMountedRef.current = false;\n tryUnsubscribe();\n },\n [tryUnsubscribe],\n );\n\n return [pluginInfoEntriesRef.current, allPluginsProcessedRef.current];\n};\n","import * as React from 'react';\nimport * as _ from 'lodash';\n\nexport const useDeepCompareMemoize = <T = any>(value: T, strinfigy?: boolean): T => {\n const ref = React.useRef<T>();\n\n if (\n strinfigy\n ? JSON.stringify(value) !== JSON.stringify(ref.current)\n : !_.isEqual(value, ref.current)\n ) {\n ref.current = value;\n }\n\n return ref.current;\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport * as fuzzy from 'fuzzysearch';\nimport { useLocation, useParams } from 'react-router-dom-v5-compat';\nimport { RoleModel, RoleBindingModel, ClusterRoleBindingModel } from '../../models';\nimport * as classNames from 'classnames';\nimport { useTranslation, withTranslation } from 'react-i18next';\nimport i18next from 'i18next';\nimport { sortable } from '@patternfly/react-table';\nimport { BindingName, BindingsList, flatten as bindingsFlatten } from './bindings';\nimport { RulesList } from './rules';\nimport { DetailsPage, MultiListPage, TextFilter, Table, TableData } from '../factory';\nimport {\n Kebab,\n SectionHeading,\n MsgBox,\n navFactory,\n ResourceKebab,\n ResourceLink,\n Timestamp,\n resourceListPathFromModel,\n} from '../utils';\nimport { DetailsForKind } from '../default-resource';\nimport { getLastNamespace } from '../utils/breadcrumbs';\nimport { ALL_NAMESPACES_KEY } from '@console/shared';\n\nconst { common } = Kebab.factory;\n\nexport const isSystemRole = (role) => _.startsWith(role.metadata.name, 'system:');\n\n// const addHref = (name, ns) => ns ? `/k8s/ns/${ns}/roles/${name}/add-rule` : `/k8s/cluster/clusterroles/${name}/add-rule`;\n\nexport const roleKind = (role) => (role.metadata.namespace ? 'Role' : 'ClusterRole');\n\nconst menuActions = [\n // This page is temporarily disabled until we update the safe resources list.\n // (kind, role) => ({\n // label: 'Add Rule',\n // href: addHref(role.metadata.name, role.metadata.namespace),\n // }),\n (kind, role) => ({\n label: i18next.t('public~Add RoleBinding'),\n href: `/k8s/${\n role.metadata.namespace\n ? `ns/${role.metadata.namespace}/rolebindings/~new?rolekind=${roleKind(role)}&rolename=${\n role.metadata.name\n }&namespace=${role.metadata.namespace}`\n : `cluster/rolebindings/~new?rolekind=${roleKind(role)}&rolename=${role.metadata.name}`\n }`,\n }),\n Kebab.factory.Edit,\n Kebab.factory.Delete,\n];\n\nconst roleColumnClasses = ['', '', Kebab.columnClass];\n\nconst RolesTableRow = ({ obj: role }) => {\n return (\n <>\n <TableData className={roleColumnClasses[0]}>\n <ResourceLink\n kind={roleKind(role)}\n name={role.metadata.name}\n namespace={role.metadata.namespace}\n />\n </TableData>\n <TableData className={classNames(roleColumnClasses[1], 'co-break-word')}>\n {role.metadata.namespace ? (\n <ResourceLink kind=\"Namespace\" name={role.metadata.namespace} />\n ) : (\n i18next.t('public~All namespaces')\n )}\n </TableData>\n <TableData className={roleColumnClasses[2]}>\n <ResourceKebab actions={menuActions} kind={roleKind(role)} resource={role} />\n </TableData>\n </>\n );\n};\n\nclass Details extends React.Component {\n constructor(props) {\n super(props);\n this.state = {};\n this.changeFilter = (val) => this.setState({ ruleFilter: val });\n }\n\n render() {\n const ruleObj = this.props.obj;\n const { creationTimestamp, name, namespace } = ruleObj.metadata;\n const { ruleFilter } = this.state;\n\n let rules = ruleObj.rules;\n if (ruleFilter) {\n const fuzzyCaseInsensitive = (a, b) => fuzzy(_.toLower(a), _.toLower(b));\n const searchKeys = ['nonResourceURLs', 'resources', 'verbs'];\n rules = rules.filter((rule) =>\n searchKeys.some((k) => _.some(rule[k], (v) => fuzzyCaseInsensitive(ruleFilter, v))),\n );\n }\n const { t } = this.props;\n\n return (\n <div>\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Role details')} />\n <div className=\"row\">\n <div className=\"col-xs-6\">\n <dl className=\"co-m-pane__details\">\n <dt>{t('public~Role name')}</dt>\n <dd>{name}</dd>\n {namespace && (\n <div>\n <dt>{t('public~Namespace')}</dt>\n <dd>\n <ResourceLink kind=\"Namespace\" name={namespace} />\n </dd>\n </div>\n )}\n </dl>\n </div>\n <div className=\"col-xs-6\">\n <dl className=\"co-m-pane__details\">\n <dt>{t('public~Created at')}</dt>\n <dd>\n <Timestamp timestamp={creationTimestamp} />\n </dd>\n </dl>\n </div>\n </div>\n </div>\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Rules')} />\n <div className=\"co-m-pane__filter-row\">\n {/* This page is temporarily disabled until we update the safe resources list.\n <div className=\"co-m-pane__filter-bar-group\">\n <Link to={addHref(name, namespace)} className=\"co-m-primary-action\">\n <Button variant=\"primary\">{t('public~Add Rule')}</Button>\n </Link>\n </div>\n */}\n <TextFilter\n label={t('public~rules by action or resource')}\n onChange={this.changeFilter}\n />\n </div>\n <RulesList rules={rules} name={name} namespace={namespace} />\n </div>\n </div>\n );\n }\n}\nconst DetailsWithTranslation = withTranslation()(Details);\n\nconst bindingsColumnClasses = [\n 'pf-v5-u-w-33-on-sm',\n 'pf-v5-u-w-16-on-sm',\n 'pf-v5-u-w-33-on-sm',\n 'pf-v5-u-w-16-on-sm',\n];\n\nconst BindingsTableRow = ({ obj: binding }) => {\n const { t } = useTranslation();\n return (\n <>\n <TableData className={bindingsColumnClasses[0]}>\n <BindingName binding={binding} />\n </TableData>\n <TableData className={bindingsColumnClasses[1]}>{binding.subject.kind}</TableData>\n <TableData className={bindingsColumnClasses[2]}>{binding.subject.name}</TableData>\n <TableData className={bindingsColumnClasses[3]}>\n {binding.metadata.namespace ? (\n <ResourceLink kind=\"Namespace\" name={binding.metadata.namespace} />\n ) : (\n t('public~All namespaces')\n )}\n </TableData>\n </>\n );\n};\n\nconst BindingsListComponent = (props) => {\n const { t } = useTranslation();\n const BindingsTableHeader = () => {\n return [\n {\n title: t('public~Name'),\n sortField: 'metadata.name',\n transforms: [sortable],\n props: { className: bindingsColumnClasses[0] },\n },\n {\n title: t('public~Subject kind'),\n sortField: 'subject.kind',\n transforms: [sortable],\n props: { className: bindingsColumnClasses[1] },\n },\n {\n title: t('public~Subject name'),\n sortField: 'subject.name',\n transforms: [sortable],\n props: { className: bindingsColumnClasses[2] },\n },\n {\n title: t('public~Namespace'),\n sortField: 'metadata.namespace',\n transforms: [sortable],\n props: { className: bindingsColumnClasses[3] },\n },\n ];\n };\n BindingsTableHeader.displayName = 'BindingsTableHeader';\n\n return <BindingsList {...props} Header={BindingsTableHeader} Row={BindingsTableRow} />;\n};\n\nexport const BindingsForRolePage = (props) => {\n const { name, ns } = useParams();\n const {\n obj: { kind },\n } = props;\n const resources = [{ kind: 'RoleBinding', namespaced: true }];\n if (!ns) {\n resources.push({ kind: 'ClusterRoleBinding', namespaced: false, optional: true });\n }\n\n const { t } = useTranslation();\n return (\n <MultiListPage\n canCreate={true}\n createButtonText={t('public~Create binding')}\n createProps={{\n to: `/k8s/${\n ns ? `ns/${ns}` : 'cluster'\n }/rolebindings/~new?rolekind=${kind}&rolename=${name}${ns ? `&namespace=${ns}` : ''}`,\n }}\n ListComponent={BindingsListComponent}\n staticFilters={[\n // Some bindings have a name that needs to be decoded (e.g., `system%3Aimage-builder`)\n { 'role-binding-roleRef-name': decodeURIComponent(name) },\n { 'role-binding-roleRef-kind': kind },\n ]}\n resources={resources}\n textFilter=\"role-binding\"\n filterLabel={t('public~by role or subject')}\n namespace={ns}\n flatten={bindingsFlatten}\n />\n );\n};\n\nconst getBreadcrumbs = (model, kindObj, location) => {\n const lastNamespace = getLastNamespace();\n return [\n {\n name: model.labelPluralKey ? i18next.t(model.labelPluralKey) : model.labelPlural,\n path: resourceListPathFromModel(\n model,\n !lastNamespace || lastNamespace === ALL_NAMESPACES_KEY ? null : lastNamespace,\n ),\n },\n {\n name: i18next.t('public~{{kind}} details', {\n kind: kindObj.labelKey ? i18next.t(kindObj.labelKey) : kindObj.label,\n }),\n path: `${location.pathname}`,\n },\n ];\n};\n\nexport const RolesDetailsPage = (props) => {\n const location = useLocation();\n return (\n <DetailsPage\n {...props}\n pages={[\n navFactory.details(DetailsWithTranslation),\n navFactory.editYaml(),\n {\n href: 'bindings',\n // t('public~RoleBindings')\n nameKey: 'public~RoleBindings',\n component: BindingsForRolePage,\n },\n ]}\n menuActions={menuActions}\n breadcrumbsFor={() => getBreadcrumbs(RoleModel, props.kindObj, location)}\n />\n );\n};\n\nexport const ClusterRolesDetailsPage = RolesDetailsPage;\n\nexport const ClusterRoleBindingsDetailsPage = (props) => {\n const pages = [navFactory.details(DetailsForKind), navFactory.editYaml()];\n const actions = [...Kebab.getExtensionsActionsForKind(ClusterRoleBindingModel), ...common];\n const location = useLocation();\n\n return (\n <DetailsPage\n {...props}\n menuActions={actions}\n pages={pages}\n breadcrumbsFor={() => getBreadcrumbs(RoleBindingModel, props.kindObj, location)}\n />\n );\n};\n\nconst EmptyMsg = () => {\n const { t } = useTranslation();\n return (\n <MsgBox\n title={t('public~No Roles found')}\n detail={t(\n 'public~Roles grant access to types of objects in the cluster. Roles are applied to a team or user via a RoleBinding.',\n )}\n />\n );\n};\n\nconst RolesList = (props) => {\n const { t } = useTranslation();\n const RolesTableHeader = () => {\n return [\n {\n title: t('public~Name'),\n sortField: 'metadata.name',\n transforms: [sortable],\n props: { className: roleColumnClasses[0] },\n },\n {\n title: t('public~Namespace'),\n sortField: 'metadata.namespace',\n transforms: [sortable],\n props: { className: roleColumnClasses[1] },\n },\n { title: '', props: { className: roleColumnClasses[2] } },\n ];\n };\n return (\n <Table\n {...props}\n aria-label={t('public~Roles')}\n EmptyMsg={EmptyMsg}\n Header={RolesTableHeader}\n Row={RolesTableRow}\n virtualize\n />\n );\n};\n\nexport const roleType = (role) => {\n if (!role) {\n return undefined;\n }\n if (isSystemRole(role)) {\n return 'system';\n }\n return role.metadata.namespace ? 'namespace' : 'cluster';\n};\n\nexport const RolesPage = ({ namespace, mock, showTitle }) => {\n const createNS = namespace || 'default';\n const accessReview = {\n model: RoleModel,\n namespace: createNS,\n };\n const { t } = useTranslation();\n return (\n <MultiListPage\n ListComponent={RolesList}\n canCreate={true}\n showTitle={showTitle}\n namespace={namespace}\n createAccessReview={accessReview}\n createButtonText={t('public~Create Role')}\n createProps={{ to: `/k8s/ns/${createNS}/roles/~new` }}\n flatten={(resources) => _.flatMap(resources, 'data').filter((r) => !!r)}\n resources={[\n { kind: 'Role', namespaced: true, optional: mock },\n { kind: 'ClusterRole', namespaced: false, optional: true },\n ]}\n rowFilters={[\n {\n filterGroupName: t('public~Role'),\n type: 'role-kind',\n reducer: roleType,\n items: [\n { id: 'cluster', title: t('public~Cluster-wide Roles') },\n { id: 'namespace', title: t('public~Namespace Roles') },\n { id: 'system', title: t('public~System Roles') },\n ],\n },\n ]}\n title={t('public~Roles')}\n />\n );\n};\n","import * as React from 'react';\nimport { PerspectiveType } from '../extensions';\n\nexport type PerspectiveContextType = {\n activePerspective?: PerspectiveType;\n setActivePerspective?: React.Dispatch<React.SetStateAction<PerspectiveType>>;\n};\n/**\n * Creates the perspective context\n * @deprecated - use the provided `usePerspectiveContext` instead\n * @param {PerspectiveContextType} PerspectiveContextType - object with active perspective and setter\n * @returns React context\n */\nexport const PerspectiveContext = React.createContext<PerspectiveContextType>({});\n","import { useEffect, useRef } from 'react';\n\n// Slightly modified from Dan Abramov's blog post about using React hooks for polling\n// https://overreacted.io/making-setinterval-declarative-with-react-hooks/\nexport const usePoll = (callback, delay, ...dependencies) => {\n const savedCallback = useRef(null);\n\n // Remember the latest callback.\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n // Set up the interval.\n useEffect(() => {\n const tick = () => savedCallback.current();\n\n tick(); // Run first tick immediately.\n\n if (delay) {\n // Only start interval if a delay is provided.\n const id = setInterval(tick, delay);\n return () => clearInterval(id);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [delay, ...dependencies]);\n};\n","/* eslint-disable tsdoc/syntax */\nimport * as _ from 'lodash-es';\nimport * as React from 'react';\nimport * as classNames from 'classnames';\nimport * as PropTypes from 'prop-types';\nimport { Alert, AlertGroup } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\n\nimport { LoadingInline } from './status-box';\n\nconst injectDisabled = (children, disabled) => {\n return React.Children.map(children, (c) => {\n if (!_.isObject(c) || c.type !== 'button') {\n return c;\n }\n\n return React.cloneElement(c, { disabled: c.props.disabled || disabled });\n });\n};\n\nconst ErrorMessage = ({ message }) => {\n const { t } = useTranslation();\n return (\n <Alert\n isInline\n className=\"co-alert co-alert--scrollable\"\n variant=\"danger\"\n title={t('public~An error occurred')}\n data-test=\"alert-error\"\n >\n <div className=\"co-pre-line\">{message}</div>\n </Alert>\n );\n};\nconst InfoMessage = ({ message }) => (\n <Alert\n isInline\n className=\"co-alert\"\n variant=\"info\"\n title={message}\n data-test=\"button-bar-info-message\"\n />\n);\nconst SuccessMessage = ({ message }) => (\n <Alert isInline className=\"co-alert\" variant=\"success\" title={message} />\n);\n\n// NOTE: DO NOT use <a> elements within a ButtonBar.\n// They don't support the disabled attribute, and therefore\n// can't be disabled during a pending promise/request.\n/** @type {React.SFC<{children: any, className?: string, errorMessage?: React.ReactNode, infoMessage?: string, successMessage?: string, inProgress?: boolean}}>} */\nexport const ButtonBar = ({\n children,\n className,\n errorMessage,\n infoMessage,\n successMessage,\n inProgress,\n}) => {\n return (\n <div className={classNames(className, 'co-m-btn-bar')}>\n <AlertGroup\n isLiveRegion\n aria-live=\"polite\"\n aria-atomic=\"false\"\n aria-relevant=\"additions text\"\n >\n {successMessage && <SuccessMessage message={successMessage} />}\n {errorMessage && <ErrorMessage message={errorMessage} />}\n {injectDisabled(children, inProgress)}\n {inProgress && <LoadingInline />}\n {infoMessage && <InfoMessage message={infoMessage} />}\n </AlertGroup>\n </div>\n );\n};\n\nButtonBar.propTypes = {\n children: PropTypes.node.isRequired,\n successMessage: PropTypes.string,\n errorMessage: PropTypes.node,\n infoMessage: PropTypes.string,\n inProgress: PropTypes.bool,\n className: PropTypes.string,\n};\n","import { useEffect, useRef, useState, useCallback } from 'react';\n\nexport const useRefWidth = () => {\n const ref = useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState<number>();\n\n const setRef = useCallback((e: HTMLDivElement) => {\n const newWidth = e?.clientWidth;\n newWidth && ref.current?.clientWidth !== newWidth && setWidth(e.clientWidth);\n ref.current = e;\n }, []);\n\n useEffect(() => {\n const handleResize = () => setWidth(ref.current?.clientWidth);\n window.addEventListener('resize', handleResize);\n window.addEventListener('sidebar_toggle', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n window.removeEventListener('sidebar_toggle', handleResize);\n };\n }, []);\n\n const clientWidth = ref.current?.clientWidth;\n\n useEffect(() => {\n width !== clientWidth && setWidth(clientWidth);\n }, [clientWidth, width]);\n\n return [setRef, width] as [React.Ref<HTMLDivElement>, number];\n};\n","import { HorizontalPodAutoscalerKind, K8sResourceCommon } from '@console/internal/module/k8s';\n\nexport const doesHpaMatch = (workload: K8sResourceCommon) => (\n thisHPA: HorizontalPodAutoscalerKind,\n) => {\n const {\n apiVersion,\n kind,\n metadata: { name },\n } = workload;\n const ref = thisHPA?.spec?.scaleTargetRef;\n return ref && ref.apiVersion === apiVersion && ref.kind === kind && ref.name === name;\n};\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport { useForceRender } from '@console/shared/src/hooks/useForceRender';\nimport { Extension, ExtensionTypeGuard, LoadedExtension } from '../typings';\nimport useTranslatedExtensions from '../utils/useTranslatedExtensions';\nimport { subscribeToExtensions } from './pluginSubscriptionService';\n\n/**\n * React hook for consuming Console extensions.\n *\n * This hook takes extension type guard(s) as its argument(s) and returns a list\n * of extension instances, narrowed by the given type guard(s), which are currently\n * in use.\n *\n * An extension is considered to be in use when\n *\n * - it is an always-on extension, i.e. not gated by any feature flags\n * - all feature flags referenced by its `flags` object are resolved to the right\n * values\n *\n * When the list of matching extensions changes, the React component is re-rendered\n * with the hook returning an up-to-date list of extensions.\n *\n * Example usage:\n *\n * ```ts\n * const Example = () => {\n * const navItemExtensions = useExtensions<NavItem>(isNavItem);\n * // process extensions and render your component\n * };\n * ```\n *\n * The hook's result is guaranteed to be referentially stable across re-renders.\n *\n * @param typeGuards Type guard(s) used to narrow the extension instances.\n *\n * @returns List of extension instances which are currently in use, narrowed by the\n * given type guard(s).\n */\nexport const useExtensions = <E extends Extension>(\n ...typeGuards: ExtensionTypeGuard<E>[]\n): LoadedExtension<E>[] => {\n if (typeGuards.length === 0) {\n throw new Error('You must pass at least one type guard to useExtensions');\n }\n\n const forceRender = useForceRender();\n\n const isMountedRef = React.useRef(true);\n const unsubscribeRef = React.useRef<VoidFunction>(null);\n const extensionsInUseRef = React.useRef<LoadedExtension<E>[]>([]);\n const latestTypeGuardsRef = React.useRef<ExtensionTypeGuard<E>[]>(typeGuards);\n\n const trySubscribe = React.useCallback(() => {\n if (unsubscribeRef.current === null) {\n unsubscribeRef.current = subscribeToExtensions<E>((extensions) => {\n extensionsInUseRef.current = extensions;\n isMountedRef.current && forceRender();\n }, ...latestTypeGuardsRef.current);\n }\n }, [forceRender]);\n\n const tryUnsubscribe = React.useCallback(() => {\n if (unsubscribeRef.current !== null) {\n unsubscribeRef.current();\n unsubscribeRef.current = null;\n }\n }, []);\n\n if (!_.isEqual(latestTypeGuardsRef.current, typeGuards)) {\n latestTypeGuardsRef.current = typeGuards;\n tryUnsubscribe();\n }\n\n trySubscribe();\n\n React.useEffect(\n () => () => {\n isMountedRef.current = false;\n tryUnsubscribe();\n },\n [tryUnsubscribe],\n );\n\n return useTranslatedExtensions<E>(extensionsInUseRef.current);\n};\n","export { useForceRender } from '@openshift-console/plugin-shared/src/hooks/useForceRender';\n","/* eslint-disable no-console */\n\nimport * as _ from 'lodash';\nimport { StandardConsolePluginManifest } from '@console/dynamic-plugin-sdk/src/build-types';\nimport { Extension, LoadedExtension, ActivePlugin } from './typings';\n\nexport const sanitizeExtension = <E extends Extension>(e: E): E => {\n e.flags = e.flags || {};\n e.flags.required = _.uniq(e.flags.required || []);\n e.flags.disallowed = _.uniq(e.flags.disallowed || []);\n return e;\n};\n\nexport const augmentExtension = <E extends Extension>(\n e: E,\n pluginID: string,\n pluginName: string,\n index: number,\n): LoadedExtension<E> =>\n Object.assign(e, {\n pluginID,\n pluginName,\n uid: `${pluginID}[${index}]`,\n });\n\nexport const isExtensionInUse = (e: Extension, flags: FlagsObject): boolean =>\n e.flags.required.every((f) => flags[f]) && e.flags.disallowed.every((f) => !flags[f]);\n\nexport const getGatingFlagNames = (extensions: Extension[]): string[] =>\n _.uniq([\n ..._.flatMap(extensions.map((e) => e.flags.required)),\n ..._.flatMap(extensions.map((e) => e.flags.disallowed)),\n ]);\n\n/**\n * Provides access to Console plugins and their extensions.\n *\n * Only plugins listed via `allowedDynamicPluginNames` can be added dynamically at runtime.\n *\n * Subscribed `listeners` are invoked upon any of the following events:\n *\n * - when the list of extensions which are currently in use changes\n * - when the runtime status of a dynamic plugin changes\n *\n * In development, this object is exposed as `window.pluginStore` for easier debugging.\n */\nexport class PluginStore {\n // Extensions contributed by static plugins which are currently in use\n private staticPluginExtensions: LoadedExtension[];\n\n // Extensions contributed by dynamic plugins which are currently in use\n private dynamicPluginExtensions: LoadedExtension[];\n\n private i18nNamespaces: Set<string>;\n\n private readonly staticPlugins: StaticPlugin[];\n\n // Static plugins that were disabled by loading replacement dynamic plugins\n private readonly disabledStaticPluginNames = new Set<string>();\n\n private readonly allowedDynamicPluginNames: Set<string>;\n\n // Dynamic plugins that were loaded successfully (keys are plugin IDs)\n private readonly loadedDynamicPlugins = new Map<string, LoadedDynamicPlugin>();\n\n // Dynamic plugins that failed to load properly (keys are plugin names)\n private readonly failedDynamicPlugins = new Map<string, FailedDynamicPlugin>();\n\n private readonly listeners: VoidFunction[] = [];\n\n constructor(\n staticPlugins: ActivePlugin[] = [],\n allowedDynamicPluginNames: string[] = [],\n i18nNamespaces: string[] = [],\n ) {\n this.staticPlugins = staticPlugins.map((plugin) => ({\n name: plugin.name,\n extensions: plugin.extensions.map((e, index) =>\n Object.freeze(\n augmentExtension(sanitizeExtension({ ...e }), plugin.name, plugin.name, index),\n ),\n ),\n }));\n\n this.allowedDynamicPluginNames = new Set(allowedDynamicPluginNames);\n this.i18nNamespaces = new Set(i18nNamespaces);\n this.updateExtensions();\n }\n\n getExtensionsInUse() {\n return [...this.staticPluginExtensions, ...this.dynamicPluginExtensions];\n }\n\n getAllowedDynamicPluginNames() {\n return Array.from(this.allowedDynamicPluginNames);\n }\n\n getI18nNamespaces() {\n return Array.from(this.i18nNamespaces);\n }\n\n subscribe(listener: VoidFunction): VoidFunction {\n let isSubscribed = true;\n this.listeners.push(listener);\n\n return () => {\n if (isSubscribed) {\n isSubscribed = false;\n this.listeners.splice(this.listeners.indexOf(listener), 1);\n }\n };\n }\n\n private invokeListeners() {\n this.listeners.forEach((listener) => {\n listener();\n });\n }\n\n addDynamicPlugin(\n pluginID: string,\n manifest: StandardConsolePluginManifest,\n resolvedExtensions: Extension[],\n ) {\n if (this.loadedDynamicPlugins.has(pluginID)) {\n console.warn(`Attempt to re-add plugin ${pluginID}`);\n return;\n }\n\n if (!this.allowedDynamicPluginNames.has(manifest.name)) {\n console.warn(`Attempt to add unexpected plugin ${pluginID}`);\n return;\n }\n\n if (this.failedDynamicPlugins.has(manifest.name)) {\n console.warn(`Attempt to add plugin ${pluginID} previously marked as failed`);\n return;\n }\n\n this.loadedDynamicPlugins.set(pluginID, {\n manifest: Object.freeze(manifest),\n processedExtensions: resolvedExtensions.map((e, index) =>\n Object.freeze(augmentExtension(sanitizeExtension(e), pluginID, manifest.name, index)),\n ),\n enabled: false,\n });\n\n (manifest.customProperties?.console?.disableStaticPlugins ?? [])\n .filter(\n (pluginName) =>\n !this.disabledStaticPluginNames.has(pluginName) &&\n this.staticPlugins.some((plugin) => plugin.name === pluginName),\n )\n .forEach((pluginName) => {\n console.log(`Static plugin ${pluginName} will be disabled`);\n this.disabledStaticPluginNames.add(pluginName);\n });\n\n this.updateExtensions();\n this.invokeListeners();\n\n console.log(`Added plugin ${pluginID}`);\n }\n\n private updateExtensions() {\n const dynamicPlugins = Array.from(this.loadedDynamicPlugins.values());\n\n this.staticPluginExtensions = this.staticPlugins\n .filter((plugin) => !this.disabledStaticPluginNames.has(plugin.name))\n .reduce((acc, plugin) => [...acc, ...plugin.extensions], [] as LoadedExtension[]);\n\n this.dynamicPluginExtensions = dynamicPlugins.reduce(\n (acc, plugin) => (plugin.enabled ? [...acc, ...plugin.processedExtensions] : acc),\n [] as LoadedExtension[],\n );\n }\n\n setDynamicPluginEnabled(pluginID: string, enabled: boolean) {\n if (!this.loadedDynamicPlugins.has(pluginID)) {\n console.warn(\n `Attempt to ${\n enabled ? 'enable' : 'disable'\n } plugin ${pluginID} that has not been loaded yet`,\n );\n return;\n }\n\n const plugin = this.loadedDynamicPlugins.get(pluginID);\n\n if (plugin.enabled !== enabled) {\n plugin.enabled = enabled;\n\n this.updateExtensions();\n this.invokeListeners();\n\n console.log(`Plugin ${pluginID} is now ${enabled ? 'enabled' : 'disabled'}`);\n }\n }\n\n private isDynamicPluginLoaded(pluginName: string) {\n return Array.from(this.loadedDynamicPlugins.values()).some(\n (plugin) => plugin.manifest.name === pluginName,\n );\n }\n\n private isDynamicPluginFailed(pluginName: string) {\n return this.failedDynamicPlugins.has(pluginName);\n }\n\n registerFailedDynamicPlugin(pluginName: string, errorMessage: string, errorCause?: unknown) {\n if (!this.allowedDynamicPluginNames.has(pluginName)) {\n console.warn(`Attempt to register unexpected plugin ${pluginName} as failed`);\n return;\n }\n\n if (this.isDynamicPluginLoaded(pluginName)) {\n console.warn(`Attempt to register an already loaded plugin ${pluginName} as failed`);\n return;\n }\n\n this.failedDynamicPlugins.set(pluginName, { errorMessage, errorCause });\n this.invokeListeners();\n }\n\n getDynamicPluginInfo(): DynamicPluginInfo[] {\n const loadedPluginEntries = Array.from(this.loadedDynamicPlugins.entries()).reduce(\n (acc, [pluginID, plugin]) => {\n acc.push({\n status: 'Loaded',\n pluginID,\n metadata: _.omit(plugin.manifest, ['extensions', 'loadScripts', 'registrationMethod']),\n enabled: plugin.enabled,\n });\n return acc;\n },\n [] as LoadedDynamicPluginInfo[],\n );\n\n const failedPluginEntries = Array.from(this.failedDynamicPlugins.entries()).reduce(\n (acc, [pluginName, plugin]) => {\n acc.push({\n status: 'Failed',\n pluginName,\n errorMessage: plugin.errorMessage,\n errorCause: plugin.errorCause,\n });\n return acc;\n },\n [] as NotLoadedDynamicPluginInfo[],\n );\n\n const pendingPluginEntries = Array.from(this.allowedDynamicPluginNames.values())\n .filter(\n (pluginName) =>\n !this.isDynamicPluginLoaded(pluginName) && !this.isDynamicPluginFailed(pluginName),\n )\n .reduce((acc, pluginName) => {\n acc.push({\n status: 'Pending',\n pluginName,\n });\n return acc;\n }, [] as NotLoadedDynamicPluginInfo[]);\n\n return [...loadedPluginEntries, ...failedPluginEntries, ...pendingPluginEntries];\n }\n\n getStateForTestPurposes() {\n return {\n staticPluginExtensions: this.staticPluginExtensions,\n dynamicPluginExtensions: this.dynamicPluginExtensions,\n staticPlugins: this.staticPlugins,\n disabledStaticPluginNames: this.disabledStaticPluginNames,\n loadedDynamicPlugins: this.loadedDynamicPlugins,\n failedDynamicPlugins: this.failedDynamicPlugins,\n listeners: this.listeners,\n };\n }\n}\n\ntype FlagsObject = { [key: string]: boolean };\n\ntype StaticPlugin = {\n name: string;\n extensions: LoadedExtension[];\n};\n\ntype DynamicPluginManifest = Readonly<StandardConsolePluginManifest>;\n\ntype DynamicPluginMetadata = Omit<\n DynamicPluginManifest,\n 'extensions' | 'loadScripts' | 'registrationMethod'\n>;\n\ntype LoadedDynamicPlugin = {\n manifest: DynamicPluginManifest;\n processedExtensions: Readonly<LoadedExtension[]>;\n enabled: boolean;\n};\n\ntype FailedDynamicPlugin = {\n errorMessage: string;\n errorCause?: unknown;\n};\n\nexport type LoadedDynamicPluginInfo = {\n status: 'Loaded';\n pluginID: string;\n metadata: DynamicPluginMetadata;\n enabled: boolean;\n};\n\nexport type NotLoadedDynamicPluginInfo =\n | {\n status: 'Pending';\n pluginName: string;\n }\n | {\n status: 'Failed';\n pluginName: string;\n errorMessage: string;\n errorCause?: unknown;\n };\n\nexport type DynamicPluginInfo = LoadedDynamicPluginInfo | NotLoadedDynamicPluginInfo;\n\nexport const isLoadedDynamicPluginInfo = (i: DynamicPluginInfo): i is LoadedDynamicPluginInfo =>\n i.status === 'Loaded';\n\nexport const isNotLoadedDynamicPluginInfo = (\n i: DynamicPluginInfo,\n): i is NotLoadedDynamicPluginInfo => i.status === 'Failed' || i.status === 'Pending';\n","import { getImpersonate } from '../../app/core/reducers';\nimport storeHandler from '../../app/storeHandler';\n\ntype ConsoleRequestHeaders = {\n 'Impersonate-Group'?: string;\n 'Impersonate-User'?: string;\n 'X-CSRFToken'?: string;\n};\n\nexport const getCSRFToken = () => {\n const cookiePrefix = 'csrf-token=';\n return (\n document &&\n document.cookie &&\n document.cookie\n .split(';')\n .map((c) => c.trim())\n .filter((c) => c.startsWith(cookiePrefix))\n .map((c) => c.slice(cookiePrefix.length))\n .pop()\n );\n};\n\n/**\n * A function that creates impersonation headers for API requests using current redux state.\n * @returns an object containing the appropriate impersonation requst headers, based on redux state\n */\nexport const getConsoleRequestHeaders = (): ConsoleRequestHeaders => {\n const store = storeHandler.getStore();\n if (!store) return undefined;\n const state = store.getState();\n\n const headers: ConsoleRequestHeaders = {\n 'X-CSRFToken': getCSRFToken(),\n };\n\n // Set impersonation headers\n const { kind, name } = getImpersonate(state) || {};\n if ((kind === 'User' || kind === 'Group') && name) {\n // Even if we are impersonating a group, we still need to set Impersonate-User to something or k8s will complain\n headers['Impersonate-User'] = name;\n if (kind === 'Group') {\n headers['Impersonate-Group'] = name;\n }\n }\n\n return headers;\n};\n","export * from './base';\n\n// specific extension types\nexport * from './dashboards';\nexport * from './features';\nexport * from './kebab-actions';\nexport * from './models';\nexport * from './overview';\nexport * from './pages';\nexport * from './global-configs';\nexport * from './horizontal-nav';\nexport * from './guided-tour';\nexport * from './post-form-submit';\nexport * from './detail-page-bread-crumbs';\n","import { K8sResourceKind } from '@console/internal/module/k8s';\n\nexport const getInfrastructurePlatform = (infrastructure: K8sResourceKind): string =>\n infrastructure && infrastructure.status ? infrastructure.status.platform : undefined;\nexport const getInfrastructureAPIURL = (infrastructure: K8sResourceKind): string =>\n infrastructure && infrastructure.status ? infrastructure.status.apiServerURL : undefined;\nexport const isSingleNode = (infrastructure: K8sResourceKind): boolean =>\n infrastructure?.status?.controlPlaneTopology === 'SingleReplica';\n","import * as React from 'react';\nimport { useFormikContext, FormikValues } from 'formik';\nimport { useDeepCompareMemoize } from './deep-compare-memoize';\n\nexport const useFormikValidationFix = (value: any) => {\n const { validateForm } = useFormikContext<FormikValues>();\n const memoizedValue = useDeepCompareMemoize(value);\n const mounted = React.useRef(false);\n\n React.useEffect(() => {\n if (!mounted.current) {\n // skip auto validation when the component just mounted\n mounted.current = true;\n } else {\n validateForm();\n }\n }, [memoizedValue, validateForm]);\n};\n","export { useResizeObserver } from '@openshift-console/plugin-shared/src/hooks/useResizeObserver';\n","import { useEffect, useRef } from 'react';\nimport { coFetchJSON } from '../../co-fetch';\n\nexport const useSafeFetch = () => {\n const controller = useRef<AbortController>();\n useEffect(() => {\n controller.current = new AbortController();\n return () => controller.current.abort();\n }, []);\n\n return (url) => coFetchJSON(url, 'get', { signal: controller.current.signal as AbortSignal });\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport * as classNames from 'classnames';\nimport { sortable } from '@patternfly/react-table';\nimport { useTranslation } from 'react-i18next';\nimport i18next from 'i18next';\nimport { DetailsPage, ListPage, Table, TableData } from './factory';\nimport { SecretData } from './configmap-and-secret-data';\nimport {\n Kebab,\n SectionHeading,\n ResourceKebab,\n ResourceLink,\n ResourceSummary,\n Timestamp,\n detailsPage,\n navFactory,\n resourceObjPath,\n} from './utils';\nimport { SecretType } from './secrets/create-secret';\nimport { configureAddSecretToWorkloadModal } from './modals/add-secret-to-workload';\nimport { DetailsItem } from './utils/details-item';\n\nexport const WebHookSecretKey = 'WebHookSecretKey';\n\nexport const addSecretToWorkload = (kindObj, secret) => {\n const { name: secretName, namespace } = secret.metadata;\n\n return {\n callback: () => configureAddSecretToWorkloadModal({ secretName, namespace, blocking: true }),\n label: i18next.t('public~Add Secret to workload'),\n };\n};\n\nconst actionButtons = [addSecretToWorkload];\n\nconst menuActions = [\n Kebab.factory.ModifyLabels,\n Kebab.factory.ModifyAnnotations,\n (kind, obj) => {\n return {\n // t('public~Edit Secret')\n labelKey: 'public~Edit Secret',\n href: `${resourceObjPath(obj, kind.kind)}/edit`,\n accessReview: {\n group: kind.apiGroup,\n resource: kind.plural,\n name: obj.metadata.name,\n namespace: obj.metadata.namespace,\n verb: 'update',\n },\n };\n },\n Kebab.factory.Delete,\n];\n\nconst kind = 'Secret';\n\nconst tableColumnClasses = [\n '',\n '',\n 'pf-m-hidden pf-m-visible-on-md',\n 'pf-m-hidden pf-m-visible-on-xl pf-v5-u-w-8-on-xl',\n 'pf-m-hidden pf-m-visible-on-lg',\n Kebab.columnClass,\n];\n\nconst SecretTableRow = ({ obj: secret }) => {\n const data = _.size(secret.data);\n return (\n <>\n <TableData className={tableColumnClasses[0]}>\n <ResourceLink\n kind=\"Secret\"\n name={secret.metadata.name}\n namespace={secret.metadata.namespace}\n />\n </TableData>\n <TableData\n className={classNames(tableColumnClasses[1], 'co-break-word')}\n columnID=\"namespace\"\n >\n <ResourceLink kind=\"Namespace\" name={secret.metadata.namespace} />\n </TableData>\n <TableData className={classNames(tableColumnClasses[2], 'co-break-word')}>\n {secret.type}\n </TableData>\n <TableData className={tableColumnClasses[3]}>{data}</TableData>\n <TableData className={tableColumnClasses[4]}>\n <Timestamp timestamp={secret.metadata.creationTimestamp} />\n </TableData>\n <TableData className={tableColumnClasses[5]}>\n <ResourceKebab actions={menuActions} kind={kind} resource={secret} />\n </TableData>\n </>\n );\n};\n\nconst SecretDetails = ({ obj: secret }) => {\n const { t } = useTranslation();\n const { data, type } = secret;\n return (\n <>\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Secret details')} />\n <div className=\"row\">\n <div className=\"col-md-6\">\n <ResourceSummary resource={secret} />\n </div>\n {type && (\n <div className=\"col-md-6\">\n <dl data-test-id=\"resource-type\" className=\"co-m-pane__details\">\n <DetailsItem label={t('public~Type')} obj={secret} path=\"type\" />\n </dl>\n </div>\n )}\n </div>\n </div>\n <div className=\"co-m-pane__body\">\n <SecretData data={data} type={type} />\n </div>\n </>\n );\n};\n\nconst SecretsList = (props) => {\n const { t } = useTranslation();\n const SecretTableHeader = () => [\n {\n title: t('public~Name'),\n sortField: 'metadata.name',\n transforms: [sortable],\n props: { className: tableColumnClasses[0] },\n },\n {\n title: t('public~Namespace'),\n sortField: 'metadata.namespace',\n transforms: [sortable],\n props: { className: tableColumnClasses[1] },\n id: 'namespace',\n },\n {\n title: t('public~Type'),\n sortField: 'type',\n transforms: [sortable],\n props: { className: tableColumnClasses[2] },\n },\n {\n title: t('public~Size'),\n sortFunc: 'dataSize',\n transforms: [sortable],\n props: { className: tableColumnClasses[3] },\n },\n {\n title: t('public~Created'),\n sortField: 'metadata.creationTimestamp',\n transforms: [sortable],\n props: { className: tableColumnClasses[4] },\n },\n {\n title: '',\n props: { className: tableColumnClasses[5] },\n },\n ];\n\n return (\n <Table\n {...props}\n aria-label={t('public~Secrets')}\n Header={SecretTableHeader}\n Row={SecretTableRow}\n virtualize\n />\n );\n};\nSecretsList.displayName = 'SecretsList';\n\nconst IMAGE_FILTER_VALUE = 'Image';\nconst SOURCE_FILTER_VALUE = 'Source';\nconst TLS_FILTER_VALUE = 'TLS';\nconst SA_TOKEN_FILTER_VALUE = 'Service Account Token';\nconst OPAQUE_FILTER_VALUE = 'Opaque';\n\nexport const secretTypeFilterReducer = (secret) => {\n switch (secret.type) {\n case SecretType.dockercfg:\n case SecretType.dockerconfigjson:\n return IMAGE_FILTER_VALUE;\n\n case SecretType.basicAuth:\n case SecretType.sshAuth:\n return SOURCE_FILTER_VALUE;\n\n case SecretType.tls:\n return TLS_FILTER_VALUE;\n\n case SecretType.serviceAccountToken:\n return SA_TOKEN_FILTER_VALUE;\n\n default:\n // This puts all unrecognized types under \"Opaque\". Since unrecognized types should be uncommon,\n // it avoids an \"Other\" category that is usually empty.\n return OPAQUE_FILTER_VALUE;\n }\n};\n\nconst SecretsPage = (props) => {\n const { t } = useTranslation();\n const createItems = {\n generic: t('public~Key/value secret'),\n image: t('public~Image pull secret'),\n source: t('public~Source secret'),\n webhook: t('public~Webhook secret'),\n yaml: t('public~From YAML'),\n };\n\n const createProps = {\n items: createItems,\n createLink: (type) =>\n `/k8s/ns/${props.namespace || 'default'}/secrets/~new/${type !== 'yaml' ? type : ''}`,\n };\n\n const secretTypeFilterValues = [\n {\n id: IMAGE_FILTER_VALUE,\n title: t('public~Image'),\n },\n {\n id: SOURCE_FILTER_VALUE,\n title: t('public~Source'),\n },\n {\n id: TLS_FILTER_VALUE,\n title: t('public~TLS'),\n },\n {\n id: SA_TOKEN_FILTER_VALUE,\n title: t('public~Service Account Token'),\n },\n {\n id: OPAQUE_FILTER_VALUE,\n title: t('public~Opaque'),\n },\n ];\n\n const filters = [\n {\n filterGroupName: t('public~Type'),\n type: 'secret-type',\n reducer: secretTypeFilterReducer,\n items: secretTypeFilterValues,\n },\n ];\n\n return (\n <ListPage\n ListComponent={SecretsList}\n canCreate={true}\n rowFilters={filters}\n createButtonText={t('public~Create')}\n createProps={createProps}\n {...props}\n />\n );\n};\n\nconst SecretsDetailsPage = (props) => (\n <DetailsPage\n {...props}\n buttonActions={actionButtons}\n menuActions={menuActions}\n pages={[navFactory.details(detailsPage(SecretDetails)), navFactory.editYaml()]}\n />\n);\n\nexport { SecretsList, SecretsPage, SecretsDetailsPage };\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport { useTranslation } from 'react-i18next';\nimport { K8sResourceKind, OwnerReference, referenceForOwnerRef } from '../../module/k8s';\nimport { ResourceLink } from './resource-link';\n\nexport const OwnerReferences: React.FC<OwnerReferencesProps> = ({ resource }) => {\n const { t } = useTranslation();\n const owners = (_.get(resource.metadata, 'ownerReferences') || []).map((o: OwnerReference) => (\n <ResourceLink\n key={o.uid}\n kind={referenceForOwnerRef(o)}\n name={o.name}\n namespace={resource.metadata.namespace}\n />\n ));\n return owners.length ? <>{owners}</> : <span className=\"text-muted\">{t('public~No owner')}</span>;\n};\n\ntype OwnerReferencesProps = {\n resource: K8sResourceKind;\n};\n\nOwnerReferences.displayName = 'OwnerReferences';\n","import {\n Action,\n ActionGroup,\n GroupedMenuOption,\n MenuOption,\n MenuOptionType,\n} from '@console/dynamic-plugin-sdk';\nimport { LoadedExtension } from '@console/plugin-sdk';\n\nexport const createMenuOptions = (\n actions: Action[],\n groupExtensions: LoadedExtension<ActionGroup>[],\n): MenuOption[] => {\n const menuOptions = [];\n\n // Default menu groups $top and $bottom.\n const topGroup = {\n id: '$top',\n children: [],\n };\n const bottomGroup = {\n id: '$bottom',\n children: [],\n };\n\n const submenus = {\n [topGroup.id]: topGroup,\n [bottomGroup.id]: bottomGroup,\n };\n const groups = [topGroup, ...groupExtensions.map((group) => group.properties), bottomGroup];\n\n actions.forEach((action) => {\n if (action.path) {\n const parts = action.path.split('/');\n parts.forEach((part, index) => {\n let subMenu = submenus[part];\n const partGroup = groups.find((group) => group.id === part);\n if (partGroup && !submenus[part]) {\n subMenu = { ...partGroup, children: [] };\n submenus[part] = subMenu;\n if (index === 0) {\n menuOptions.push(subMenu);\n } else {\n submenus[parts[index - 1]].children.push(subMenu);\n }\n }\n });\n submenus[parts[parts.length - 1]].children.push(action);\n } else {\n menuOptions.push(action);\n }\n });\n\n if (topGroup.children.length > 0) menuOptions.unshift(topGroup);\n if (bottomGroup.children.length > 0) menuOptions.push(bottomGroup);\n\n return menuOptions;\n};\n\nexport const getMenuOptionType = (option: MenuOption) => {\n // a grouped menu has children\n const isGroupMenu = Array.isArray((option as GroupedMenuOption).children);\n // a submenu menu has children and submenu property true\n const isSubMenu = isGroupMenu && (option as GroupedMenuOption).submenu;\n\n if (isSubMenu) {\n return MenuOptionType.SUB_MENU;\n }\n\n if (isGroupMenu) {\n return MenuOptionType.GROUP_MENU;\n }\n\n return MenuOptionType.ATOMIC_MENU;\n};\n","export const addPubSubConnectionModal = (props) =>\n import('./PubSubController' /* webpackChunkName: \"pub-sub-connectors\" */).then((m) =>\n m.PubSubModalLauncher(props),\n );\n","export { default as Modal } from './Modal';\n","export { default as Popper } from './Popper';\n","import * as React from 'react';\nimport { AlertVariant } from '@patternfly/react-core';\n\nexport const ToastVariant = AlertVariant;\n\nexport type ToastOptions = {\n // Optional ID identifying this toast. If not provided, one will be generated.\n id?: string;\n // The toast title.\n title: string;\n // The toast variant, one of: success, danger, warning, info, default\n variant: AlertVariant;\n // The toast content.\n content: React.ReactNode;\n // Optional actions to display in the toast.\n actions?: {\n // The action label.\n label: string;\n // The action callback.\n callback: () => void;\n // If `true`, executing this action will dismiss the toast.\n dismiss?: boolean;\n // Sets the base component to render. defaults to button\n component?: React.ElementType<any> | React.ComponentType<any>;\n // The data test id\n dataTest?: string;\n }[];\n // The data test id\n dataTest?: string;\n // If `true`, displays a close button.\n dismissible?: boolean;\n // If set to true, the time out is 8000 milliseconds.\n // If a number is provided, alert will be dismissed after that amount of time in milliseconds.\n timeout?: number | boolean;\n // Callback when the toast is removed.\n onRemove?: (id: string) => void;\n // Callback to run when toast is dismissed with close button\n onClose?: () => void;\n};\n\nexport type ToastContextType = {\n // Add a toast alert. Returns the toast ID.\n addToast: (options: ToastOptions) => string;\n // Remove a toast alert.\n removeToast: (id: string) => void;\n};\n\nexport default React.createContext<ToastContextType>({} as any);\n","export * from './catalog-view';\nexport * from './details';\nexport * from './hooks';\nexport * from './service';\nexport * from './utils';\nexport { default as CatalogBadges } from './CatalogBadges';\nexport { default as CatalogController } from './CatalogController';\nexport { default as CatalogTile } from './CatalogTile';\n","import { Rule, PrometheusRulesResponse } from '../api/common-types';\nimport { CodeRef, Extension, ExtensionDeclaration } from '../types';\n\ntype AlertingRulesFetch = (namespace?: string) => Promise<PrometheusRulesResponse>;\n\n/** Alerting rules from additional sources other than Prometheus */\nexport type AlertingRulesSourceExtension = ExtensionDeclaration<\n 'console.alerts/rules-source',\n {\n /** Id of the alerting rules source */\n id: string;\n /** ContextId on which this source of alerting rules should be used */\n contextId: string;\n /** Promise that returns Prometheus-compatible alerting rules */\n getAlertingRules: CodeRef<AlertingRulesFetch>;\n }\n>;\n\ntype AlertingRuleChartProps = { rule?: Rule };\n\n/** Metric charts for alerting rules from additional sources other than Prometheus */\nexport type AlertingRuleChartExtension = ExtensionDeclaration<\n 'console.alerts/rules-chart',\n {\n /** Source Id belonging to one 'console.alerts/rules-source' used to fetch alerting rule metrics */\n sourceId: string;\n /** Chart component to be rendered as alerting rule metrics */\n chart: CodeRef<React.ComponentType<AlertingRuleChartProps>>;\n }\n>;\n\n// Type guards\n\nexport const isAlertingRulesSource = (e: Extension): e is AlertingRulesSourceExtension =>\n e.type === 'console.alerts/rules-source';\n\nexport const isAlertingRuleChart = (e: Extension): e is AlertingRuleChartExtension =>\n e.type === 'console.alerts/rules-chart';\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\ntype GetContainer = Element | null | undefined | (() => Element);\n\ntype PortalProps = {\n container?: GetContainer;\n};\n\nconst getContainer = (container: GetContainer): Element | null | undefined =>\n typeof container === 'function' ? container() : container;\n\nconst Portal: React.FC<PortalProps> = ({ children, container }) => {\n const [containerNode, setContainerNode] = React.useState<Element>();\n\n React.useLayoutEffect(() => {\n setContainerNode(getContainer(container) || document.body);\n }, [container]);\n\n return containerNode ? ReactDOM.createPortal(children, containerNode) : null;\n};\n\nexport default Portal;\n","import { Dispatch, SetStateAction } from 'react';\nimport { useUserSettings } from '@console/shared';\n\nexport const PREFERRED_NAMESPACE_USER_SETTING_KEY: string = 'console.namespace.favorite';\n\nexport const usePreferredNamespace = (): [string, Dispatch<SetStateAction<string>>, boolean] => {\n const [preferredNamespace, setPreferredNamespace, preferredNamespaceLoaded] = useUserSettings<\n string\n >(PREFERRED_NAMESPACE_USER_SETTING_KEY);\n\n // This toString is workaround because the useUserSettings hook returns a number or boolean\n // when the saved value represents a number (1234) or boolean (true/false).\n // This is a workaround for https://bugzilla.redhat.com/show_bug.cgi?id=2009345.\n // We will implement a more generic fix with https://issues.redhat.com/browse/ODC-6514\n return [preferredNamespace?.toString(), setPreferredNamespace, preferredNamespaceLoaded];\n};\n","import * as _ from 'lodash-es';\n\nimport {\n humanizeBinaryBytes,\n humanizeDecimalBytesPerSec,\n humanizeNumber,\n humanizePacketsPerSec,\n humanizeSeconds,\n} from '../utils';\n\nexport const formatNumber = (s: string, decimals = 2, format = 'short'): string => {\n const value = Number(s);\n if (_.isNil(s) || isNaN(value)) {\n return s || '-';\n }\n\n switch (format) {\n case 'percentunit':\n return Intl.NumberFormat(undefined, {\n style: 'percent',\n maximumFractionDigits: decimals,\n minimumFractionDigits: decimals,\n }).format(value);\n case 'bytes':\n return humanizeBinaryBytes(value).string;\n case 'Bps':\n return humanizeDecimalBytesPerSec(value).string;\n case 'pps':\n return humanizePacketsPerSec(value).string;\n case 'ms':\n return humanizeSeconds(value, 'ms').string;\n case 's':\n return humanizeSeconds(value * 1000, 'ms').string;\n case 'short':\n // fall through\n default:\n return humanizeNumber(value).string;\n }\n};\n","export enum ValidationErrorType {\n Error = 'error',\n TrivialError = 'trivial-error', // should not be visible but affects data validation\n Warn = 'warning',\n Info = 'info',\n}\n\nexport type ValidationObject = {\n messageKey: string;\n type?: ValidationErrorType;\n};\n","import { ArrayHelpers } from 'formik';\nimport { FieldProps } from '../field-types';\n\nexport type OnChangeHandler = (newValue: string[]) => void;\nexport type TextColumnFieldChildParameterProps = {\n name: string;\n onChange?: OnChangeHandler;\n isReadOnly?: boolean;\n placeholder?: string;\n};\n\nexport type MergeNewValueUtil = (newValue: string) => string[];\nexport type TextColumnFieldChildProps = (\n data: TextColumnFieldChildParameterProps,\n mergeNewValue: MergeNewValueUtil,\n) => React.ReactNode;\n\nexport type TextColumnFieldProps = FieldProps & {\n required?: boolean;\n name: string;\n label: string;\n addLabel?: string;\n disableDeleteRow?: boolean;\n tooltipDeleteRow?: string;\n placeholder?: string;\n onChange?: OnChangeHandler;\n dndEnabled?: boolean;\n children?: TextColumnFieldChildProps;\n};\n\nexport type TextColumnItemProps = TextColumnFieldProps & {\n idx: number;\n rowValues: string[];\n arrayHelpers: ArrayHelpers;\n};\n\nexport const ItemTypes = {\n TextColumn: 'TextColumn',\n};\n\nexport type DragItem = {\n idx: number;\n id: string;\n type: string;\n};\n","import * as React from 'react';\nimport { NavItem } from '@patternfly/react-core';\nimport { ResourceNSNavItem } from '@console/dynamic-plugin-sdk';\nimport { referenceForExtensionModel } from '@console/internal/module/k8s';\nimport {\n formatNamespacedRouteForResource,\n LAST_NAMESPACE_NAME_LOCAL_STORAGE_KEY,\n ALL_NAMESPACES_KEY,\n} from '@console/shared';\nimport { useActiveNamespace } from '@console/shared/src/hooks/useActiveNamespace';\nimport { useK8sModel } from '@console/shared/src/hooks/useK8sModel';\nimport { useLocation } from '@console/shared/src/hooks/useLocation';\nimport { NavLink, NavLinkProps } from './NavLink';\nimport { navItemResourceIsActive } from './utils';\n\nexport const NavItemResource: React.FC<NavItemResourceProps> = ({\n model,\n startsWith,\n namespaced,\n className,\n dataAttributes,\n ...navLinkProps\n}) => {\n const [activeNamespace] = useActiveNamespace();\n const location = useLocation();\n const lastNamespace = sessionStorage.getItem(LAST_NAMESPACE_NAME_LOCAL_STORAGE_KEY);\n const resourceReference = referenceForExtensionModel(model);\n const [k8sModel] = useK8sModel(resourceReference);\n const isActive = React.useMemo(() => navItemResourceIsActive(location, k8sModel, startsWith), [\n k8sModel,\n location,\n startsWith,\n ]);\n const to = React.useCallback(\n () =>\n namespaced\n ? formatNamespacedRouteForResource(\n resourceReference,\n lastNamespace === ALL_NAMESPACES_KEY ? lastNamespace : activeNamespace,\n )\n : `/k8s/cluster/${resourceReference}`,\n [namespaced, resourceReference, lastNamespace, activeNamespace],\n );\n return (\n <NavItem className={className} isActive={isActive}>\n <NavLink {...navLinkProps} {...dataAttributes} to={to()} />\n </NavItem>\n );\n};\n\nexport type NavItemResourceProps = Omit<NavLinkProps, 'to'> &\n Pick<ResourceNSNavItem['properties'], 'model' | 'startsWith' | 'dataAttributes'> & {\n namespaced: boolean;\n };\n","// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useSelector } from 'react-redux';\nimport { RootState } from '@console/internal/redux';\n\nexport const useLocation = (): string =>\n useSelector(({ UI }: RootState) => UI.get('location') ?? '');\n","import * as React from 'react';\nimport { useUserSettingsCompatibility } from '@console/shared/src/hooks/useUserSettingsCompatibility';\n\nexport const PREFERRED_LANGUAGE_USER_SETTING_KEY = 'console.preferredLanguage';\nconst PREFERRED_LANGUAGE_LOCAL_STORAGE_KEY = 'bridge/language';\n\nexport const usePreferredLanguage = (): [\n string,\n React.Dispatch<React.SetStateAction<string>>,\n boolean,\n] =>\n useUserSettingsCompatibility<string>(\n PREFERRED_LANGUAGE_USER_SETTING_KEY,\n PREFERRED_LANGUAGE_LOCAL_STORAGE_KEY,\n null,\n true,\n );\n","import { action } from 'typesafe-actions';\n\nenum ActionType {\n SetCreateProjectMessage = 'setCreateProjectMessage',\n SetClusterID = 'setClusterID',\n}\n\nexport const setClusterID = (clusterID: string) => action(ActionType.SetClusterID, { clusterID });\nexport const setCreateProjectMessage = (message: string) =>\n action(ActionType.SetCreateProjectMessage, { message });\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from 'react-router-dom-v5-compat';\nimport * as _ from 'lodash-es';\nimport { BanIcon } from '@patternfly/react-icons/dist/esm/icons/ban-icon';\nimport { PendingIcon } from '@patternfly/react-icons/dist/esm/icons/pending-icon';\nimport { SyncAltIcon } from '@patternfly/react-icons/dist/esm/icons/sync-alt-icon';\n\nimport { resourcePath, ExternalLink } from './utils';\nimport { fromNow } from './utils/datetime';\nimport { K8sResourceKind } from '../module/k8s';\nimport { getBuildNumber } from '../module/k8s/builds';\nimport { GreenCheckCircleIcon, RedExclamationCircleIcon } from '@console/shared';\n\nconst getStages = (status): any[] => (status && status.stages) || [];\nconst getJenkinsStatus = (resource: K8sResourceKind) => {\n const json = _.get(resource, ['metadata', 'annotations', 'openshift.io/jenkins-status-json']);\n if (!json) {\n return {};\n }\n\n const status = _.attempt(JSON.parse, json);\n return _.isError(status) ? {} : status;\n};\n\nexport const getJenkinsLogURL = (resource: K8sResourceKind): string =>\n _.get(resource, ['metadata', 'annotations', 'openshift.io/jenkins-console-log-url']);\nexport const getJenkinsBuildURL = (resource: K8sResourceKind): string =>\n _.get(resource, ['metadata', 'annotations', 'openshift.io/jenkins-build-uri']);\n\nconst BuildSummaryStatusIcon: React.SFC<BuildSummaryStatusIconProps> = ({ status }) => {\n const statusClass = _.lowerCase(status);\n const icon = {\n new: '',\n pending: <PendingIcon />,\n running: <SyncAltIcon className=\"fa-spin\" />,\n complete: <GreenCheckCircleIcon />,\n failed: <RedExclamationCircleIcon />,\n cancelled: <BanIcon />,\n }[statusClass];\n\n return icon ? (\n <span className={`build-pipeline__status-icon build-pipeline__status-icon--${statusClass}`}>\n {icon}\n </span>\n ) : null;\n};\n\nexport const BuildPipelineLogLink: React.SFC<BuildPipelineLogLinkProps> = ({ obj }) => {\n const { t } = useTranslation();\n const link = getJenkinsLogURL(obj);\n return link ? (\n <ExternalLink\n href={link}\n text={t('public~View logs')}\n additionalClassName=\"build-pipeline__log-link\"\n />\n ) : null;\n};\n\nconst StagesNotStarted: React.SFC = () => {\n const { t } = useTranslation();\n return (\n <div className=\"build-pipeline__stage build-pipeline__stage--none\">\n {t('public~No stages have started.')}\n </div>\n );\n};\n\nconst BuildSummaryTimestamp: React.SFC<BuildSummaryTimestampProps> = ({ timestamp }) => (\n <span className=\"build-pipeline__timestamp text-muted\">{fromNow(timestamp)}</span>\n);\n\nconst BuildPipelineSummary: React.SFC<BuildPipelineSummaryProps> = ({ obj }) => {\n const { name, namespace } = obj.metadata;\n const buildNumber = getBuildNumber(obj);\n const path: string = resourcePath(obj.kind, name, namespace);\n const { t } = useTranslation();\n return (\n <div className=\"build-pipeline__summary\">\n <div className=\"build-pipeline__phase\">\n <BuildSummaryStatusIcon status={obj.status.phase} />{' '}\n <Link to={path} title={name}>\n {t('public~Build {{buildNumber}}', { buildNumber })}\n </Link>\n </div>\n <BuildSummaryTimestamp timestamp={obj.metadata.creationTimestamp} />\n <BuildPipelineLogLink obj={obj} />\n </div>\n );\n};\n\nconst BuildAnimation: React.SFC<BuildAnimationProps> = ({ status }) => (\n <div className={`build-pipeline__status-bar build-pipeline__status-bar--${_.kebabCase(status)}`}>\n <div className=\"build-pipeline__animation-line\" />\n <div className=\"build-pipeline__animation-circle\">\n <div className=\"build-pipeline__circle-clip1\" />\n <div className=\"build-pipeline__circle-clip2\" />\n <div className=\"build-pipeline__circle-inner\">\n <div className=\"build-pipeline__circle-inner-fill\" />\n </div>\n </div>\n </div>\n);\n\nconst JenkinsInputUrl: React.SFC<JenkinsInputUrlProps> = ({ obj, stage }) => {\n const pending = stage.status === 'PAUSED_PENDING_INPUT';\n const { t } = useTranslation();\n\n if (!pending) {\n return null;\n }\n\n const buildUrl = getJenkinsBuildURL(obj);\n return (\n <div className=\"build-pipeline__stage-actions text-muted\">\n <ExternalLink href={buildUrl} text={t('public~Input required')} />\n </div>\n );\n};\n\nconst BuildStageTimestamp: React.SFC<BuildStageTimestampProps> = ({ timestamp }) => (\n <div className=\"build-pipeline__stage-time text-muted\">{fromNow(timestamp)}</div>\n);\n\nconst BuildStageName: React.SFC<BuildStageNameProps> = ({ name }) => {\n return (\n <div title={name} className=\"build-pipeline__stage-name\">\n {name}\n </div>\n );\n};\n\nconst BuildStage: React.SFC<BuildStageProps> = ({ obj, stage }) => {\n return (\n <div className=\"build-pipeline__stage\">\n <div className=\"build-pipeline__stage-column\">\n <BuildStageName name={stage.name} />\n <BuildAnimation status={stage.status} />\n <JenkinsInputUrl obj={obj} stage={stage} />\n <BuildStageTimestamp timestamp={stage.startTimeMillis} />\n </div>\n </div>\n );\n};\n\nexport const BuildPipeline: React.SFC<BuildPipelineProps> = ({ obj }) => {\n const jenkinsStatus: any = getJenkinsStatus(obj);\n const stages = getStages(jenkinsStatus);\n return (\n <div className=\"build-pipeline\">\n <BuildPipelineSummary obj={obj} />\n <div className=\"build-pipeline__container\">\n <div className=\"build-pipeline__stages\">\n {_.isEmpty(stages) ? (\n <StagesNotStarted />\n ) : (\n stages.map((stage) => <BuildStage obj={obj} stage={stage} key={stage.id} />)\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport type BuildPipelineProps = {\n obj: K8sResourceKind;\n};\n\nexport type BuildStageProps = {\n obj: K8sResourceKind;\n stage: any;\n};\n\nexport type BuildAnimationProps = {\n status: string;\n};\n\nexport type BuildPipelineSummaryProps = {\n obj: K8sResourceKind;\n};\n\nexport type BuildSummaryStatusIconProps = {\n status: string;\n};\n\nexport type BuildStageTimestampProps = {\n timestamp: string;\n};\n\nexport type BuildPipelineLogLinkProps = {\n obj: K8sResourceKind;\n};\n\nexport type BuildPipelineLinkProps = {\n obj: K8sResourceKind;\n title: string;\n};\n\nexport type BuildSummaryTimestampProps = {\n timestamp: string;\n};\n\nexport type BuildStageNameProps = {\n name: string;\n};\n\nexport type JenkinsInputUrlProps = {\n obj: K8sResourceKind;\n stage: any;\n};\n","import { StandardConsolePluginManifest } from '../build-types';\n\nexport const getPluginID = (m: StandardConsolePluginManifest) => `${m.name}@${m.version}`;\n","import * as React from 'react';\nimport { PlusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon';\nimport { Trans, useTranslation } from 'react-i18next';\nimport * as semver from 'semver';\nimport { ExternalLink } from '@console/internal/components/utils';\nimport { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';\nimport { ConsoleLinkModel } from '@console/internal/models';\nimport { K8sResourceKind, referenceForModel } from '@console/internal/module/k8s';\nimport { useOpenShiftVersion } from '@console/shared/src/hooks/version';\n\nconst DevPerspectiveTourText: React.FC = () => {\n const { t } = useTranslation();\n const fullVersion = useOpenShiftVersion();\n const parsed = semver.parse(fullVersion);\n // Show only major and minor version.\n const version = parsed ? `${parsed.major}.${parsed.minor}` : '4.x';\n return (\n <>\n {t(\n \"devconsole~Get started with a tour of some of the key areas in OpenShift {{version}}'s Developer perspective that can help you complete workflows and be more productive.\",\n { version },\n )}\n </>\n );\n};\n\nexport const devPerspectiveTourText = <DevPerspectiveTourText />;\n\nconst PerspectiveSwitcherTourText: React.FC = () => {\n const { t } = useTranslation();\n return (\n <>\n <p>{t('devconsole~Switch between the Developer and Administrator perspectives.')}</p>\n <p>\n {t(\n 'devconsole~Use the Administrator perspective to manage workload storage, networking, cluster settings, and more. This may require additional user access.',\n )}\n </p>\n <p>\n {t(\n 'devconsole~Use the Developer perspective to build applications and associated components and services, define how they work together, and monitor their health over time.',\n )}\n </p>\n </>\n );\n};\n\nexport const perspectiveSwitcherTourText = <PerspectiveSwitcherTourText />;\n\nconst WebTerminalGuidedTourText: React.FC = () => {\n const { t } = useTranslation();\n return (\n <>\n <p>\n {t(\n 'devconsole~Use command line tools directly from the Console. CLIs are pre-installed and fully authenticated when you need them.',\n )}\n </p>\n <p>\n <ExternalLink\n href=\"https://developers.redhat.com/products/odo/overview\"\n text={t('devconsole~Access odo CLI')}\n />\n </p>\n </>\n );\n};\n\nexport const webTerminalGuidedTourText = <WebTerminalGuidedTourText />;\n\nexport const SearchTourText: React.FC = () => {\n const { t } = useTranslation();\n return (\n <>\n <p>\n {t(\n 'devconsole~Search for resources in your Project by simply starting to type or scrolling through a list of existing resources.',\n )}\n </p>\n <p>\n {t(\n 'devconsole~Add frequently accessed resources to your side navigation for quick access. Look for the',\n )}{' '}\n <span style={{ color: 'var(--pf-v5-global--palette--blue-400)' }}>\n <PlusCircleIcon /> {t('devconsole~Add to navigation')}\n </span>{' '}\n {t('devconsole~link next to your search result.')}\n </p>\n </>\n );\n};\n\nexport const searchTourText = <SearchTourText />;\n\nexport const FinishTourText: React.FC = () => {\n const [consoleLinks] = useK8sWatchResource<K8sResourceKind[]>({\n isList: true,\n kind: referenceForModel(ConsoleLinkModel),\n optional: true,\n });\n const { t } = useTranslation();\n const openshiftBlogLink =\n consoleLinks.filter((link: K8sResourceKind) => link.metadata.name === 'openshift-blog')[0]?.spec\n ?.href || 'https://developers.redhat.com/products/openshift/whats-new';\n // declaring openshiftHelpBase instead of importing because it throws error while using it as tour extension\n const openshiftHelpBase =\n window.SERVER_FLAGS.documentationBaseURL || 'https://docs.okd.io/latest/';\n return (\n <Trans t={t} ns=\"devconsole\">\n Stay up-to-date with everything OpenShift on our{' '}\n <a\n href={openshiftBlogLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-test=\"openshift-blog-link\"\n >\n blog\n </a>{' '}\n or continue to learn more in our{' '}\n <a\n href={openshiftHelpBase}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-test=\"openshift-docs-link\"\n >\n documentation\n </a>\n .\n </Trans>\n );\n};\n\nexport const finishTourText = <FinishTourText />;\n","export const getOperatorTopologyDataModel = () =>\n import(\n './operators-data-transformer' /* webpackChunkName: \"operators-topology-components\" */\n ).then((m) => m.getOperatorTopologyDataModel);\n\nexport const getOperatorsComponentFactory = () =>\n import(\n './components/operatorsComponentFactory' /* webpackChunkName: \"operators-topology-components\" */\n ).then((m) => m.getOperatorsComponentFactory);\n\nexport const getDataModelReconciler = () =>\n import(\n './operatorsDataModelReconciler' /* webpackChunkName: \"operators-topology-components\" */\n ).then((m) => m.operatorsDataModelReconciler);\n\nexport const getTopologyFilters = () =>\n import('./operatorFilters' /* webpackChunkName: \"operators-topology-components\" */).then(\n (m) => m.getTopologyFilters,\n );\n\nexport const applyDisplayOptions = () =>\n import('./operatorFilters' /* webpackChunkName: \"operators-topology-components\" */).then((m) =>\n m.applyDisplayOptions(),\n );\n","import { ObjectMetadata } from '@console/internal/module/k8s';\nimport { parseJSONAnnotation } from '@console/shared/src/utils/annotations';\nimport { INTERNAL_OBJECTS_ANNOTATION, OPERATOR_PLUGINS_ANNOTATION } from './const';\nimport { SubscriptionKind, SubscriptionState } from './types';\n\nexport const getClusterServiceVersionPlugins = (\n annotations: ObjectMetadata['annotations'],\n): string[] => parseJSONAnnotation(annotations, OPERATOR_PLUGINS_ANNOTATION) ?? [];\n\nexport const getInternalObjects = (annotations: ObjectMetadata['annotations']): string[] =>\n parseJSONAnnotation(annotations, INTERNAL_OBJECTS_ANNOTATION) ?? [];\n\nexport const isCatalogSourceTrusted = (catalogSource: string): boolean =>\n catalogSource === 'redhat-operators';\n\nexport const upgradeRequiresApproval = (subscription: SubscriptionKind): boolean =>\n subscription?.status?.state === SubscriptionState.SubscriptionStateUpgradePending &&\n (subscription.status?.conditions ?? []).filter(\n ({ status, reason }) => status === 'True' && reason === 'RequiresApproval',\n ).length > 0;\n","import { useURLPoll } from '../utils/url-poll-hook';\nimport { getPrometheusURL } from './helpers';\nimport { DEFAULT_PROMETHEUS_SAMPLES, DEFAULT_PROMETHEUS_TIMESPAN, PrometheusResponse } from '.';\nimport { PrometheusPollProps } from '@console/dynamic-plugin-sdk/src/extensions/console-types';\n\ntype UsePrometheusPoll = (props: PrometheusPollProps) => [PrometheusResponse, unknown, boolean];\n\nexport const usePrometheusPoll: UsePrometheusPoll = ({\n delay,\n endpoint,\n endTime,\n namespace,\n query,\n samples = DEFAULT_PROMETHEUS_SAMPLES,\n timeout,\n timespan = DEFAULT_PROMETHEUS_TIMESPAN,\n customDataSource,\n}) => {\n const prometheusURLProps = { endpoint, endTime, namespace, query, samples, timeout, timespan };\n\n return useURLPoll<PrometheusResponse>(\n getPrometheusURL(prometheusURLProps, customDataSource?.basePath),\n delay,\n query,\n timespan,\n );\n};\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport { CopyToClipboard as CTC } from 'react-copy-to-clipboard';\nimport { Button, CodeBlock, CodeBlockAction, CodeBlockCode, Tooltip } from '@patternfly/react-core';\nimport { CopyIcon } from '@patternfly/react-icons/dist/esm/icons/copy-icon';\nimport { useTranslation } from 'react-i18next';\n\nexport const CopyToClipboard: React.FC<CopyToClipboardProps> = React.memo((props) => {\n const [copied, setCopied] = React.useState(false);\n\n const { t } = useTranslation();\n const tooltipText = copied ? t('public~Copied') : t('public~Copy to clipboard');\n const tooltipContent = [\n <span className=\"co-nowrap\" key=\"nowrap\">\n {tooltipText}\n </span>,\n ];\n\n // Default to value if no visible value was specified.\n const visibleValue = _.isNil(props.visibleValue) ? props.value : props.visibleValue;\n\n const actions = (\n <CodeBlockAction>\n <Tooltip content={tooltipContent} trigger=\"click mouseenter focus\" exitDelay={1250}>\n <CTC text={props.value} onCopy={() => setCopied(true)}>\n <Button\n variant=\"plain\"\n onMouseEnter={() => setCopied(false)}\n className=\"co-copy-to-clipboard__btn\"\n type=\"button\"\n >\n <CopyIcon />\n <span className=\"pf-v5-u-screen-reader\">{t('public~Copy to clipboard')}</span>\n </Button>\n </CTC>\n </Tooltip>\n </CodeBlockAction>\n );\n\n return (\n <CodeBlock actions={actions} className=\"co-copy-to-clipboard\">\n <CodeBlockCode\n className=\"co-copy-to-clipboard__text\"\n data-test=\"copy-to-clipboard\"\n codeClassName=\"co-copy-to-clipboard__code\"\n >\n {visibleValue}\n </CodeBlockCode>\n </CodeBlock>\n );\n});\n\nexport type CopyToClipboardProps = {\n value: string;\n visibleValue?: React.ReactNode;\n};\n\nCopyToClipboard.displayName = 'CopyToClipboard';\n","import * as React from 'react';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useSelector, useDispatch } from 'react-redux';\nimport { UseUtilizationDuration } from '@console/dynamic-plugin-sdk/src/api/internal-types';\nimport * as UIActions from '@console/internal/actions/ui';\nimport { DEFAULT_DURATION, DEFAULT_DURATION_KEY } from '../constants';\n\nexport const useUtilizationDuration: UseUtilizationDuration = (\n adjustDuration?: (duration: number) => number,\n) => {\n const dispatch = useDispatch();\n const duration =\n useSelector(({ UI }) => UI.getIn(['utilizationDuration', 'duration'])) ?? DEFAULT_DURATION;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const endDate =\n useSelector(({ UI }) => UI.getIn(['utilizationDuration', 'endDate'])) ?? new Date();\n const selectedKey =\n useSelector(({ UI }) => UI.getIn(['utilizationDuration', 'selectedKey'])) ??\n DEFAULT_DURATION_KEY;\n const startDate = new Date(endDate.getTime() - duration);\n const updateEndDate = React.useCallback(\n (date: Date) => date > endDate && dispatch(UIActions.setUtilizationDurationEndTime(date)),\n [dispatch, endDate],\n );\n const updateDuration = React.useCallback(\n (newDuration: number) =>\n dispatch(UIActions.setUtilizationDuration(adjustDuration?.(newDuration) ?? newDuration)),\n [adjustDuration, dispatch],\n );\n const updateSelectedKey = React.useCallback(\n (key: string) => dispatch(UIActions.setUtilizationDurationSelectedKey(key)),\n [dispatch],\n );\n\n return {\n duration,\n endDate,\n selectedKey,\n startDate,\n updateDuration,\n updateEndDate,\n updateSelectedKey,\n };\n};\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport { ListPageFilterProps } from '@console/dynamic-plugin-sdk';\n\nimport { FilterToolbar } from '../../filter-toolbar';\n\nconst ListPageFilter: React.FC<ListPageFilterProps> = ({\n data,\n loaded,\n rowFilters,\n labelFilter,\n labelPath,\n nameFilterTitle,\n nameFilterPlaceholder,\n labelFilterPlaceholder,\n hideNameLabelFilters,\n hideLabelFilter,\n columnLayout,\n onFilterChange,\n hideColumnManagement,\n nameFilter,\n rowSearchFilters,\n}) =>\n loaded &&\n !_.isEmpty(data) && (\n <FilterToolbar\n rowFilters={rowFilters}\n labelFilter={labelFilter}\n labelPath={labelPath}\n nameFilterTitle={nameFilterTitle}\n data={data}\n nameFilterPlaceholder={nameFilterPlaceholder}\n labelFilterPlaceholder={labelFilterPlaceholder}\n onFilterChange={onFilterChange}\n hideNameLabelFilters={hideNameLabelFilters}\n hideLabelFilter={hideLabelFilter}\n columnLayout={columnLayout}\n hideColumnManagement={hideColumnManagement}\n textFilter={nameFilter}\n rowSearchFilters={rowSearchFilters}\n />\n );\n\nexport default ListPageFilter;\n","import * as React from 'react';\nimport * as classNames from 'classnames';\nimport { ListPageHeaderProps } from '@console/dynamic-plugin-sdk';\n\nimport { PageHeading } from '../../utils';\n\nconst ListPageHeader: React.FC<ListPageHeaderProps> = ({ helpText, title, children, badge }) => (\n <>\n {/* Badge rendered from PageHeading only when title is present */}\n <PageHeading title={title} badge={title ? badge : null} className=\"co-m-nav-title--row\">\n <div\n className={classNames('co-operator-details__actions', {\n 'co-m-pane__createLink--no-title': !title,\n })}\n >\n {children}\n </div>\n {!title && badge && <div>{badge}</div>}\n </PageHeading>\n {helpText && <p className=\"co-m-pane__help-text co-help-text\">{helpText}</p>}\n </>\n);\n\nexport default ListPageHeader;\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport { useLocation } from 'react-router-dom-v5-compat';\nimport { UseListPageFilter, FilterValue } from '@console/dynamic-plugin-sdk';\n\nimport { useExactSearch } from '@console/app/src/components/user-preferences/search';\nimport { getAllTableFilters, FilterMap } from '../table-filters';\n\nconst filterData = <D>(\n data: D[],\n filter: { [key: string]: FilterValue } = {},\n rowFilters?: FilterMap,\n) => {\n const filterTypes = Object.keys(filter);\n return data?.filter((d) =>\n filterTypes.every((type) =>\n rowFilters[type] && !_.isEmpty(filter?.[type]) ? rowFilters[type](filter[type], d) : true,\n ),\n );\n};\n\nexport const useListPageFilter: UseListPageFilter = (data, rowFilters, staticFilters) => {\n const [filter, setFilter] = React.useState<{ [key: string]: FilterValue }>();\n const [isExactSearch] = useExactSearch();\n const location = useLocation();\n\n React.useEffect(() => {\n const params = new URLSearchParams(location.search);\n const name = params.get('name');\n if (!_.isNil(name) && name !== filter?.name?.selected?.[0]) {\n setFilter((state) => ({ ...state, name: { selected: [name] } }));\n }\n }, [filter, location]);\n\n const onFilterChange = React.useCallback(\n (type, value) => setFilter((state) => ({ ...state, [type]: value })),\n [],\n );\n\n return React.useMemo(() => {\n const tableFilters = getAllTableFilters(rowFilters, isExactSearch);\n\n const staticData = filterData(data, staticFilters, tableFilters);\n const filteredData = filterData(staticData, filter, tableFilters);\n\n return [staticData, filteredData, onFilterChange];\n }, [data, filter, isExactSearch, onFilterChange, rowFilters, staticFilters]);\n};\n","import * as React from 'react';\nimport { Navigate, useLocation } from 'react-router-dom-v5-compat';\nimport { useActiveNamespace } from '@console/shared/src/hooks/useActiveNamespace';\nimport { ALL_NAMESPACES_KEY } from '@console/shared/src/constants';\n\nconst appendActiveNamespace = (namespace: string, pathname: string): string => {\n const basePath = pathname.replace(/\\/$/, '');\n return namespace === ALL_NAMESPACES_KEY\n ? `${basePath}/all-namespaces`\n : `${basePath}/ns/${namespace}`;\n};\n\nexport const NamespaceRedirect: React.FC = () => {\n const location = useLocation();\n const [activeNamespace] = useActiveNamespace();\n return (\n <Navigate\n to={appendActiveNamespace(activeNamespace, location.pathname) + location.search}\n replace\n />\n );\n};\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nexport const GraphEmpty: React.FC<GraphEmptyProps> = ({ height = 180, loading = false }) => {\n const { t } = useTranslation();\n\n return (\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n height,\n justifyContent: 'center',\n padding: '5px',\n width: '100%',\n flexGrow: 1,\n }}\n >\n {loading ? (\n <div className=\"skeleton-chart\" data-test=\"skeleton-chart\" />\n ) : (\n <div className=\"text-secondary\" data-test=\"datapoints-msg\">\n {t('public~No datapoints found.')}\n </div>\n )}\n </div>\n );\n};\n\ntype GraphEmptyProps = {\n height?: number | string;\n loading?: boolean;\n};\n","import { ObjectMetadata } from '@console/internal/module/k8s';\n\nexport const parseJSONAnnotation = (\n annotations: ObjectMetadata['annotations'],\n annotationKey: string,\n onError?: (err: Error) => void,\n defaultReturn?: any,\n): any => {\n try {\n return annotations?.[annotationKey] ? JSON.parse(annotations?.[annotationKey]) : defaultReturn;\n } catch (e) {\n onError?.(e);\n // eslint-disable-next-line no-console\n console.warn(`Could not parse annotation ${annotationKey} as JSON: `, e);\n return defaultReturn;\n }\n};\n","import * as React from 'react';\nimport PopperJS, { PopperOptions } from 'popper.js';\nimport { useCombineRefs } from '../../utils/useCombineRefs';\nimport Portal from './Portal';\n\n// alignment with PopperJS reference API\ntype PopperJSReference = {\n getBoundingClientRect: PopperJS['reference']['getBoundingClientRect'];\n clientWidth: number;\n clientHeight: number;\n};\n\ntype ClientRectProp = { x: number; y: number; width?: number; height?: number };\n\ntype Reference = Element | PopperJSReference | ClientRectProp;\n\nclass VirtualReference implements PopperJSReference {\n private rect: DOMRect;\n\n constructor({ height = 0, width = 0, x, y }: ClientRectProp) {\n this.rect = {\n bottom: y + height,\n height,\n left: x,\n right: x + width,\n top: y,\n width,\n } as DOMRect;\n }\n\n getBoundingClientRect(): DOMRect {\n return this.rect;\n }\n\n get clientWidth(): number {\n return this.rect.width || 0;\n }\n\n get clientHeight(): number {\n return this.rect.height || 0;\n }\n}\n\nconst getReference = (reference: Reference): PopperJSReference =>\n 'getBoundingClientRect' in reference ? reference : new VirtualReference(reference);\n\ntype PopperProps = {\n closeOnEsc?: boolean;\n closeOnOutsideClick?: boolean;\n container?: React.ComponentProps<typeof Portal>['container'];\n className?: string;\n open?: boolean;\n onRequestClose?: (e?: MouseEvent) => void;\n placement?:\n | 'bottom-end'\n | 'bottom-start'\n | 'bottom'\n | 'left-end'\n | 'left-start'\n | 'left'\n | 'right-end'\n | 'right-start'\n | 'right'\n | 'top-end'\n | 'top-start'\n | 'top';\n popperOptions?: PopperOptions;\n popperRef?: React.Ref<PopperJS>;\n reference: Reference | (() => Reference);\n zIndex?: number;\n returnFocus?: boolean;\n};\n\nconst DEFAULT_POPPER_OPTIONS: PopperOptions = {};\n\nconst Popper: React.FC<PopperProps> = ({\n children,\n container,\n className,\n open,\n placement = 'bottom-start',\n reference,\n popperOptions = DEFAULT_POPPER_OPTIONS,\n closeOnEsc,\n closeOnOutsideClick,\n onRequestClose,\n popperRef: popperRefIn,\n zIndex = 9999,\n returnFocus,\n}) => {\n const controlled = typeof open === 'boolean';\n const openProp = controlled ? open || false : true;\n const nodeRef = React.useRef<Element>();\n const popperRef = React.useRef<PopperJS>(null);\n const popperRefs = useCombineRefs<PopperJS>(popperRef, popperRefIn);\n const [isOpen, setOpenState] = React.useState(openProp);\n const focusRef = React.useRef<Element | null>();\n const onRequestCloseRef = React.useRef(onRequestClose);\n onRequestCloseRef.current = onRequestClose;\n\n const setOpen = React.useCallback(\n (newOpen: boolean) => {\n if (returnFocus && newOpen !== isOpen) {\n if (newOpen) {\n if (document.activeElement) {\n focusRef.current = document.activeElement;\n }\n } else if (focusRef.current instanceof HTMLElement && focusRef.current.ownerDocument) {\n focusRef.current.focus();\n }\n }\n setOpenState(newOpen);\n },\n [returnFocus, isOpen],\n );\n\n React.useEffect(() => {\n setOpen(openProp);\n }, [openProp, setOpen]);\n\n const onKeyDown = React.useCallback(\n (e: KeyboardEvent) => {\n if (e.keyCode === 27) {\n controlled ? onRequestCloseRef.current && onRequestCloseRef.current() : setOpen(false);\n }\n },\n [controlled, setOpen],\n );\n\n const onClickOutside = React.useCallback(\n (e: MouseEvent) => {\n if (!nodeRef.current || (e.target instanceof Node && !nodeRef.current.contains(e.target))) {\n controlled ? onRequestCloseRef.current && onRequestCloseRef.current(e) : setOpen(false);\n }\n },\n [controlled, setOpen],\n );\n\n const destroy = React.useCallback(() => {\n if (popperRef.current) {\n popperRef.current.destroy();\n popperRefs(null);\n document.removeEventListener('keydown', onKeyDown, true);\n document.removeEventListener('mousedown', onClickOutside, true);\n document.removeEventListener('touchstart', onClickOutside, true);\n }\n }, [onClickOutside, onKeyDown, popperRefs]);\n\n const initialize = React.useCallback(() => {\n if (!nodeRef.current || !reference || !isOpen) {\n return;\n }\n\n destroy();\n\n popperRefs(\n new PopperJS(\n getReference(typeof reference === 'function' ? reference() : reference),\n nodeRef.current,\n {\n placement,\n ...popperOptions,\n modifiers: {\n preventOverflow: {\n boundariesElement: 'window',\n },\n ...popperOptions.modifiers,\n },\n },\n ),\n );\n\n // init document listenerrs\n if (closeOnEsc) {\n document.addEventListener('keydown', onKeyDown, true);\n }\n if (closeOnOutsideClick) {\n document.addEventListener('mousedown', onClickOutside, true);\n document.addEventListener('touchstart', onClickOutside, true);\n }\n }, [\n popperRefs,\n reference,\n isOpen,\n destroy,\n placement,\n popperOptions,\n closeOnEsc,\n closeOnOutsideClick,\n onKeyDown,\n onClickOutside,\n ]);\n\n const nodeRefCallback = React.useCallback(\n (node) => {\n nodeRef.current = node;\n initialize();\n },\n [initialize],\n );\n\n React.useEffect(() => {\n initialize();\n }, [initialize]);\n\n React.useEffect(() => {\n return () => {\n destroy();\n };\n }, [destroy]);\n\n React.useEffect(() => {\n if (!isOpen) {\n destroy();\n }\n }, [destroy, isOpen]);\n\n return isOpen ? (\n <Portal container={container}>\n <div\n ref={nodeRefCallback}\n className={className}\n style={{ zIndex, position: 'absolute', top: 0, left: 0 }}\n >\n {children}\n </div>\n </Portal>\n ) : null;\n};\n\nexport default Popper;\n","export * from './common';\nexport * from './infrastructure';\nexport * from './pod';\nexport * from './machine';\nexport * from './machineSet';\nexport * from './namespace';\nexport * from './node';\nexport * from './storage';\n","import * as React from 'react';\nimport { Text, TextVariants } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { ErrorBoundaryFallbackProps } from '@console/dynamic-plugin-sdk';\nimport { ExpandCollapse } from '@console/internal/components/utils/expand-collapse';\nimport ErrorDetailsBlock from './ErrorDetailsBlock';\n\n/**\n * Standard fallback catch -- expected to take up the whole page.\n */\nconst ErrorBoundaryFallbackPage: React.FC<ErrorBoundaryFallbackProps> = (props) => {\n const { t } = useTranslation();\n return (\n <div className=\"co-m-pane__body\">\n <Text component={TextVariants.h1} className=\"co-m-pane__heading co-m-pane__heading--center\">\n {t('console-shared~Oh no! Something went wrong.')}\n </Text>\n <ExpandCollapse\n textCollapsed={t('console-shared~Show details')}\n textExpanded={t('console-shared~Hide details')}\n >\n <ErrorDetailsBlock {...props} />\n </ExpandCollapse>\n </div>\n );\n};\n\nexport default ErrorBoundaryFallbackPage;\n","import * as React from 'react';\nimport { Alert, Label, Skeleton } from '@patternfly/react-core';\nimport { NotificationEntry, NotificationTypes } from '@console/patternfly';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useTranslation } from 'react-i18next';\nimport * as UIActions from '@console/internal/actions/ui';\nimport { consoleFetchJSON } from '@console/dynamic-plugin-sdk/src/utils/fetch';\nimport { YellowExclamationTriangleIcon, RedExclamationCircleIcon } from '@console/shared';\nimport { getDuration, dateFormatter } from './datetime';\nimport { getOCMLink } from '../../module/k8s';\nimport { k8sGet } from '@console/dynamic-plugin-sdk/src/api/core-api';\nimport { SecretModel } from '../../models';\nimport { ExternalLink, FieldLevelHelp } from './index';\nimport { RootState } from '../../redux';\n\nconst useServiceLevelText = (level: string): string => {\n const { t } = useTranslation();\n const levels = {\n Premium: t('public~Premium'),\n Standard: t('public~Standard'),\n 'Self-Support': t('public~Self-support'),\n Eval: t('public~Self-support, 60 day trial'),\n None: t('public~None'), // Eval has ended\n Unknown: t('public~Unknown'), // Not officially returned from the API, but is used when no results are returned from the API\n };\n\n if (!level) {\n return levels.Unknown;\n }\n return levels[level] || level;\n};\n\nconst showServiceLevel = (clusterID: string) =>\n clusterID &&\n window.SERVER_FLAGS.branding !== 'okd' &&\n window.SERVER_FLAGS.branding !== 'azure' &&\n window.SERVER_FLAGS.branding !== 'dedicated';\n\nconst TrialDaysLeft: React.FC<{\n level: string;\n trialDaysLeft: number | null;\n label?: boolean;\n}> = ({ level, trialDaysLeft, label }) => {\n const { t } = useTranslation();\n\n if ((level !== 'Eval' && level !== 'None') || (level === 'Eval' && trialDaysLeft === null)) {\n return null;\n }\n\n let variant: 'warning' | 'danger' = 'warning';\n\n let alertText = t('public~{{count}} day remaining', { count: trialDaysLeft });\n if (trialDaysLeft === 0) {\n alertText = t('public~< 1 day remaining');\n }\n\n if (trialDaysLeft < 0 || level === 'None') {\n variant = 'danger';\n alertText = t('public~Trial expired');\n }\n\n if (label) {\n return (\n <div>\n <Label\n color={variant === 'warning' ? 'orange' : 'red'}\n icon={\n variant === 'warning' ? <YellowExclamationTriangleIcon /> : <RedExclamationCircleIcon />\n }\n >\n {alertText}\n </Label>\n </div>\n );\n }\n return (\n <Alert\n className=\"co-alert-inline--no-bold-title\"\n variant={variant}\n isInline\n isPlain\n title={alertText}\n />\n );\n};\n\nconst useLoadServiceLevel = (): [boolean, boolean, (clusterID: string) => void] => {\n const dispatch = useDispatch();\n const [loadingSecret, setLoadingSecret] = React.useState(false);\n const [loadingServiceLevel, setLoadingServiceLevel] = React.useState(false);\n\n let hasSecretAccess = false;\n\n const loadServiceLevel = (clusterID: string): void => {\n if (!showServiceLevel(clusterID)) {\n setLoadingSecret(false);\n setLoadingServiceLevel(false);\n dispatch(UIActions.setServiceLevel(null, null, clusterID, null, hasSecretAccess));\n return;\n }\n setLoadingSecret(true);\n k8sGet({ model: SecretModel, name: 'pull-secret', ns: 'openshift-config' })\n .then((response) => {\n // @ts-ignore Data is not recognized as part of response.\n const secret = JSON.parse(atob(response.data['.dockerconfigjson']));\n const token = secret.auths['cloud.openshift.com'].auth;\n const headers = {\n Authorization: `AccessToken ${clusterID}:${token}`,\n };\n const apiUrl = `/api/accounts_mgmt/v1/subscriptions?page=1&search=external_cluster_id%3D%27${clusterID}%27`;\n setLoadingSecret(false);\n if (!token) {\n throw new Error('Pull secret token is empty');\n }\n setLoadingServiceLevel(true);\n hasSecretAccess = true;\n\n consoleFetchJSON(apiUrl, 'GET', {\n headers,\n })\n .then((ocmResponse) => {\n if (!ocmResponse.items || ocmResponse.items?.length === 0) {\n throw new Error('Cluster ID used to get support level was not recognized');\n }\n\n const levelSetting = ocmResponse.items[0].support_level;\n const expirationDate = ocmResponse.items[0].eval_expiration_date;\n\n const trialEnd = expirationDate ? new Date(expirationDate) : null;\n const now = new Date();\n let daysLeft = trialEnd ? getDuration(trialEnd.getTime() - now.getTime()).days : null;\n\n daysLeft = trialEnd.getTime() < now.getTime() ? -1 : daysLeft;\n\n const trialDateEnd = trialEnd ? dateFormatter.format(trialEnd) : null;\n dispatch(\n UIActions.setServiceLevel(\n levelSetting,\n daysLeft,\n clusterID,\n trialDateEnd,\n hasSecretAccess,\n ),\n );\n })\n .catch((err) => {\n dispatch(UIActions.setServiceLevel(null, null, clusterID, null, hasSecretAccess));\n // eslint-disable-next-line no-console\n console.error('API call to get support level has failed', err);\n })\n .finally(() => {\n // done trying to get service level\n setLoadingServiceLevel(false);\n });\n })\n .catch(() => {\n // Error getting pull secret (this is expected if the user doesn't have access)\n setLoadingSecret(false);\n dispatch(UIActions.setServiceLevel(null, null, clusterID, null, hasSecretAccess));\n });\n };\n\n return [loadingSecret, loadingServiceLevel, loadServiceLevel];\n};\nconst useGetServiceLevel = (\n clusterIDParam: string,\n): {\n level: string;\n daysRemaining: number | null;\n trialDateEnd: string;\n hasSecretAccess: boolean;\n loadingSecret: boolean;\n loadingServiceLevel: boolean;\n} => {\n const {\n level,\n daysRemaining,\n clusterID,\n trialDateEnd,\n hasSecretAccess,\n } = useSelector(({ UI }: RootState) => UI.get('serviceLevel'));\n const [loadingSecret, loadingServiceLevel, loadServiceLevel] = useLoadServiceLevel();\n\n React.useEffect(() => {\n if (clusterID !== clusterIDParam && !loadingSecret && !loadingServiceLevel) {\n loadServiceLevel(clusterIDParam);\n }\n // only on clusterID change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clusterIDParam]);\n\n return {\n level,\n daysRemaining,\n trialDateEnd,\n hasSecretAccess,\n loadingSecret,\n loadingServiceLevel,\n };\n};\n\nexport const ServiceLevelLoading: React.FC = () => {\n const { t } = useTranslation();\n return <Skeleton screenreaderText={t('public~Loading')} />;\n};\n\nexport const ServiceLevel: React.FC<{\n clusterID: string;\n loading: React.ReactNode;\n children: React.ReactNode;\n}> = ({ clusterID, loading, children }) => {\n const { hasSecretAccess, loadingSecret, loadingServiceLevel } = useGetServiceLevel(clusterID);\n\n if (!showServiceLevel(clusterID)) {\n return null;\n }\n if (loadingSecret || !hasSecretAccess) {\n return null;\n }\n if (!loadingSecret && loadingServiceLevel) {\n return <>{loading}</>;\n }\n\n return <>{children}</>;\n};\ntype ServiceLevelTextProps = {\n clusterID?: string;\n inline?: boolean;\n};\nexport const ServiceLevelText: React.FC<ServiceLevelTextProps> = ({ clusterID, inline }) => {\n const { t } = useTranslation();\n const { level, daysRemaining } = useGetServiceLevel(clusterID);\n const levelText = (\n <>\n {useServiceLevelText(level)}\n {!inline && !level ? (\n <FieldLevelHelp>\n {t(\n 'public~API failed to return the Service Level Agreement setting for this cluster. Check again later.',\n )}\n </FieldLevelHelp>\n ) : null}\n </>\n );\n if (inline) {\n return (\n <>\n {levelText}\n <TrialDaysLeft level={level} trialDaysLeft={daysRemaining} label />\n </>\n );\n }\n return (\n <div data-test-id=\"sla-text\">\n <div className=\"co-select-to-copy\">\n {levelText}\n <div>\n <TrialDaysLeft level={level} trialDaysLeft={daysRemaining} />\n </div>\n </div>\n {!inline ? (\n <div>\n <ExternalLink\n text={t('public~Manage subscription settings')}\n href={getOCMLink(clusterID)}\n />\n </div>\n ) : null}\n </div>\n );\n};\nexport const useServiceLevelTitle = (): string => {\n const { t } = useTranslation();\n return t('public~Service Level Agreement (SLA)');\n};\n\nexport const useShowServiceLevelNotifications = (clusterID: string): boolean => {\n const { level } = useGetServiceLevel(clusterID);\n return level && (level === 'Eval' || level === 'None');\n};\n\nexport const ServiceLevelNotification: React.FC<{\n clusterID?: string;\n toggleNotificationDrawer: () => void;\n}> = ({ clusterID, toggleNotificationDrawer }) => {\n const { t } = useTranslation();\n const { level, daysRemaining, trialDateEnd } = useGetServiceLevel(clusterID);\n const showServiceLevelNotification = useShowServiceLevelNotifications(clusterID);\n\n if (!showServiceLevelNotification) {\n return null;\n }\n let notificationStart = '';\n if (level === 'None' || (level === 'Eval' && daysRemaining < 0)) {\n notificationStart = t('public~Your 60-day self-support trial expired.');\n }\n\n notificationStart =\n daysRemaining === 0\n ? t('public~Your 60-day self-support trial will end in < 1 day.')\n : t('public~Your 60-day self-support trial will end in {{count}} day on {{date}}.', {\n count: daysRemaining,\n date: trialDateEnd,\n });\n\n return (\n <NotificationEntry\n title={t('public~This cluster is not supported.')}\n actionExternalLinkURL={getOCMLink(clusterID)}\n actionText={t('public~Get support')}\n toggleNotificationDrawer={toggleNotificationDrawer}\n description={\n <>\n {`${notificationStart} ${t(\n 'public~For continued support, upgrade your cluster or transfer cluster ownership to an account with an active subscription.',\n )}`}\n </>\n }\n type={NotificationTypes.warning}\n />\n );\n};\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport {\n Action,\n ActionGroup,\n ActionService,\n ActionServiceProviderProps,\n isActionGroup,\n MenuOption,\n} from '@console/dynamic-plugin-sdk';\nimport { useExtensions } from '@console/plugin-sdk';\nimport { useDeepCompareMemoize } from '../../hooks';\nimport ActionsLoader from './loader/ActionsLoader';\nimport { ActionContext } from './types';\nimport { createMenuOptions } from './utils';\n\nconst ActionServiceProvider: React.FC<ActionServiceProviderProps> = ({ context, children }) => {\n const [contextMap, setContextMap] = React.useState<ActionContext>(context);\n const [actionsMap, setActionsMap] = React.useState<{ [uid: string]: Action[] }>({});\n const [loadError, setLoadError] = React.useState<any>();\n\n const memoizedContext = useDeepCompareMemoize(context);\n\n const onContextChange = React.useCallback((newContexId: string, newScope: any) => {\n setContextMap((prevContext) => ({ ...prevContext, [newContexId]: newScope }));\n }, []);\n\n const onActionsLoaded = React.useCallback((actions: Action[], uid: string) => {\n setActionsMap((prev) => ({ ...prev, [uid]: actions }));\n }, []);\n\n const actions: Action[] = React.useMemo(() => _.flatten(Object.values(actionsMap)), [actionsMap]);\n\n const groupExtensions = useExtensions<ActionGroup>(isActionGroup);\n\n const options: MenuOption[] = React.useMemo(() => createMenuOptions(actions, groupExtensions), [\n actions,\n groupExtensions,\n ]);\n\n const actionsLoaded = Object.keys(contextMap).every((contextId) => actionsMap[contextId]);\n\n const service: ActionService = React.useMemo(\n () => ({\n actions,\n options,\n loaded: actionsLoaded,\n error: loadError,\n }),\n [actions, actionsLoaded, loadError, options],\n );\n\n // Update the state whenever the context from props changes.\n React.useEffect(() => {\n setContextMap((prevContext) => ({ ...prevContext, ...memoizedContext }));\n }, [memoizedContext]);\n\n return (\n <>\n {Object.keys(contextMap).map((contextId) => (\n <ActionsLoader\n key={contextId}\n contextId={contextId}\n scope={contextMap[contextId]}\n onActionsLoaded={(value) => onActionsLoaded(value, contextId)}\n onContextChange={onContextChange}\n onLoadError={setLoadError}\n />\n ))}\n {children(service)}\n </>\n );\n};\n\nexport default ActionServiceProvider;\n","export * from './rhoas';\n","export { default as UserPreferencePage } from './UserPreferencePage';\nexport * from './perspective';\nexport * from './namespace';\nexport * from './language';\nexport * from './lightspeed';\n","import { ExtensionK8sKindVersionModel } from '../api/common-types';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\nimport { K8sResourceCommon } from './console-types';\n\nexport type PageComponentProps<R extends K8sResourceCommon = K8sResourceCommon> = {\n filters?: any;\n selected?: any;\n match?: any;\n obj?: R;\n params?: any;\n customData?: any;\n showTitle?: boolean;\n fieldSelector?: string;\n};\n\n/** This extension can be used to add a tab on the resource details page. */\nexport type HorizontalNavTab = ExtensionDeclaration<\n 'console.tab/horizontalNav',\n {\n /** The model for which this provider show tab. */\n model: ExtensionK8sKindVersionModel;\n /** The page to be show in horizontal tab. It takes tab name as name and href of the tab */\n page: {\n name: string;\n href: string;\n };\n /** The component to be rendered when the route matches. */\n component: CodeRef<React.ComponentType<PageComponentProps>>;\n }\n>;\n\n/** Adds a tab to a horizontal nav matching the `contextId`. */\nexport type NavTab = ExtensionDeclaration<\n 'console.tab',\n {\n /** Context ID assigned to the horizontal nav in which the tab will be injected.\n * Possible values:\n * - `dev-console-observe`\n */\n contextId: string;\n /** The display label of the tab */\n name: string;\n /** The href appended to the existing URL */\n href: string;\n /** Tab content component. */\n component: CodeRef<React.ComponentType<PageComponentProps>>;\n }\n>;\n\n// Type Guards\nexport const isHorizontalNavTab = (e: Extension): e is HorizontalNavTab =>\n e.type === 'console.tab/horizontalNav';\nexport const isTab = (e: Extension): e is NavTab => e.type === 'console.tab';\n","import * as React from 'react';\n\n/**\n * @deprecated - This hook is not related to console functionality.\n * Hook that ensures a safe asynchronnous setting of the React state in case a given component could be unmounted.\n * (https://github.com/facebook/react/issues/14113)\n * @param initialState initial state value\n * @returns An array with a pair of state value and it's set function.\n */\nexport const useSafetyFirst = <S extends any>(\n initialState: S | (() => S),\n): [S, React.Dispatch<React.SetStateAction<S>>] => {\n const mounted = React.useRef(true);\n React.useEffect(() => () => (mounted.current = false), []);\n\n const [value, setValue] = React.useState(initialState);\n const setValueSafe = React.useCallback((newValue: S) => {\n if (mounted.current) {\n setValue(newValue);\n }\n }, []);\n\n return [value, setValueSafe];\n};\n","import * as React from 'react';\nimport { Alert, Button, Modal, ModalVariant, Split, SplitItem } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { ErrorBoundaryFallbackProps } from '@console/dynamic-plugin-sdk';\nimport ErrorDetailsBlock from './ErrorDetailsBlock';\n\n/**\n * Support for error boundary content that won't consume the whole page.\n */\nconst ErrorBoundaryFallbackInline: React.FC<ErrorBoundaryFallbackProps> = (props) => {\n const { t } = useTranslation();\n const [isOpen, setOpen] = React.useState(false);\n return (\n <>\n <Split hasGutter>\n <SplitItem>\n <Alert variant=\"danger\" isInline isPlain title={t('console-shared~Extension error')} />\n </SplitItem>\n <SplitItem>\n <Button variant=\"link\" isInline onClick={() => setOpen(true)}>\n {t('console-shared~Show details')}\n </Button>\n </SplitItem>\n </Split>\n <Modal\n variant={ModalVariant.large}\n title={t('console-shared~Oh no! Something went wrong.')}\n isOpen={isOpen}\n onClose={() => setOpen(false)}\n actions={[\n <Button key=\"confirm\" variant=\"primary\" onClick={() => setOpen(false)}>\n {t('console-shared~Close')}\n </Button>,\n ]}\n >\n <ErrorDetailsBlock {...props} />\n </Modal>\n </>\n );\n};\n\nexport default ErrorBoundaryFallbackInline;\n","import * as React from 'react';\nimport ErrorBoundary from '../error-boundary';\n\ntype WithFallback = <P = {}>(\n Component: React.ComponentType<P>,\n FallbackComponent?: React.ComponentType<any>,\n) => React.ComponentType<P>;\n\nconst withFallback: WithFallback = (WrappedComponent, FallbackComponent) => {\n const Component = (props) => (\n <ErrorBoundary FallbackComponent={FallbackComponent}>\n <WrappedComponent {...props} />\n </ErrorBoundary>\n );\n Component.displayName = `withFallback(${WrappedComponent.displayName || WrappedComponent.name})`;\n return Component;\n};\n\nexport default withFallback;\n","import * as React from 'react';\nimport { Badge } from '@patternfly/react-core';\nimport './Badge.scss';\nimport { useTranslation } from 'react-i18next';\n\nexport const InlineTechPreviewBadge: React.FC = () => {\n const { t } = useTranslation();\n return (\n <Badge className=\"ocs-badge__inline\" isRead>\n {t('console-shared~Tech preview')}\n </Badge>\n );\n};\n\nexport const InlineDevPreviewBadge: React.FC = () => {\n const { t } = useTranslation();\n return (\n <Badge className=\"ocs-badge__inline\" isRead>\n {t('console-shared~Dev preview')}\n </Badge>\n );\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { SearchIcon } from '@patternfly/react-icons/dist/esm/icons/search-icon';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { useTranslation } from 'react-i18next';\n\nimport { Selector as SelectorKind } from '../../module/k8s';\nimport { selectorToString } from '@console/dynamic-plugin-sdk/src/utils/k8s';\n\nconst Requirement: React.FC<RequirementProps> = ({ kind, requirements, namespace = '' }) => {\n // Strip off any trailing '=' characters for valueless selectors\n const requirementAsString = selectorToString(requirements).replace(/=,/g, ',').replace(/=$/g, '');\n const requirementAsUrlEncodedString = encodeURIComponent(requirementAsString);\n\n const to = namespace\n ? `/search/ns/${namespace}?kind=${kind}&q=${requirementAsUrlEncodedString}`\n : `/search/all-namespaces?kind=${kind}&q=${requirementAsUrlEncodedString}`;\n\n return (\n <div className=\"co-m-requirement\">\n <Link className={`co-m-requirement__link co-text-${kind.toLowerCase()}`} to={to}>\n <SearchIcon className=\"co-m-requirement__icon co-icon-flex-child\" />\n <span className=\"co-m-requirement__label\">{requirementAsString.replace(/,/g, ', ')}</span>\n </Link>\n </div>\n );\n};\nRequirement.displayName = 'Requirement';\n\nexport const Selector: React.FC<SelectorProps> = ({\n kind = 'Pod',\n selector = {},\n namespace = undefined,\n}) => {\n const { t } = useTranslation();\n return (\n <div className=\"co-m-selector\">\n {_.isEmpty(selector) ? (\n <p className=\"text-muted\">{t('public~No selector')}</p>\n ) : (\n <Requirement kind={kind} requirements={selector} namespace={namespace} />\n )}\n </div>\n );\n};\nSelector.displayName = 'Selector';\n\ntype RequirementProps = {\n kind: string;\n requirements: SelectorKind;\n namespace?: string;\n};\n\ntype SelectorProps = {\n kind?: string;\n selector: SelectorKind;\n namespace?: string;\n};\n","import { useEffect, useRef } from 'react';\n\nexport const usePrevious = <P = any>(value: P, deps?: any[]): P => {\n const ref = useRef<P>();\n useEffect(() => {\n ref.current = value;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps || [value]);\n return ref.current;\n};\n","import { ChartThemeColor, getCustomTheme } from '@patternfly/react-charts';\nimport { global_palette_black_300 as globalBlack300 } from '@patternfly/react-tokens/dist/js/global_palette_black_300';\n\nconst pfDependentAxisTickLabels = {\n padding: 5,\n fontFamily: 'var(--pf-v5-chart-global--FontFamily)',\n letterSpacing: 'var(--pf-v5-chart-global--letter-spacing)',\n fill: 'var(--pf-v5-global--Color--200)',\n};\n\nconst theme = {\n chart: {\n padding: {\n bottom: 0,\n left: 0,\n right: 0,\n top: 0,\n },\n },\n dependentAxis: {\n style: {\n axis: {\n stroke: 'none',\n },\n grid: {\n stroke: '#EDEDED',\n },\n tickLabels: pfDependentAxisTickLabels,\n },\n },\n independentAxis: {\n style: {\n ticks: {\n size: 5,\n strokeWidth: 1,\n stroke: globalBlack300.value,\n },\n tickLabels: Object.assign({}, pfDependentAxisTickLabels, { padding: 2 }),\n grid: {\n stroke: 'none',\n },\n },\n },\n line: {\n style: {\n data: {\n opacity: 0.75,\n },\n },\n },\n};\n\nexport const queryBrowserTheme = getCustomTheme(ChartThemeColor.multiUnordered, theme);\n","import {\n K8sResourceKindReference,\n K8sResourceCommon,\n} from '@console/dynamic-plugin-sdk/src/extensions/console-types';\nimport { Selector } from '@console/dynamic-plugin-sdk/src/api/common-types';\nimport { K8sResourceKind } from '../../module/k8s/types';\n\nexport type FirehoseResult<\n R extends K8sResourceCommon | K8sResourceCommon[] = K8sResourceKind[]\n> = {\n loaded: boolean;\n loadError: string;\n optional?: boolean;\n data: R;\n kind?: string;\n};\n\nexport type FirehoseResultObject = { [key: string]: K8sResourceCommon | K8sResourceCommon[] };\n\nexport type FirehoseResourcesResult<\n R extends FirehoseResultObject = { [key: string]: K8sResourceCommon | K8sResourceCommon[] }\n> = {\n [k in keyof R]: FirehoseResult<R[k]>;\n};\n\n/*\n Add the enum for NameValueEditorPair here and not in its namesake file because the editor should always be\n loaded asynchronously in order not to bloat the vendor file. The enum reference into the editor\n will cause it not to load asynchronously.\n */\nexport const enum NameValueEditorPair {\n Name = 0,\n Value,\n Index,\n}\n\nexport const enum EnvFromPair {\n Prefix = 0,\n Resource,\n Index,\n}\n/**\n * The environment editor manages two types of env variables env and envFrom. This const distinguishes the two.\n */\nexport const enum EnvType {\n ENV = 0,\n ENV_FROM = 1,\n}\n\nexport type FirehoseResource = {\n kind: K8sResourceKindReference;\n name?: string;\n namespace?: string;\n isList?: boolean;\n selector?: Selector;\n prop: string;\n namespaced?: boolean;\n optional?: boolean;\n limit?: number;\n fieldSelector?: string;\n};\n\nexport type HumanizeResult = {\n string: string;\n value: number;\n unit: string;\n};\n\nexport type Humanize = {\n (v: React.ReactText, initialUnit?: string, preferredUnit?: string): HumanizeResult;\n};\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\n\nimport { modelFor, kindForReference } from '../../module/k8s';\n\nexport const inject = (children, props) => {\n const safeProps = _.omit(props, ['children']);\n return React.Children.map(children, (c) => {\n if (!_.isObject(c)) {\n return c;\n }\n return React.cloneElement(c, safeProps);\n });\n};\n\nconst lastKind = new Set();\n\n/**\n * @deprecated Use `modelFor` or `connectToModel`.\n * Provides a synchronous way to acquire a statically-defined Kubernetes model.\n * NOTE: This will not work for CRDs defined at runtime, use `connectToModels` instead.\n */\nexport const kindObj = (kind) => {\n if (kindForReference(kind) === kind && !lastKind.has(kind)) {\n // eslint-disable-next-line no-console\n console.warn(\n `Attempting to get Kubernetes object model using string kind: ${kind}, which is not guaranteed to be unique!`,\n );\n lastKind.add(kind);\n }\n const model = modelFor(kind);\n if (!model) {\n // eslint-disable-next-line no-console\n console.warn('kindObj: no model for kind', kind);\n }\n return model || {};\n};\n","import { K8sResourceCommon, OwnerReference, groupVersionFor } from './';\nimport {\n ClusterServiceVersionKind,\n ClusterServiceVersionModel,\n} from '@console/operator-lifecycle-manager';\n\n// Check if owner is an Operand under csv\nconst isOwnedByOperator = (csv: ClusterServiceVersionKind, owner: OwnerReference) => {\n const { group } = groupVersionFor(owner.apiVersion);\n return csv.spec?.customresourcedefinitions?.owned?.some((owned) => {\n const ownedGroup = owned.name.substring(owned.name.indexOf('.') + 1);\n return owned.kind === owner.kind && ownedGroup === group;\n });\n};\n\n// Check if csv === owner (there is no need to check namespace because ownerReferences must\n// be in the same namespace as the owned resource, or be cluster-scoped).\nconst isOwnedByCSV = (csv: ClusterServiceVersionKind, owner: OwnerReference) => {\n const { group } = groupVersionFor(owner.apiVersion);\n return (\n group === ClusterServiceVersionModel.apiGroup &&\n owner.kind === ClusterServiceVersionModel.kind &&\n csv.metadata.name === owner.name\n );\n};\n\n// Find an Operator CSV that either is the owner or owns the owner\nexport const matchOwnerAndCSV = (owner: OwnerReference, csvs: ClusterServiceVersionKind[] = []) => {\n return csvs.find((csv) => isOwnedByOperator(csv, owner) || isOwnedByCSV(csv, owner));\n};\n\n// Find onwerReference that is either a CSV or is an Operand managed by a CSV.\nexport const findOwner = (obj: K8sResourceCommon, csvs: ClusterServiceVersionKind[]) => {\n return obj?.metadata?.ownerReferences?.find((o) =>\n csvs?.some((csv) => isOwnedByOperator(csv, o) || isOwnedByCSV(csv, o)),\n );\n};\n","export * from './useForceRender';\nexport * from './useResizeObserver';\n","import * as React from 'react';\nimport { useUserSettings } from '@console/shared';\n\nexport const THEME_USER_SETTING_KEY = 'console.theme';\nexport const THEME_LOCAL_STORAGE_KEY = 'bridge/theme';\nconst THEME_SYSTEM_DEFAULT = 'systemDefault';\nconst THEME_DARK_CLASS = 'pf-v5-theme-dark';\nconst THEME_DARK_CLASS_LEGACY = 'pf-theme-dark'; // legacy class name needed to support PF4\nconst THEME_DARK = 'dark';\n\nexport const updateThemeClass = (htmlTagElement: HTMLElement, theme: string) => {\n let systemTheme: string;\n if (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n systemTheme = THEME_DARK;\n }\n if (theme === THEME_DARK || (theme === THEME_SYSTEM_DEFAULT && systemTheme === THEME_DARK)) {\n htmlTagElement.classList.add(THEME_DARK_CLASS);\n htmlTagElement.classList.add(THEME_DARK_CLASS_LEGACY);\n } else {\n htmlTagElement.classList.remove(THEME_DARK_CLASS);\n htmlTagElement.classList.remove(THEME_DARK_CLASS_LEGACY);\n }\n};\n\nexport const ThemeContext = React.createContext<string>('');\n\nexport const ThemeProvider: React.FC<{}> = ({ children }) => {\n const htmlTagElement = document.documentElement;\n const localTheme = localStorage.getItem(THEME_LOCAL_STORAGE_KEY);\n const [theme, , themeLoaded] = useUserSettings(\n THEME_USER_SETTING_KEY,\n THEME_SYSTEM_DEFAULT,\n true,\n );\n const mqListener = React.useCallback(\n (e) => {\n if (e.matches) {\n htmlTagElement?.classList.add(THEME_DARK_CLASS);\n htmlTagElement?.classList.add(THEME_DARK_CLASS_LEGACY);\n } else {\n htmlTagElement?.classList.remove(THEME_DARK_CLASS);\n htmlTagElement?.classList.remove(THEME_DARK_CLASS_LEGACY);\n }\n },\n [htmlTagElement],\n );\n React.useEffect(() => {\n const darkThemeMq = window.matchMedia('(prefers-color-scheme: dark)');\n if (theme === THEME_SYSTEM_DEFAULT) {\n darkThemeMq.addEventListener('change', mqListener);\n }\n if (themeLoaded) {\n updateThemeClass(htmlTagElement, theme);\n }\n return () => darkThemeMq.removeEventListener('change', mqListener);\n }, [htmlTagElement, mqListener, theme, themeLoaded]);\n\n React.useEffect(() => {\n themeLoaded && localStorage.setItem(THEME_LOCAL_STORAGE_KEY, theme);\n }, [theme, themeLoaded]);\n\n const value = themeLoaded ? theme : localTheme;\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n};\n","import * as React from 'react';\nimport { ExtensionHook } from '@console/dynamic-plugin-sdk/src/api/common-types';\nimport { CatalogExtensionHookOptions } from '@console/dynamic-plugin-sdk/src/extensions';\n\ntype CatalogExtensionHookResolverProps<T> = {\n id: string;\n useValue: ExtensionHook<T>;\n options: CatalogExtensionHookOptions;\n onValueResolved: (value: T, id: string) => void;\n onValueError?: (error: any, id: string) => void;\n};\n\nconst CatalogExtensionHookResolver = function <T>({\n id,\n useValue,\n options,\n onValueResolved,\n onValueError,\n}: CatalogExtensionHookResolverProps<T>) {\n const [value, loaded, loadError] = useValue(options);\n\n React.useEffect(() => {\n if (loaded) onValueResolved(value, id);\n // unnecessary to run effect again if the onValueResolved callback changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id, loaded, value]);\n\n React.useEffect(() => {\n if (loadError && onValueError) onValueError(loadError, id);\n // unnecessary to run effect again if the onValueError callback changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id, loadError]);\n\n return null;\n};\n\nexport default CatalogExtensionHookResolver;\n","import { PodModel } from '@console/internal/models';\n\n// The query used to compute the number of kube-apiserver instances that are up\n// is a bit different than the ones used for the other control plane components\n// because of how Kubernetes deal with the kube-apiserver Service endpoints.\n// When a node is down, the kube-apiserver address on that node is removed from\n// its Endpoint object which results in metrics for that kube-apiserver\n// instance to not be scraped anymore. Meaning that the `up` timeserie for that\n// kube-apiserver instance will not exist anymore and if we were to use the\n// same query as the other components we will always see the kube-apiserver\n// being 100% available when a node is down. The solution to that problem is\n// to rely on the number of kube-apiserver pods instead of the number of\n// Prometheus targets it has.\nexport const API_SERVERS_UP =\n '(sum(up{job=\"apiserver\"} == 1) / count(kube_pod_labels{label_app=\"openshift-kube-apiserver\",label_apiserver=\"true\",namespace=\"openshift-kube-apiserver\"})) * 100';\nexport const CONTROLLER_MANAGERS_UP =\n '(sum(up{job=\"kube-controller-manager\"} == 1) / count(up{job=\"kube-controller-manager\"})) * 100';\nexport const SCHEDULERS_UP = '(sum(up{job=\"scheduler\"} == 1) / count(up{job=\"scheduler\"})) * 100';\nexport const API_SERVER_REQUESTS_SUCCESS =\n '(1 - (sum(rate(apiserver_request_total{code=~\"5..\"}[5m])) or vector(0))/ sum(rate(apiserver_request_total[5m]))) * 100';\n\nexport const enum Condition {\n DISK_PRESSURE = 'DiskPressure',\n PID_PRESSURE = 'PIDPressure',\n MEM_PRESSURE = 'MemoryPressure',\n}\n\nexport const PressureQueries = {\n [Condition.DISK_PRESSURE]: (node: string) => [\n {\n model: PodModel,\n fieldSelector: `spec.nodeName=${node}`,\n metric: 'pod',\n query: `(sort_desc(topk(25,sum by(pod, namespace) (container_fs_reads_total{node=\"${node}\"}))))`,\n },\n ],\n\n [Condition.MEM_PRESSURE]: (node: string) => [\n {\n model: PodModel,\n fieldSelector: `spec.nodeName=${node}`,\n metric: 'pod',\n query: `(sort_desc(topk(25,sum by(pod, namespace) (container_memory_working_set_bytes{node=\"${node}\", container=\"\"}))))`,\n },\n ],\n\n [Condition.PID_PRESSURE]: (node: string) => [\n {\n model: PodModel,\n fieldSelector: `spec.nodeName=${node}`,\n metric: 'pod',\n query: `(sort_desc(topk(25,sum by(pod, namespace) (container_processes{node=\"${node}\"}))))`,\n },\n ],\n};\n","import { Dispatch, SetStateAction } from 'react';\nimport { useUserSettings } from '@console/shared';\n\nexport const PREFERRED_PERSPECTIVE_USER_SETTING_KEY = 'console.preferredPerspective';\n\nexport const usePreferredPerspective = (): [string, Dispatch<SetStateAction<string>>, boolean] => {\n const [\n preferredPerspective,\n setPreferredPerspective,\n preferredPerspectiveLoaded,\n ] = useUserSettings<string>(PREFERRED_PERSPECTIVE_USER_SETTING_KEY);\n return [preferredPerspective, setPreferredPerspective, preferredPerspectiveLoaded];\n};\n","export { default as LanguageDropdown } from './LanguageDropdown';\nexport * from './usePreferredLanguage';\nexport * from './useLanguage';\n","import * as _ from 'lodash';\n\nconst isPlainNonReactObject = (obj: any) => _.isPlainObject(obj) && !obj.$$typeof;\n\nexport type ValueCallback<T> = (value: T, key: string, container: {}, path: string) => void;\nexport type PredicateCheck<T> = (value: unknown, path: string) => value is T;\n\n/**\n * Recursive equivalent of `_.forOwn` function that traverses plain objects and arrays.\n */\nexport const deepForOwn = <T = any>(\n obj: {},\n predicate: PredicateCheck<T>,\n valueCallback: ValueCallback<T>,\n pathParts: string[] = [],\n) => {\n const visitValue = (value: any, key: string, container: {}, newPathParts: string[]) => {\n const path = newPathParts.join('.');\n if (predicate(value, path)) {\n valueCallback(value, key, container, path);\n } else if (isPlainNonReactObject(value)) {\n deepForOwn(value, predicate, valueCallback, newPathParts);\n }\n };\n\n Object.keys(obj).forEach((key) => {\n const value = obj[key];\n const newPathParts = [...pathParts, key];\n if (Array.isArray(value)) {\n value.forEach((arrayElement, index) => {\n const indexKey = index.toString();\n visitValue(arrayElement, indexKey, value, [...newPathParts, indexKey]);\n });\n } else {\n visitValue(value, key, obj, newPathParts);\n }\n });\n};\n","import { pluralize } from '@patternfly/react-core';\nimport { TFunction } from 'i18next';\nimport * as _ from 'lodash';\nimport { coFetch } from '@console/internal/co-fetch';\nimport { PrometheusResponse } from '@console/internal/components/graphs';\nimport { humanizePercentage } from '@console/internal/components/utils/units';\nimport {\n ClusterVersionKind,\n ClusterUpdateStatus,\n getClusterUpdateStatus,\n getClusterOperatorStatus,\n OperatorStatus,\n ClusterOperator,\n} from '@console/internal/module/k8s';\nimport {\n PrometheusHealthHandler,\n URLHealthHandler,\n SubsystemHealth,\n GetOperatorsWithStatuses,\n GetOperatorStatusPriority,\n} from '@console/plugin-sdk';\nimport { getOperatorsStatus } from '@console/shared/src/components/dashboard/status-card/state-utils';\nimport {\n HealthState,\n healthStateMapping,\n healthStateMessage,\n} from '@console/shared/src/components/dashboard/status-card/states';\nimport { isSingleNode } from '@console/shared/src/selectors/infrastructure';\n\nexport const fetchK8sHealth = async (url: string) => {\n const response = await coFetch(url);\n return response.text();\n};\n\nexport const getK8sHealthState: URLHealthHandler<string> = (k8sHealth, error, resource) => {\n if (error) {\n return { state: HealthState.NOT_AVAILABLE };\n }\n if (!k8sHealth) {\n return { state: HealthState.LOADING };\n }\n if (\n getClusterUpdateStatus(_.get(resource, 'data') as ClusterVersionKind) ===\n ClusterUpdateStatus.Updating\n ) {\n return { state: HealthState.UPDATING, message: 'Updating' };\n }\n return { state: k8sHealth === 'ok' ? HealthState.OK : HealthState.ERROR };\n};\n\nexport const getControlPlaneComponentHealth = (\n response: PrometheusResponse,\n error,\n t: TFunction,\n): SubsystemHealth => {\n if (error) {\n return {\n state: HealthState.NOT_AVAILABLE,\n message: healthStateMessage(HealthState.NOT_AVAILABLE, t),\n };\n }\n if (!response) {\n return { state: HealthState.LOADING };\n }\n const value = response.data?.result?.[0]?.value?.[1];\n if (_.isNil(value)) {\n return { state: HealthState.UNKNOWN, message: healthStateMessage(HealthState.UNKNOWN, t) };\n }\n const perc = humanizePercentage(value);\n if (perc.value > 90) {\n return { state: HealthState.OK, message: perc.string };\n }\n if (perc.value > 70) {\n return { state: HealthState.WARNING, message: perc.string };\n }\n return { state: HealthState.ERROR, message: perc.string };\n};\n\nexport const getWorstStatus = (\n componentsHealth: SubsystemHealth[],\n t: TFunction,\n): { state: HealthState; message: string; count: number } => {\n const withPriority = componentsHealth.map((h) => healthStateMapping[h.state]);\n const mostImportantState = Math.max(...withPriority.map(({ priority }) => priority));\n const worstStatuses = withPriority.filter(({ priority }) => priority === mostImportantState);\n return {\n state: worstStatuses[0].health,\n message: healthStateMessage(worstStatuses[0].health, t),\n count: worstStatuses.length,\n };\n};\n\nexport const getControlPlaneHealth: PrometheusHealthHandler = (\n responses,\n t,\n resource,\n infrastructure,\n) => {\n const componentsHealth = responses.map(({ response, error }) =>\n getControlPlaneComponentHealth(response, error, t),\n );\n if (componentsHealth.some((c) => c.state === HealthState.LOADING)) {\n return { state: HealthState.LOADING };\n }\n const worstStatus = getWorstStatus(componentsHealth, t);\n\n const singleMasterMsg =\n worstStatus.state === HealthState.OK && isSingleNode(infrastructure)\n ? t('console-app~Single control plane node')\n : undefined;\n\n return {\n state: worstStatus.state,\n message:\n singleMasterMsg ||\n (worstStatus.message\n ? worstStatus.count === 4\n ? worstStatus.message\n : `${pluralize(worstStatus.count, 'component')} ${worstStatus.message.toLowerCase()}`\n : null),\n };\n};\n\nexport const getClusterOperatorStatusPriority: GetOperatorStatusPriority<ClusterOperator> = (\n co,\n) => {\n const status = getClusterOperatorStatus(co);\n if (status === OperatorStatus.Degraded) {\n return { ...healthStateMapping[HealthState.WARNING], title: status };\n }\n if (status === OperatorStatus.Unknown) {\n return { ...healthStateMapping[HealthState.UNKNOWN], title: status };\n }\n if (status === OperatorStatus.Progressing) {\n return { ...healthStateMapping[HealthState.UPDATING], title: status };\n }\n return { ...healthStateMapping[HealthState.OK], title: status };\n};\n\nexport const getClusterOperatorHealthStatus: GetOperatorsWithStatuses<ClusterOperator> = (\n resources,\n) => {\n return (resources.clusterOperators.data as ClusterOperator[]).map((co) =>\n getOperatorsStatus<ClusterOperator>([co], getClusterOperatorStatusPriority),\n );\n};\n","import * as React from 'react';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useDispatch } from 'react-redux';\nimport { useLocation, useNavigate } from 'react-router-dom-v5-compat';\nimport {\n setActiveNamespace as setActiveNamespaceForStore,\n formatNamespaceRoute,\n} from '@console/internal/actions/ui';\nimport { getNamespace } from '@console/internal/components/utils/link';\nimport { flagPending } from '@console/internal/reducers/features';\nimport { FLAGS } from '@console/shared';\nimport { useFlag } from '@console/shared/src/hooks/flag';\nimport { usePreferredNamespace } from '../user-preferences/namespace';\nimport { getValueForNamespace } from './getValueForNamespace';\nimport { useLastNamespace } from './useLastNamespace';\n\ntype NamespaceContextType = {\n namespace?: string;\n setNamespace?: (ns: string) => void;\n};\n\nexport const NamespaceContext = React.createContext<NamespaceContextType>({});\n\nconst useUrlNamespace = () => getNamespace(useLocation().pathname);\n\ntype UseValuesForNamespaceContext = () => {\n namespace: string;\n setNamespace: (ns: string) => void;\n loaded: boolean;\n};\n\nexport const useValuesForNamespaceContext: UseValuesForNamespaceContext = () => {\n const urlNamespace = useUrlNamespace();\n const navigate = useNavigate();\n const [activeNamespace, setActiveNamespace] = React.useState<string>(urlNamespace);\n const [preferredNamespace, , preferredNamespaceLoaded] = usePreferredNamespace();\n const [lastNamespace, setLastNamespace, lastNamespaceLoaded] = useLastNamespace();\n const useProjects: boolean = useFlag(FLAGS.OPENSHIFT);\n const dispatch = useDispatch();\n\n const updateNamespace = (ns) => {\n if (ns !== activeNamespace) {\n setActiveNamespace(ns);\n const oldPath = window.location.pathname;\n const newPath = formatNamespaceRoute(ns, oldPath, window.location);\n if (newPath !== oldPath) {\n navigate(newPath);\n }\n }\n dispatch(setActiveNamespaceForStore(ns));\n };\n\n // Set namespace when all pending namespace infos are loaded.\n // Automatically check if preferred and last namespace still exist.\n const resourcesLoaded: boolean =\n !flagPending(useProjects) && preferredNamespaceLoaded && lastNamespaceLoaded;\n React.useEffect(() => {\n if (!urlNamespace && resourcesLoaded) {\n getValueForNamespace(preferredNamespace, lastNamespace, useProjects)\n .then((ns: string) => {\n updateNamespace(ns);\n })\n .catch((e) => {\n // eslint-disable-next-line no-console\n console.warn('Error fetching namespace', e);\n });\n }\n // Only run this hook after all resources have loaded.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resourcesLoaded, navigate]);\n\n // Updates active namespace (in context and redux state) when the url changes.\n // This updates the redux state also after the initial rendering.\n React.useEffect(() => {\n if (urlNamespace) {\n updateNamespace(urlNamespace);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [urlNamespace, activeNamespace, dispatch, navigate]);\n\n // Change active namespace (in context and redux state) as well as last used namespace\n // when a component calls setNamespace, for example via useActiveNamespace()\n const setNamespace = React.useCallback(\n (ns: string) => {\n ns !== lastNamespace && setLastNamespace(ns);\n updateNamespace(ns);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dispatch, activeNamespace, setActiveNamespace, lastNamespace, setLastNamespace, navigate],\n );\n\n return {\n namespace: activeNamespace,\n setNamespace,\n loaded: !!activeNamespace,\n };\n};\n","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/serverlessfx.svg\";","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Label as PfLabel, LabelGroup as PfLabelGroup } from '@patternfly/react-core';\n\nconst Label = ({ k, v }) => (\n <PfLabel className=\"co-label\" key={k}>\n <span className=\"co-label__key\">{k}</span>\n <span className=\"co-label__eq\">=</span>\n <span className=\"co-label__value\">{v}</span>\n </PfLabel>\n);\n\nexport const Labels = ({ kind, labels }) => {\n const { t } = useTranslation();\n\n return _.isEmpty(labels) ? (\n <div className=\"text-muted\">{t('public~No labels')}</div>\n ) : (\n <div className={`co-text-${kind}`}>\n <PfLabelGroup className=\"co-label-group\" numLabels={20}>\n {_.map(labels, (v, k) => (\n <Label key={k} k={k} v={v} />\n ))}\n </PfLabelGroup>\n </div>\n );\n};\n","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/redhat.svg\";","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { LoadingBox } from '@console/internal/components/utils/status-box';\n\ntype TerminalLoadingBoxProps = {\n message?: string;\n};\n\nconst TerminalLoadingBox: React.FC<TerminalLoadingBoxProps> = ({ message }) => {\n const { t } = useTranslation();\n return (\n <LoadingBox\n message={\n message ?? t('webterminal-plugin~Connecting to your OpenShift command line terminal ...')\n }\n />\n );\n};\n\nexport default TerminalLoadingBox;\n","export const DRAGGABLE_TYPE = {\n ENV_ROW: 'env_row',\n ENV_FROM_ROW: 'env_from_row',\n};\n","export const getEditDecorator = () =>\n import('./defaultDecorators' /* webpackChunkName: \"topology\" */).then((m) => m.getEditDecorator);\n\nexport const getUrlDecorator = () =>\n import('./defaultDecorators' /* webpackChunkName: \"topology\" */).then((m) => m.getUrlDecorator);\n\nexport const getBuildDecorator = () =>\n import('./defaultDecorators' /* webpackChunkName: \"topology\" */).then((m) => m.getBuildDecorator);\n\nexport const getAlertsDecorator = () =>\n import('./defaultDecorators' /* webpackChunkName: \"topology\" */).then(\n (m) => m.getAlertsDecorator,\n );\n","import i18next from 'i18next';\nimport * as _ from 'lodash';\nimport { serviceBindingModal } from '@console/app/src/components/modals/service-binding';\nimport { DeploymentConfigModel, DeploymentModel } from '@console/internal/models';\nimport {\n k8sGet,\n k8sList,\n k8sPatch,\n K8sResourceKind,\n modelFor,\n referenceFor,\n referenceForModel,\n} from '@console/internal/module/k8s';\n\nexport type ConnectsToData = { apiVersion: string; kind: string; name: string };\n\nconst fetchResource = async (source: string, namespace: string) => {\n const [groupVersionKind, resourceName] = source.split('/');\n const contextualResource: K8sResourceKind = await k8sGet(\n modelFor(groupVersionKind),\n resourceName,\n namespace,\n );\n return contextualResource;\n};\n\nexport const edgesFromAnnotations = (annotations): (string | ConnectsToData)[] => {\n let edges: (string | ConnectsToData)[] = [];\n if (_.has(annotations, ['app.openshift.io/connects-to'])) {\n try {\n edges = JSON.parse(annotations['app.openshift.io/connects-to']);\n } catch (e) {\n // connects-to annotation should hold a JSON string value but failed to parse\n // treat value as a comma separated list of strings\n edges = annotations['app.openshift.io/connects-to'].split(',').map((v) => v.trim());\n }\n }\n\n return edges;\n};\n\nexport const listInstanceResources = (\n namespace: string,\n instanceName: string,\n labelSelector: any = {},\n): Promise<any> => {\n const lists: Promise<any>[] = [];\n const instanceLabelSelector = {\n 'app.kubernetes.io/instance': instanceName,\n ...labelSelector,\n };\n\n const kinds = ['ReplicationController', 'Route', 'Service', 'ReplicaSet', 'BuildConfig', 'Build'];\n _.forEach(kinds, (kind) => {\n lists.push(\n k8sList(modelFor(kind), {\n ns: namespace,\n labelSelector: instanceLabelSelector,\n }).then((values) => {\n return _.map(values, (value) => {\n value.kind = kind;\n return value;\n });\n }),\n );\n });\n\n return Promise.all(lists);\n};\n\n// Updates the item to add an new connect's to value replacing an old value if provided\nexport const updateItemAppConnectTo = (\n item: K8sResourceKind,\n connections: (string | ConnectsToData)[],\n connectValue: ConnectsToData,\n oldValueIndex: number,\n) => {\n const model = modelFor(referenceFor(item) || item.kind);\n\n if (!model) {\n return Promise.reject(\n new Error(i18next.t('topology~Unable to retrieve model for: {{kind}}', { kind: item.kind })),\n );\n }\n\n const tags = _.toPairs(item.metadata.annotations);\n let op = _.size(tags) ? 'replace' : 'add';\n\n const existingTag = _.find(tags, (tag) => tag[0] === 'app.openshift.io/connects-to');\n if (existingTag) {\n if (connections.includes(connectValue)) {\n return Promise.resolve();\n }\n\n if (!connectValue) {\n _.pullAt(connections, [oldValueIndex]);\n } else if (oldValueIndex >= 0) {\n connections[oldValueIndex] = connectValue;\n } else {\n connections.push(connectValue);\n }\n existingTag[1] = _.size(connections) && JSON.stringify(connections);\n\n if (!existingTag[1]) {\n _.remove(tags, (tag) => tag === existingTag);\n if (!_.size(tags)) {\n op = 'remove';\n }\n }\n } else {\n if (!connectValue) {\n // Removed connection not found, no need to remove\n return Promise.resolve();\n }\n\n const connectionTag: [string, string] = [\n 'app.openshift.io/connects-to',\n JSON.stringify([connectValue]),\n ];\n tags.push(connectionTag);\n }\n\n const patch = [{ path: '/metadata/annotations', op, value: _.fromPairs(tags) }];\n\n return k8sPatch(model, item, patch);\n};\n\n// Get the index of the replaced target of the visual connector\nconst getReplacedTargetIndex = (\n replacedTarget: K8sResourceKind,\n connections: (string | ConnectsToData)[],\n): number => {\n if (replacedTarget) {\n const replaceTargetName = replacedTarget.metadata?.name;\n const replaceTargetKind = replacedTarget.kind;\n const replaceTargetApiVersion = replacedTarget.apiVersion;\n const replaceValue = {\n apiVersion: replaceTargetApiVersion,\n kind: replaceTargetKind,\n name: replaceTargetName,\n };\n const replaceTargetInstanceName =\n replacedTarget.metadata?.labels?.['app.kubernetes.io/instance'];\n let index = _.findIndex(connections, replaceValue);\n if (index === -1) {\n index = _.findIndex(\n connections,\n (connection) => connection === (replaceTargetInstanceName || replaceTargetName),\n );\n }\n return index;\n }\n return -1;\n};\n\n// Create a connection from the source to the target replacing the connection to replacedTarget if provided\nexport const createResourceConnection = (\n source: K8sResourceKind,\n target: K8sResourceKind,\n replacedTarget: K8sResourceKind = null,\n): Promise<K8sResourceKind[] | K8sResourceKind> => {\n if (!source || !target || source === target) {\n return Promise.reject();\n }\n\n const connectTargetName = target.metadata?.name;\n const connectTargetKind = target.kind;\n const connectTargetApiVersion = target.apiVersion;\n const connectValue = {\n apiVersion: connectTargetApiVersion,\n kind: connectTargetKind,\n name: connectTargetName,\n };\n\n const connections = edgesFromAnnotations(source.metadata?.annotations);\n\n const replacedTargetIndex = getReplacedTargetIndex(replacedTarget, connections);\n\n const instanceName = _.get(source, ['metadata', 'labels', 'app.kubernetes.io/instance']);\n\n const patches: Promise<K8sResourceKind>[] = [\n updateItemAppConnectTo(source, connections, connectValue, replacedTargetIndex),\n ];\n\n // If there is no instance label, only update this item\n if (!instanceName) {\n return Promise.all(patches);\n }\n\n // Update all the instance's resources that were part of the previous application\n return listInstanceResources(source.metadata.namespace, instanceName).then((listsValue) => {\n _.forEach(listsValue, (list) => {\n _.forEach(list, (item) => {\n patches.push(updateItemAppConnectTo(item, connections, connectValue, replacedTargetIndex));\n });\n });\n\n return Promise.all(patches);\n });\n};\n\n// Remove the connection from the source to the target\nexport const removeResourceConnection = (\n source: K8sResourceKind,\n target: K8sResourceKind,\n): Promise<any> => {\n if (!source || !target || source === target) {\n return Promise.reject();\n }\n const connections = edgesFromAnnotations(source.metadata?.annotations);\n\n const replacedTargetIndex = getReplacedTargetIndex(target, connections);\n\n const instanceName = _.get(source, ['metadata', 'labels', 'app.kubernetes.io/instance']);\n\n const patches: Promise<any>[] = [\n updateItemAppConnectTo(source, connections, null, replacedTargetIndex),\n ];\n\n // If there is no instance label, only update this item\n if (!instanceName) {\n return Promise.all(patches);\n }\n\n // Update all the instance's resources that were part of the previous application\n return listInstanceResources(source.metadata.namespace, instanceName).then((listsValue) => {\n _.forEach(listsValue, (list) => {\n _.forEach(list, (item) => {\n patches.push(updateItemAppConnectTo(item, connections, null, replacedTargetIndex));\n });\n });\n\n return Promise.all(patches);\n });\n};\n\nconst getSourceAndTargetForBinding = async (\n resources: K8sResourceKind[] | K8sResourceKind,\n contextualSource: string,\n serviceBindingAvailable?: boolean,\n): Promise<{ source: K8sResourceKind; target: K8sResourceKind }> => {\n if (!contextualSource) {\n return Promise.reject(\n new Error(i18next.t('topology~Cannot do a contextual binding without a source')),\n );\n }\n const linkingModelRefs = [\n referenceForModel(DeploymentConfigModel),\n referenceForModel(DeploymentModel),\n ];\n let target;\n if (serviceBindingAvailable || !Array.isArray(resources)) {\n target = resources;\n } else {\n target = (resources as K8sResourceKind[]).find((resource) =>\n linkingModelRefs.includes(referenceFor(resource)),\n );\n }\n const {\n metadata: { namespace },\n } = target;\n const source: K8sResourceKind = await fetchResource(contextualSource, namespace);\n if (!source) {\n return Promise.reject(\n new Error(\n i18next.t(\n 'topology~Cannot find resource ({{contextualSource}}) to do a contextual binding to',\n {\n contextualSource,\n },\n ),\n ),\n );\n }\n\n return { source, target };\n};\n\nexport const doConnectsToBinding = async (\n resources: K8sResourceKind[],\n contextualSource: string,\n): Promise<K8sResourceKind[]> => {\n const { source, target } = await getSourceAndTargetForBinding(resources, contextualSource);\n if (!target) {\n // Not a resource we want to connect to\n return resources;\n }\n await createResourceConnection(source, target);\n\n return resources;\n};\n\nexport const doContextualBinding = async (\n target: K8sResourceKind,\n contextualSource: string,\n): Promise<K8sResourceKind> => {\n const { source } = await getSourceAndTargetForBinding(target, contextualSource, true);\n serviceBindingModal({\n model: modelFor(referenceFor(source)),\n source,\n target,\n });\n return target;\n};\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as _ from 'lodash-es';\nimport * as classNames from 'classnames';\n\nimport { TemplateKind, PartialObjectMetadata } from '../../module/k8s';\nimport * as threeScaleImg from '../../imgs/logos/3scale.svg';\nimport * as aerogearImg from '../../imgs/logos/aerogear.svg';\nimport * as amqImg from '../../imgs/logos/amq.svg';\nimport * as angularjsImg from '../../imgs/logos/angularjs.svg';\nimport * as ansibleImg from '../../imgs/logos/ansible.svg';\nimport * as apacheImg from '../../imgs/logos/apache.svg';\nimport * as beakerImg from '../../imgs/logos/beaker.svg';\nimport * as buildIconImg from '../../imgs/logos/build-icon.svg';\nimport * as camelImg from '../../imgs/logos/camel.svg';\nimport * as capedwarfImg from '../../imgs/logos/capedwarf.svg';\nimport * as catalogImg from '../../imgs/logos/catalog-icon.svg';\nimport * as cassandraImg from '../../imgs/logos/cassandra.svg';\nimport * as clojureImg from '../../imgs/logos/clojure.svg';\nimport * as codeigniterImg from '../../imgs/logos/codeigniter.svg';\nimport * as cordovaImg from '../../imgs/logos/cordova.png';\nimport * as datagridImg from '../../imgs/logos/datagrid.svg';\nimport * as datavirtImg from '../../imgs/logos/datavirt.svg';\nimport * as debianImg from '../../imgs/logos/debian.svg';\nimport * as decisionserverImg from '../../imgs/logos/decisionserver.svg';\nimport * as djangoImg from '../../imgs/logos/django.svg';\nimport * as dotnetImg from '../../imgs/logos/dotnet.svg';\nimport * as drupalImg from '../../imgs/logos/drupal.svg';\nimport * as eapImg from '../../imgs/logos/eap.svg';\nimport * as elasticImg from '../../imgs/logos/elastic.svg';\nimport * as erlangImg from '../../imgs/logos/erlang.svg';\nimport * as fedoraImg from '../../imgs/logos/fedora.svg';\nimport * as freebsdImg from '../../imgs/logos/freebsd.svg';\nimport * as gitImg from '../../imgs/logos/git.svg';\nimport * as githubImg from '../../imgs/logos/github.svg';\nimport * as gitlabImg from '../../imgs/logos/gitlab.svg';\nimport * as giteaImg from '../../imgs/logos/gitea.svg';\nimport * as glassfishImg from '../../imgs/logos/glassfish.svg';\nimport * as goLangImg from '../../imgs/logos/golang.svg';\nimport * as grailsImg from '../../imgs/logos/grails.svg';\nimport * as hadoopImg from '../../imgs/logos/hadoop.svg';\nimport * as haproxyImg from '../../imgs/logos/haproxy.svg';\nimport * as helmImg from '../../imgs/logos/helm.svg';\nimport * as infinispanImg from '../../imgs/logos/infinispan.svg';\nimport * as jbossImg from '../../imgs/logos/jboss.svg';\nimport * as jenkinsImg from '../../imgs/logos/jenkins.svg';\nimport * as jettyImg from '../../imgs/logos/jetty.svg';\nimport * as joomlaImg from '../../imgs/logos/joomla.svg';\nimport * as jrubyImg from '../../imgs/logos/jruby.svg';\nimport * as jsImg from '../../imgs/logos/js.svg';\nimport * as knativeImg from '../../imgs/logos/knative.svg';\nimport * as serverlessFuncImage from '../../imgs/logos/serverlessfx.svg';\nimport * as kubevirtImg from '../../imgs/logos/kubevirt.svg';\nimport * as laravelImg from '../../imgs/logos/laravel.svg';\nimport * as loadBalancerImg from '../../imgs/logos/load-balancer.svg';\nimport * as mariadbImg from '../../imgs/logos/mariadb.svg';\nimport * as mediawikiImg from '../../imgs/logos/mediawiki.svg';\nimport * as memcachedImg from '../../imgs/logos/memcached.svg';\nimport * as mongodbImg from '../../imgs/logos/mongodb.svg';\nimport * as mssqlImg from '../../imgs/logos/mssql.svg';\nimport * as mysqlDatabaseImg from '../../imgs/logos/mysql-database.svg';\nimport * as nginxImg from '../../imgs/logos/nginx.svg';\nimport * as nodejsImg from '../../imgs/logos/nodejs.svg';\nimport * as openjdkImg from '../../imgs/logos/openjdk.svg';\nimport * as redhatImg from '../../imgs/logos/redhat.svg';\nimport * as openlibertyImg from '../../imgs/logos/openliberty.svg';\nimport * as openshiftImg from '../../imgs/logos/openshift.svg';\nimport * as openstackImg from '../../imgs/logos/openstack.svg';\nimport * as otherLinuxImg from '../../imgs/logos/other-linux.svg';\nimport * as otherUnknownImg from '../../imgs/logos/other-unknown.svg';\nimport * as perlImg from '../../imgs/logos/perl.svg';\nimport * as phalconImg from '../../imgs/logos/phalcon.svg';\nimport * as phpImg from '../../imgs/logos/php.svg';\nimport * as playImg from '../../imgs/logos/play.svg';\nimport * as postgresqlImg from '../../imgs/logos/postgresql.svg';\nimport * as processserverImg from '../../imgs/logos/processserver.svg';\nimport * as pythonImg from '../../imgs/logos/python.svg';\nimport * as quarkusImg from '../../imgs/logos/quarkus.svg';\nimport * as rabbitmqImg from '../../imgs/logos/rabbitmq.svg';\nimport * as railsImg from '../../imgs/logos/rails.svg';\nimport * as reactImg from '../../imgs/logos/react.svg';\nimport * as redisImg from '../../imgs/logos/redis.svg';\nimport * as rhIntegrationImg from '../../imgs/logos/rh-integration.svg';\nimport * as rhSpringBoot from '../../imgs/logos/rh-spring-boot.svg';\nimport * as rhTomcatImg from '../../imgs/logos/rh-tomcat.svg';\nimport * as rubyImg from '../../imgs/logos/ruby.svg';\nimport * as rustImg from '../../imgs/logos/rust.svg';\nimport * as scalaImg from '../../imgs/logos/scala.svg';\nimport * as shadowmanImg from '../../imgs/logos/shadowman.svg';\nimport * as springImg from '../../imgs/logos/spring.svg';\nimport * as springBootImg from '../../imgs/logos/spring-boot.svg';\nimport * as ssoImg from '../../imgs/logos/sso.svg';\nimport * as stackoverflowImg from '../../imgs/logos/stackoverflow.svg';\nimport * as suseImg from '../../imgs/logos/suse.svg';\nimport * as symfonyImg from '../../imgs/logos/symfony.svg';\nimport * as tomcatImg from '../../imgs/logos/tomcat.svg';\nimport * as ubuntuImg from '../../imgs/logos/ubuntu.svg';\nimport * as vertxImg from '../../imgs/logos/vertx.svg';\nimport * as wildflyImg from '../../imgs/logos/wildfly.svg';\nimport * as windowsImg from '../../imgs/logos/windows.svg';\nimport * as wordpressImg from '../../imgs/logos/wordpress.svg';\nimport * as xamarinImg from '../../imgs/logos/xamarin.svg';\nimport * as zendImg from '../../imgs/logos/zend.svg';\nimport * as operatorImg from '../../imgs/logos/operator.svg';\n\nconst logos = new Map<string, any>()\n .set('icon-3scale', threeScaleImg)\n .set('icon-aerogear', aerogearImg)\n .set('icon-amq', amqImg)\n .set('icon-angularjs', angularjsImg)\n .set('icon-ansible', ansibleImg)\n .set('icon-apache', apacheImg)\n .set('icon-beaker', beakerImg)\n .set('icon-build', buildIconImg)\n .set('icon-camel', camelImg)\n .set('icon-capedwarf', capedwarfImg)\n .set('icon-cassandra', cassandraImg)\n .set('icon-catalog', catalogImg)\n .set('icon-clojure', clojureImg)\n .set('icon-codeigniter', codeigniterImg)\n .set('icon-cordova', cordovaImg)\n .set('icon-datagrid', datagridImg)\n .set('icon-datavirt', datavirtImg)\n .set('icon-debian', debianImg)\n .set('icon-decisionserver', decisionserverImg)\n .set('icon-django', djangoImg)\n .set('icon-dotnet', dotnetImg)\n .set('icon-drupal', drupalImg)\n .set('icon-eap', eapImg)\n .set('icon-elastic', elasticImg)\n .set('icon-erlang', erlangImg)\n .set('icon-fedora', fedoraImg)\n .set('icon-freebsd', freebsdImg)\n .set('icon-git', gitImg)\n .set('icon-github', githubImg)\n .set('icon-gitlab', gitlabImg)\n .set('icon-gitea', giteaImg)\n .set('icon-glassfish', glassfishImg)\n .set('icon-go-gopher', goLangImg)\n .set('icon-golang', goLangImg)\n .set('icon-grails', grailsImg)\n .set('icon-hadoop', hadoopImg)\n .set('icon-haproxy', haproxyImg)\n .set('icon-helm', helmImg)\n .set('icon-httpd', apacheImg)\n .set('icon-infinispan', infinispanImg)\n .set('icon-java', openjdkImg)\n .set('icon-jboss', jbossImg)\n .set('icon-jenkins', jenkinsImg)\n .set('icon-jetty', jettyImg)\n .set('icon-joomla', joomlaImg)\n .set('icon-jruby', jrubyImg)\n .set('icon-js', jsImg)\n .set('icon-knative', knativeImg)\n .set('icon-kubevirt', kubevirtImg)\n .set('icon-laravel', laravelImg)\n .set('icon-load-balancer', loadBalancerImg)\n .set('icon-mariadb', mariadbImg)\n .set('icon-mediawiki', mediawikiImg)\n .set('icon-memcached', memcachedImg)\n .set('icon-mongodb', mongodbImg)\n .set('icon-mssql', mssqlImg)\n .set('icon-mysql-database', mysqlDatabaseImg)\n .set('icon-nginx', nginxImg)\n .set('icon-nodejs', nodejsImg)\n .set('icon-openjdk', openjdkImg)\n .set('icon-openliberty', openlibertyImg)\n .set('icon-openshift', openshiftImg)\n .set('icon-openstack', openstackImg)\n .set('icon-operator', operatorImg)\n .set('icon-other-linux', otherLinuxImg)\n .set('icon-other-unknown', otherUnknownImg)\n .set('icon-perl', perlImg)\n .set('icon-phalcon', phalconImg)\n .set('icon-php', phpImg)\n .set('icon-play', playImg)\n .set('icon-postgresql', postgresqlImg)\n .set('icon-processserver', processserverImg)\n .set('icon-python', pythonImg)\n .set('icon-quarkus', quarkusImg)\n .set('icon-rabbitmq', rabbitmqImg)\n .set('icon-rails', railsImg)\n .set('icon-react', reactImg)\n .set('icon-redhat', redhatImg) // Use the upstream icon.\n .set('icon-redis', redisImg)\n .set('icon-rh-integration', rhIntegrationImg)\n .set('icon-rh-openjdk', openjdkImg)\n .set('icon-rh-spring-boot', rhSpringBoot)\n .set('icon-rh-tomcat', rhTomcatImg)\n .set('icon-ruby', rubyImg)\n .set('icon-rust', rustImg)\n .set('icon-scala', scalaImg)\n .set('icon-serverless-function', serverlessFuncImage)\n .set('icon-shadowman', shadowmanImg)\n .set('icon-spring', springImg)\n .set('icon-spring-boot', springBootImg)\n .set('icon-sso', ssoImg)\n .set('icon-stackoverflow', stackoverflowImg)\n .set('icon-suse', suseImg)\n .set('icon-symfony', symfonyImg)\n .set('icon-tomcat', tomcatImg)\n .set('icon-ubuntu', ubuntuImg)\n .set('icon-vertx', vertxImg)\n .set('icon-wildfly', wildflyImg)\n .set('icon-windows', windowsImg)\n .set('icon-wordpress', wordpressImg)\n .set('icon-xamarin', xamarinImg)\n .set('icon-zend', zendImg);\n\nexport const getIcons = (): { label: string; url: string }[] => {\n return Array.from(logos.entries()).map(([iconClass, url]) => ({\n label: iconClass.replace(/^icon-/, ''),\n url,\n }));\n};\n\nexport const getIcon = (iconName: string) => {\n const url = logos.get(`icon-${iconName}`);\n return url ? { label: iconName, url } : null;\n};\n\nexport const hasIcon = (iconName: string) => {\n return logos.has(`icon-${iconName}`);\n};\n\nexport const normalizeIconClass = (iconClass: string): string => {\n return _.startsWith(iconClass, 'icon-') ? `font-icon ${iconClass}` : iconClass;\n};\n\nexport const getImageForIconClass = (iconClass: string): string => {\n return logos.get(iconClass);\n};\n\nexport const getImageStreamIcon = (tag: string): string => {\n return _.get(tag, 'annotations.iconClass');\n};\n\nexport const getTemplateIcon = (template: TemplateKind | PartialObjectMetadata): string => {\n return _.get(template, 'metadata.annotations.iconClass');\n};\n\nexport const ImageStreamIcon: React.FC<ImageStreamIconProps> = ({ tag, iconSize }) => {\n const { t } = useTranslation();\n const iconClass = getImageStreamIcon(tag);\n const iconClassImg = getImageForIconClass(iconClass);\n return (\n <div className=\"co-catalog-item-icon\">\n <span className=\"co-catalog-item-icon__bg\" aria-hidden>\n {iconClassImg ? (\n <img\n className={classNames(\n 'co-catalog-item-icon__img',\n iconSize && `co-catalog-item-icon__img--${iconSize}`,\n )}\n src={iconClassImg}\n alt={t('public~Icon')}\n />\n ) : (\n <span\n className={classNames(\n 'co-catalog-item-icon__icon',\n iconSize && `co-catalog-item-icon__icon--${iconSize}`,\n normalizeIconClass(iconClass),\n )}\n />\n )}\n </span>\n </div>\n );\n};\n\nexport type ImageStreamIconProps = {\n tag: any;\n iconSize?: string;\n};\n","import '@console/internal/i18n.js';\n\nexport * from './const';\nexport * from './models';\nexport * from './types';\nexport * from './actions';\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport { Trans, useTranslation } from 'react-i18next';\nimport {\n GroupVersionKind,\n referenceForGroupVersionKind,\n resourceURL,\n referenceFor,\n referenceForModel,\n K8sKind,\n K8sResourceKind,\n apiVersionCompare,\n} from '@console/internal/module/k8s';\nimport { PackageManifestModel } from '../models';\nimport {\n APIServiceDefinition,\n ClusterServiceVersionIcon,\n ClusterServiceVersionKind,\n CRDDescription,\n InstallPlanApproval,\n InstallPlanKind,\n PackageManifestKind,\n ProvidedAPI,\n StepResource,\n SubscriptionKind,\n} from '../types';\nimport { getInternalObjects } from '../utils';\n\nexport const visibilityLabel = 'olm-visibility';\n\nconst filteredAPIs = (providedAPIs: ProvidedAPI[], internalObjects: string[]): ProvidedAPI[] => {\n const filteredAndSorted = providedAPIs\n .filter((api) => !internalObjects.includes(api.name))\n .sort((a, b) => apiVersionCompare(a.version, b.version));\n return _.uniqBy(filteredAndSorted, 'name');\n};\n\n// Returns provided apis for a given csv, excluding internal objects and duplicate\nexport const providedAPIsForCSV = (csv: ClusterServiceVersionKind): ProvidedAPI[] => {\n const allProvidedAPIs: ProvidedAPI[] = [\n ...(csv?.spec?.apiservicedefinitions?.owned ?? []),\n ...(csv?.spec?.customresourcedefinitions?.owned ?? []),\n ];\n const internalObjects = getInternalObjects(csv?.metadata?.annotations);\n return filteredAPIs(allProvidedAPIs, internalObjects);\n};\n\nexport const providedAPIsForChannel = (pkg: PackageManifestKind) => (channel: string) => {\n const { currentCSVDesc } = pkg.status.channels.find((ch) => ch.name === channel);\n const allProvidedAPIs: ProvidedAPI[] = [\n ...(currentCSVDesc?.customresourcedefinitions?.owned ?? []),\n ...(currentCSVDesc?.apiservicedefinitions?.owned ?? []),\n ];\n const internalObjects = getInternalObjects(currentCSVDesc?.annotations);\n return filteredAPIs(allProvidedAPIs, internalObjects);\n};\n\nexport const referenceForProvidedAPI = (\n desc: CRDDescription | APIServiceDefinition,\n): GroupVersionKind =>\n _.get(desc, 'group')\n ? referenceForGroupVersionKind((desc as APIServiceDefinition).group)(desc.version)(desc.kind)\n : referenceForGroupVersionKind((desc as CRDDescription).name.slice(desc.name.indexOf('.') + 1))(\n desc.version,\n )(desc.kind);\nexport const referenceForStepResource = (resource: StepResource): GroupVersionKind =>\n referenceForGroupVersionKind(resource.group || 'core')(resource.version)(resource.kind);\n\nexport const defaultChannelFor = (packageManifest: PackageManifestKind) => {\n const channel = !_.isEmpty(packageManifest.status.defaultChannel)\n ? packageManifest.status.channels.find(\n (ch) => ch.name === packageManifest.status.defaultChannel,\n )\n : packageManifest.status.channels[0];\n return channel;\n};\nexport const defaultChannelNameFor = (pkg: PackageManifestKind): string =>\n pkg?.status?.defaultChannel || pkg?.status?.channels?.[0]?.name || '-';\nexport const installModesFor = (pkg: PackageManifestKind) => (channel: string) =>\n pkg?.status?.channels?.find((ch) => ch.name === channel)?.currentCSVDesc?.installModes || [];\nexport const supportedInstallModesFor = (pkg: PackageManifestKind) => (channel: string) =>\n installModesFor(pkg)(channel).filter(({ supported }) => supported);\n\nexport const iconFor = (pkg: PackageManifestKind) => {\n const defaultChannel = pkg?.status?.defaultChannel\n ? pkg.status.channels?.find((ch) => ch.name === pkg.status.defaultChannel)\n : pkg?.status?.channels?.[0];\n if (!defaultChannel) {\n return null;\n }\n\n return resourceURL(PackageManifestModel, {\n ns: pkg?.status?.catalogSourceNamespace,\n name: pkg.metadata.name,\n path: 'icon',\n queryParams: {\n resourceVersion: [pkg.metadata.name, defaultChannel.name, defaultChannel.currentCSV].join(\n '.',\n ),\n },\n });\n};\n\nexport const providedAPIForReference = (csv, reference) => {\n const providedAPIs = providedAPIsForCSV(csv) ?? [];\n return providedAPIs.find((api) => referenceForProvidedAPI(api) === reference);\n};\n\nexport const providedAPIForModel = (csv: ClusterServiceVersionKind, model: K8sKind): ProvidedAPI =>\n providedAPIForReference(csv, referenceForModel(model));\n\nexport const parseALMExamples = (\n csv: ClusterServiceVersionKind,\n useInitializationResource: boolean,\n) => {\n try {\n if (useInitializationResource) {\n const resource = JSON.parse(\n csv?.metadata?.annotations?.['operatorframework.io/initialization-resource'],\n );\n return [resource];\n }\n return JSON.parse(csv?.metadata?.annotations?.['alm-examples'] ?? '[]');\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('Unable to parse ALM expamples\\n', e);\n return [];\n }\n};\n\nexport const exampleForModel = (csv: ClusterServiceVersionKind, model: K8sKind) =>\n _.defaultsDeep(\n {},\n {\n kind: model.kind,\n apiVersion: `${model.apiGroup}/${model.apiVersion}`,\n },\n _.find(\n parseALMExamples(\n csv,\n new URLSearchParams(window.location.search).has('useInitializationResource'),\n ),\n (s: K8sResourceKind) => referenceFor(s) === referenceForModel(model),\n ),\n );\n\nexport const getManualSubscriptionsInNamespace = (\n subscriptions: SubscriptionKind[],\n namespace: string,\n) => {\n return subscriptions?.filter(\n (subscription) =>\n subscription.metadata.namespace === namespace &&\n subscription.spec.installPlanApproval === InstallPlanApproval.Manual,\n );\n};\n\nexport const OperatorsWithManualApproval: React.FC<OperatorsWithManualApprovalProps> = ({\n subscriptions,\n}) => {\n const { t } = useTranslation();\n const subs = subscriptions\n ?.map((subscription) => (\n <strong key={subscription.metadata.uid}>{subscription.metadata.name}</strong>\n ))\n .map((sub, i) => (i > 0 ? [', ', sub] : sub));\n return (\n <>\n {t('olm~operator', { count: subscriptions?.length })} {subs}\n </>\n );\n};\n\nexport const NamespaceIncludesManualApproval: React.FC<NamespaceIncludesManualApprovalProps> = ({\n subscriptions,\n namespace,\n}) => (\n <Trans ns=\"olm\">\n Installation namespace <strong>{{ namespace }}</strong> contains{' '}\n <OperatorsWithManualApproval subscriptions={subscriptions} /> installed with manual approval,\n and all operators installed in the same namespace will function as manual approval strategy. To\n allow automatic approval, all operators installed in the namespace must use automatic approval\n strategy.\n </Trans>\n);\n\nconst InstallPlanCSVNames: React.FC<InstallPlanReviewProps> = ({ installPlan }) =>\n installPlan?.spec.clusterServiceVersionNames\n .sort()\n // eslint-disable-next-line react/no-array-index-key\n .map((CSVName, i) => <strong key={`${CSVName}-${i}`}>{CSVName}</strong>)\n // eslint-disable-next-line react/no-array-index-key\n .map((CSVName, i) => (i > 0 ? <span key={`${CSVName}-${i}`}>, {CSVName}</span> : CSVName));\n\nexport const InstallPlanReview: React.FC<InstallPlanReviewProps> = ({ installPlan }) => (\n <p>\n <Trans ns=\"olm\">\n Review the manual install plan for operators <InstallPlanCSVNames installPlan={installPlan} />\n . Once approved, the following resources will be created in order to satisfy the requirements\n for the components specified in the plan. Click the resource name to view the resource in\n detail.\n </Trans>\n </p>\n);\n\nexport type ClusterServiceVersionLogoProps = {\n displayName: string;\n icon: ClusterServiceVersionIcon | string;\n provider: { name: string } | string;\n version?: string;\n};\n\nexport type OperatorsWithManualApprovalProps = {\n subscriptions: SubscriptionKind[];\n};\n\nexport type NamespaceIncludesManualApprovalProps = {\n namespace: string;\n subscriptions: SubscriptionKind[];\n};\n\nexport type InstallPlanReviewProps = {\n installPlan: ClusterServiceVersionKind | InstallPlanKind;\n};\n\nOperatorsWithManualApproval.displayName = 'OperatorsWithManualApproval';\nNamespaceIncludesManualApproval.displayName = 'NamespaceIncludesManualApproval';\nInstallPlanReview.displayName = 'InstallPlanReview';\n","import * as _ from 'lodash-es';\nimport i18n from 'i18next';\nimport { chart_color_orange_300 as requestedColor } from '@patternfly/react-tokens/dist/js/chart_color_orange_300';\n\nimport { PrometheusResponse, DataPoint, PrometheusResult } from '.';\nimport { Humanize } from '../utils';\n\nexport const defaultXMutator: XMutator = (x) => new Date(x * 1000);\nexport const defaultYMutator: YMutator = (y) => parseFloat(y);\n\nexport const getRangeVectorStats: GetRangeStats = (\n response,\n description,\n symbol,\n xMutator,\n yMutator,\n) => {\n const results = response?.data?.result;\n return results?.map((r, index) => {\n return r?.values?.map(([x, y]) => {\n return {\n x: xMutator?.(x) ?? defaultXMutator(x),\n y: yMutator?.(y) ?? defaultYMutator(y),\n description: _.isFunction(description) ? description(r, index) : description,\n symbol,\n } as DataPoint<Date>;\n });\n });\n};\n\nexport const getInstantVectorStats: GetInstantStats = (response, metric, humanize) => {\n const results = _.get(response, 'data.result', []);\n return results.map((r) => {\n const y = parseFloat(_.get(r, 'value[1]'));\n return {\n label: humanize ? humanize(y).string : null,\n x: _.get(r, ['metric', metric], ''),\n y,\n metric: r.metric,\n };\n });\n};\n\nexport const mapLimitsRequests = (\n utilization: PrometheusResponse,\n limit: PrometheusResponse,\n requested: PrometheusResponse,\n xMutator?: XMutator,\n): { data: DataPoint[][]; chartStyle: object[] } => {\n const utilizationData = getRangeVectorStats(utilization, 'usage', null, xMutator);\n const data = utilizationData ? [...utilizationData] : [];\n const chartStyle = [null];\n if (limit) {\n const limitData = getRangeVectorStats(\n limit,\n i18n.t('public~total limit'),\n { type: 'dash' },\n xMutator,\n );\n data.push(...limitData);\n if (limitData.length) {\n chartStyle.push({\n data: { strokeDasharray: '3,3', fillOpacity: 0 },\n });\n }\n }\n if (requested) {\n const reqData = getRangeVectorStats(\n requested,\n i18n.t('public~total requested'),\n {\n type: 'dash',\n fill: requestedColor.value,\n },\n xMutator,\n );\n data.push(...reqData);\n if (reqData.length) {\n chartStyle.push({\n data: { stroke: requestedColor.value, strokeDasharray: '3,3', fillOpacity: 0 },\n });\n }\n }\n\n return { data, chartStyle };\n};\n\ntype XMutator = (x: any) => Date;\ntype YMutator = (y: any) => number;\n\nexport type GetRangeStats = (\n response: PrometheusResponse,\n description?: string | ((result: PrometheusResult, index: number) => string),\n symbol?: { fill?: string; type?: string },\n xMutator?: XMutator,\n yMutator?: YMutator,\n) => DataPoint<Date>[][];\n\nexport type GetInstantStats = (\n response: PrometheusResponse,\n metric?: string,\n humanize?: Humanize,\n) => DataPoint<number>[];\n","import { TFunction } from 'i18next';\nimport * as _ from 'lodash';\nimport { K8sResourceCommon } from '@console/internal/module/k8s';\nimport {\n OperatorStatusWithResources,\n OperatorHealth,\n GetOperatorStatusPriority,\n} from '@console/plugin-sdk';\nimport { HealthState, healthStateMapping, healthStateMessage } from './states';\n\nexport const getMostImportantStatuses = (\n operatorStatuses: OperatorStatusWithResources[],\n): OperatorStatusWithResources[] => {\n const mostImportantStatus = Math.max(...operatorStatuses.map(({ status }) => status.priority));\n return operatorStatuses.filter(({ status }) => status.priority === mostImportantStatus);\n};\n\nexport const getOperatorsStatus = <R extends K8sResourceCommon>(\n operators: R[],\n getOperatorStatus: GetOperatorStatusPriority<R>,\n): OperatorStatusWithResources<R> => {\n if (!operators.length) {\n return {\n status: {\n ...healthStateMapping[HealthState.OK],\n title: 'Available',\n },\n operators: [],\n };\n }\n const operatorsByStatus: { [key: string]: OperatorStatusWithResources<R> } = operators.reduce(\n (acc, o) => {\n const status = getOperatorStatus(o);\n if (!acc[status.health]) {\n acc[status.health] = {\n status: {\n ...status,\n },\n operators: [o],\n };\n } else {\n acc[status.health].operators.push(o);\n }\n return acc;\n },\n {},\n );\n\n const mostImportantStatus = Object.keys(operatorsByStatus).sort(\n (a, b) => operatorsByStatus[b].status.priority - operatorsByStatus[a].status.priority,\n )[0];\n\n return operatorsByStatus[mostImportantStatus];\n};\n\nexport const getOperatorsHealthState = (\n healthStatuses: OperatorHealth[],\n t: TFunction,\n): { health: HealthState; detailMessage: string } => {\n if (!healthStatuses.length) {\n return { health: HealthState.OK, detailMessage: undefined };\n }\n if (healthStatuses.some((s) => s.health === HealthState.NOT_AVAILABLE)) {\n return { health: HealthState.NOT_AVAILABLE, detailMessage: undefined };\n }\n if (healthStatuses.some((s) => HealthState.LOADING === s.health)) {\n return { health: HealthState.LOADING, detailMessage: undefined };\n }\n const sortedStatuses = healthStatuses.sort(\n (a, b) => healthStateMapping[b.health].priority - healthStateMapping[a.health].priority,\n );\n const groupedStatuses = _.groupBy(sortedStatuses, (s) => s.health);\n const statusKeys = Object.keys(groupedStatuses) as (keyof typeof HealthState)[];\n let finalCount = 0;\n groupedStatuses[statusKeys[0]].forEach((g) => {\n if (!_.isNil(g.count)) {\n finalCount += g.count;\n }\n });\n // warning and error statuses are counted together as degraded\n if (\n statusKeys.length > 1 &&\n statusKeys[0] === HealthState.ERROR &&\n statusKeys[1] === HealthState.WARNING\n ) {\n groupedStatuses[statusKeys[1]].forEach((g) => {\n if (!_.isNil(g.count)) {\n finalCount += g.count;\n }\n });\n }\n\n return {\n health: HealthState[statusKeys[0]],\n detailMessage: healthStateMessage(statusKeys[0], t)\n ? `${finalCount} ${healthStateMessage(statusKeys[0], t).toLowerCase()}`\n : undefined,\n };\n};\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport * as React from 'react';\n// FIXME upgrading redux types is causing many errors at this time\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { sortable } from '@patternfly/react-table';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { TFunction } from 'i18next';\nimport * as classNames from 'classnames';\nimport * as _ from 'lodash-es';\nimport {\n Button,\n Divider,\n Popover,\n Grid,\n GridItem,\n Card,\n CardBody,\n CardHeader,\n CardTitle,\n Text,\n TextContent,\n TextVariants,\n} from '@patternfly/react-core';\nimport {\n Status,\n TableColumnsType,\n LazyActionMenu,\n ActionServiceProvider,\n ActionMenu,\n ActionMenuVariant,\n useUserSettingsCompatibility,\n usePrometheusGate,\n} from '@console/shared';\nimport { ByteDataTypes } from '@console/shared/src/graph-helper/data-utils';\nimport {\n COLUMN_MANAGEMENT_CONFIGMAP_KEY,\n COLUMN_MANAGEMENT_LOCAL_STORAGE_KEY,\n} from '@console/shared/src/constants/common';\nimport { ListPageBody, RowFilter, RowProps, TableColumn } from '@console/dynamic-plugin-sdk';\nimport * as UIActions from '../actions/ui';\nimport { coFetchJSON } from '../co-fetch';\nimport {\n ContainerSpec,\n K8sResourceKindReference,\n PodKind,\n referenceForModel,\n referenceFor,\n Selector,\n ContainerState,\n} from '../module/k8s';\nimport {\n getRestartPolicyLabel,\n podPhase,\n podPhaseFilterReducer,\n podReadiness,\n podRestarts,\n isWindowsPod,\n isContainerCrashLoopBackOff,\n} from '../module/k8s/pods';\nimport {\n getContainerRestartCount,\n getContainerState,\n getContainerStatus,\n} from '../module/k8s/container';\nimport { ResourceEventStream } from './events';\nimport { DetailsPage } from './factory';\nimport ListPageHeader from './factory/ListPage/ListPageHeader';\nimport ListPageFilter from './factory/ListPage/ListPageFilter';\nimport ListPageCreate from './factory/ListPage/ListPageCreate';\nimport {\n AsyncComponent,\n DetailsItem,\n Kebab,\n NodeLink,\n OwnerReferences,\n ResourceIcon,\n ResourceLink,\n ResourceSummary,\n ScrollToTopOnMount,\n SectionHeading,\n Timestamp,\n formatBytesAsMiB,\n formatCores,\n humanizeBinaryBytes,\n humanizeDecimalBytesPerSec,\n humanizeCpuCores,\n navFactory,\n units,\n LabelList,\n RuntimeClass,\n} from './utils';\nimport { PodLogs } from './pod-logs';\nimport {\n Area,\n Stack,\n PROMETHEUS_BASE_PATH,\n PROMETHEUS_TENANCY_BASE_PATH,\n PrometheusResult,\n} from './graphs';\nimport { VolumesTable } from './volumes-table';\nimport { PodModel } from '../models';\nimport { Conditions } from './conditions';\nimport Dashboard from '@console/shared/src/components/dashboard/Dashboard';\n\n// Key translations for oauth login templates\n// t('public~Log in to your account')\n// t('public~Log in')\n// t('public~Welcome to {{platformTitle}}')\n// t('public~Log in with {{providerName}}')\n// t('public~Login is required. Please try again.')\n// t('public~Could not check CSRF token. Please try again.')\n// t('public~Invalid login or password. Please try again.')\nimport { resourcePath } from './utils/resource-link';\nimport { useK8sWatchResource } from './utils/k8s-watch-hook';\nimport { useListPageFilter } from './factory/ListPage/filter-hook';\nimport VirtualizedTable, { TableData } from './factory/Table/VirtualizedTable';\nimport { sortResourceByValue } from './factory/Table/sort';\nimport { useActiveColumns } from './factory/Table/active-columns-hook';\nimport { PodDisruptionBudgetField } from '@console/app/src/components/pdb/PodDisruptionBudgetField';\nimport { PodTraffic } from './pod-traffic';\n// Only request metrics if the device's screen width is larger than the\n// breakpoint where metrics are visible.\nconst showMetrics =\n PROMETHEUS_BASE_PATH && PROMETHEUS_TENANCY_BASE_PATH && window.screen.width >= 1200;\n\nconst fetchPodMetrics = (namespace: string): Promise<UIActions.PodMetrics> => {\n const metrics = [\n {\n key: 'memory',\n query: namespace\n ? `sum(container_memory_working_set_bytes{namespace='${namespace}',container=''}) BY (pod, namespace)`\n : \"sum(container_memory_working_set_bytes{container=''}) BY (pod, namespace)\",\n },\n {\n key: 'cpu',\n query: namespace\n ? `pod:container_cpu_usage:sum{namespace='${namespace}'}`\n : 'pod:container_cpu_usage:sum',\n },\n ];\n const promises = metrics.map(\n ({ key, query }): Promise<UIActions.PodMetrics> => {\n const url = namespace\n ? `${PROMETHEUS_TENANCY_BASE_PATH}/api/v1/query?namespace=${namespace}&query=${query}`\n : `${PROMETHEUS_BASE_PATH}/api/v1/query?query=${query}`;\n return coFetchJSON(url).then(({ data: { result } }) => {\n return result.reduce((acc, data) => {\n const value = Number(data.value[1]);\n return _.set(acc, [key, data.metric.namespace, data.metric.pod], value);\n }, {});\n });\n },\n );\n return Promise.all(promises).then((data: any[]) => _.assign({}, ...data));\n};\n\nexport const menuActions = [\n ...Kebab.getExtensionsActionsForKind(PodModel),\n ...Kebab.factory.common,\n];\n\n// t('public~Name')\n// t('public~Namespace')\n// t('public~Status')\n// t('public~Ready')\n// t('public~Restarts')\n// t('public~Owner')\n// t('public~Node')\n// t('public~Memory')\n// t('public~CPU')\n// t('public~Created')\n// t('public~Labels')\n// t('public~IP address')\n\nconst podColumnInfo = Object.freeze({\n name: {\n classes: '',\n id: 'name',\n title: 'public~Name',\n },\n namespace: {\n classes: '',\n id: 'namespace',\n title: 'public~Namespace',\n },\n status: {\n classes: '',\n id: 'status',\n title: 'public~Status',\n },\n ready: {\n classes: classNames('pf-m-nowrap', 'pf-v5-u-w-10-on-lg', 'pf-v5-u-w-8-on-xl'),\n id: 'ready',\n title: 'public~Ready',\n },\n restarts: {\n classes: classNames('pf-m-nowrap', 'pf-v5-u-w-8-on-2xl'),\n id: 'restarts',\n title: 'public~Restarts',\n },\n owner: {\n classes: '',\n id: 'owner',\n title: 'public~Owner',\n },\n node: {\n classes: '',\n id: 'node',\n title: 'public~Node',\n },\n memory: {\n classes: classNames({ 'pf-v5-u-w-10-on-2xl': showMetrics }),\n id: 'memory',\n title: 'public~Memory',\n },\n cpu: {\n classes: classNames({ 'pf-v5-u-w-10-on-2xl': showMetrics }),\n id: 'cpu',\n title: 'public~CPU',\n },\n created: {\n classes: classNames('pf-v5-u-w-10-on-2xl'),\n id: 'created',\n title: 'public~Created',\n },\n labels: {\n classes: '',\n id: 'labels',\n title: 'public~Labels',\n },\n ipaddress: {\n classes: '',\n id: 'ipaddress',\n title: 'public~IP address',\n },\n traffic: {\n classes: '',\n id: 'trafficStatus',\n title: 'public~Receiving Traffic',\n },\n});\n\nconst kind = 'Pod';\nconst columnManagementID = referenceForModel(PodModel);\n\nconst getColumns = (showNodes: boolean, t: TFunction): TableColumn<PodKind>[] => [\n {\n title: t(podColumnInfo.name.title),\n id: podColumnInfo.name.id,\n sort: 'metadata.name',\n transforms: [sortable],\n props: { className: podColumnInfo.name.classes },\n },\n {\n title: t(podColumnInfo.namespace.title),\n id: podColumnInfo.namespace.id,\n sort: 'metadata.namespace',\n transforms: [sortable],\n props: { className: podColumnInfo.namespace.classes },\n },\n {\n title: t(podColumnInfo.status.title),\n id: podColumnInfo.status.id,\n sort: (data, direction) => data.sort(sortResourceByValue<PodKind>(direction, podPhase)),\n transforms: [sortable],\n props: { className: podColumnInfo.status.classes },\n },\n {\n title: t(podColumnInfo.ready.title),\n id: podColumnInfo.ready.id,\n sort: (data, direction) =>\n data.sort(sortResourceByValue<PodKind>(direction, (obj) => podReadiness(obj).readyCount)),\n transforms: [sortable],\n props: { className: podColumnInfo.ready.classes },\n },\n {\n title: t(podColumnInfo.restarts.title),\n id: podColumnInfo.restarts.id,\n sort: (data, direction) => data.sort(sortResourceByValue<PodKind>(direction, podRestarts)),\n transforms: [sortable],\n props: { className: podColumnInfo.restarts.classes },\n },\n {\n title: showNodes ? t(podColumnInfo.node.title) : t(podColumnInfo.owner.title),\n id: podColumnInfo.owner.id,\n sort: showNodes ? 'spec.nodeName' : 'metadata.ownerReferences[0].name',\n transforms: [sortable],\n props: { className: podColumnInfo.owner.classes },\n },\n {\n title: t(podColumnInfo.memory.title),\n id: podColumnInfo.memory.id,\n sort: (data, direction) =>\n data.sort(\n sortResourceByValue<PodKind>(direction, (obj) => UIActions.getPodMetric(obj, 'memory')),\n ),\n transforms: [sortable],\n props: { className: podColumnInfo.memory.classes },\n },\n {\n title: t(podColumnInfo.cpu.title),\n id: podColumnInfo.cpu.id,\n sort: (data, direction) =>\n data.sort(\n sortResourceByValue<PodKind>(direction, (obj) => UIActions.getPodMetric(obj, 'cpu')),\n ),\n transforms: [sortable],\n props: { className: podColumnInfo.cpu.classes },\n },\n {\n title: t(podColumnInfo.created.title),\n id: podColumnInfo.created.id,\n sort: 'metadata.creationTimestamp',\n transforms: [sortable],\n props: { className: podColumnInfo.created.classes },\n },\n {\n title: t(podColumnInfo.node.title),\n id: podColumnInfo.node.id,\n sort: 'spec.nodeName',\n transforms: [sortable],\n props: { className: podColumnInfo.node.classes },\n additional: true,\n },\n {\n title: t(podColumnInfo.labels.title),\n id: podColumnInfo.labels.id,\n sort: 'metadata.labels',\n transforms: [sortable],\n props: { className: podColumnInfo.labels.classes },\n additional: true,\n },\n {\n title: t(podColumnInfo.ipaddress.title),\n id: podColumnInfo.ipaddress.id,\n sort: 'status.podIP',\n transforms: [sortable],\n props: { className: podColumnInfo.ipaddress.classes },\n additional: true,\n },\n {\n title: t(podColumnInfo.traffic.title),\n id: podColumnInfo.traffic.id,\n props: { className: podColumnInfo.traffic.classes },\n additional: true,\n },\n {\n title: '',\n id: '',\n props: { className: Kebab.columnClass },\n },\n];\n\nconst PodTableRow: React.FC<RowProps<PodKind, PodRowData>> = ({\n obj: pod,\n rowData: { showNodes },\n activeColumnIDs,\n}) => {\n const { t } = useTranslation();\n const { name, namespace, creationTimestamp, labels } = pod.metadata;\n const bytes: number = useSelector(({ UI }) => {\n const metrics = UI.getIn(['metrics', 'pod']);\n return metrics?.memory?.[namespace]?.[name];\n });\n const cores: number = useSelector(({ UI }) => {\n const metrics = UI.getIn(['metrics', 'pod']);\n return metrics?.cpu?.[namespace]?.[name];\n });\n const { readyCount, totalContainers } = podReadiness(pod);\n const phase = podPhase(pod);\n const restarts = podRestarts(pod);\n const resourceKind = referenceFor(pod);\n const context = { [resourceKind]: pod };\n return (\n <>\n <TableData\n className={podColumnInfo.name.classes}\n id={podColumnInfo.name.id}\n activeColumnIDs={activeColumnIDs}\n >\n <ResourceLink kind={kind} name={name} namespace={namespace} />\n </TableData>\n <TableData\n className={classNames(podColumnInfo.namespace.classes, 'co-break-word')}\n activeColumnIDs={activeColumnIDs}\n id={podColumnInfo.namespace.id}\n >\n <ResourceLink kind=\"Namespace\" name={namespace} />\n </TableData>\n <TableData\n className={podColumnInfo.status.classes}\n activeColumnIDs={activeColumnIDs}\n id={podColumnInfo.status.id}\n >\n <PodStatus pod={pod} />\n </TableData>\n <TableData\n className={podColumnInfo.ready.classes}\n activeColumnIDs={activeColumnIDs}\n id={podColumnInfo.ready.id}\n >\n {readyCount}/{totalContainers}\n </TableData>\n <TableData\n className={podColumnInfo.restarts.classes}\n activeColumnIDs={activeColumnIDs}\n id={podColumnInfo.restarts.id}\n >\n {restarts}\n </TableData>\n <TableData\n className={podColumnInfo.owner.classes}\n activeColumnIDs={activeColumnIDs}\n id={podColumnInfo.owner.id}\n >\n {showNodes ? (\n <ResourceLink kind=\"Node\" name={pod.spec.nodeName} namespace={namespace} />\n ) : (\n <OwnerReferences resource={pod} />\n )}\n </TableData>\n <TableData\n className={podColumnInfo.memory.classes}\n activeColumnIDs={activeColumnIDs}\n id={podColumnInfo.memory.id}\n >\n {bytes ? `${formatBytesAsMiB(bytes)} MiB` : '-'}\n </TableData>\n <TableData\n className={podColumnInfo.cpu.classes}\n activeColumnIDs={activeColumnIDs}\n id={podColumnInfo.cpu.id}\n >\n {cores ? t('public~{{numCores}} cores', { numCores: formatCores(cores) }) : '-'}\n </TableData>\n <TableData\n className={podColumnInfo.created.classes}\n activeColumnIDs={activeColumnIDs}\n id={podColumnInfo.created.id}\n >\n <Timestamp timestamp={creationTimestamp} />\n </TableData>\n <TableData\n className={podColumnInfo.node.classes}\n activeColumnIDs={activeColumnIDs}\n id={podColumnInfo.node.id}\n >\n <ResourceLink kind=\"Node\" name={pod.spec.nodeName} namespace={namespace} />\n </TableData>\n <TableData\n className={podColumnInfo.labels.classes}\n activeColumnIDs={activeColumnIDs}\n id={podColumnInfo.labels.id}\n >\n <LabelList kind={kind} labels={labels} />\n </TableData>\n <TableData\n className={podColumnInfo.ipaddress.classes}\n activeColumnIDs={activeColumnIDs}\n id={podColumnInfo.ipaddress.id}\n >\n {pod?.status?.podIP ?? '-'}\n </TableData>\n <TableData\n className={podColumnInfo.traffic.classes}\n activeColumnIDs={activeColumnIDs}\n id={podColumnInfo.traffic.id}\n >\n <PodTraffic podName={name} namespace={namespace} />\n </TableData>\n <TableData className={Kebab.columnClass} activeColumnIDs={activeColumnIDs} id=\"\">\n <LazyActionMenu context={context} isDisabled={phase === 'Terminating'} />\n </TableData>\n </>\n );\n};\nPodTableRow.displayName = 'PodTableRow';\n\nexport const ContainerLink: React.FC<ContainerLinkProps> = ({ pod, name }) => (\n <span className=\"co-resource-item co-resource-item--inline\">\n <ResourceIcon kind=\"Container\" />\n <Link to={`/k8s/ns/${pod.metadata.namespace}/pods/${pod.metadata.name}/containers/${name}`}>\n {name}\n </Link>\n </span>\n);\nContainerLink.displayName = 'ContainerLink';\n\nconst ContainerRunningSince: React.FC<ContainerRunningSinceProps> = ({ startedAt }) => {\n const { t } = useTranslation();\n return startedAt ? (\n <Trans t={t} ns=\"public\">\n since <Timestamp timestamp={startedAt} simple />\n </Trans>\n ) : null;\n};\n\nconst ContainerTerminatedAt: React.FC<ContainerTerminatedAtProps> = ({ finishedAt }) => {\n const { t } = useTranslation();\n return finishedAt ? (\n <Trans t={t} ns=\"public\">\n at <Timestamp timestamp={finishedAt} simple />{' '}\n </Trans>\n ) : null;\n};\n\nconst ContainerTerminatedExitCode: React.FC<ContainerTerminatedExitCodeProps> = ({ exitCode }) => {\n const { t } = useTranslation();\n return exitCode ? t('public~with exit code {{exitCode}} ', { exitCode }) : null;\n};\n\nconst ContainerTerminatedReason: React.FC<ContainerTerminatedReasonProps> = ({ reason }) => {\n const { t } = useTranslation();\n return reason ? t('public~({{reason}})', { reason }) : null;\n};\n\nexport const ContainerLastState: React.FC<ContainerLastStateProps> = ({ containerLastState }) => {\n const { t } = useTranslation();\n if (containerLastState?.waiting) {\n return t('public~Waiting {{reason}}', { reason: containerLastState.waiting?.reason });\n } else if (containerLastState?.running) {\n return (\n <Trans t={t} ns=\"public\">\n Running <ContainerRunningSince startedAt={containerLastState.running?.startedAt} />\n </Trans>\n );\n } else if (containerLastState?.terminated) {\n return (\n <Trans t={t} ns=\"public\">\n Terminated <ContainerTerminatedAt finishedAt={containerLastState.terminated?.finishedAt} />\n <ContainerTerminatedExitCode exitCode={containerLastState.terminated?.exitCode} />\n <ContainerTerminatedReason reason={containerLastState.terminated?.reason} />\n </Trans>\n );\n }\n return <>-</>;\n};\n\nconst podContainerClassNames = [\n 'col-lg-2 col-md-3 col-sm-4 col-xs-5',\n 'col-lg-2 col-md-3 col-sm-5 col-xs-7 ',\n 'col-lg-2 col-md-1 col-sm-3 hidden-xs',\n 'col-lg-2 hidden-md hidden-sm hidden-xs',\n 'col-lg-1 col-md-2 hidden-sm hidden-xs',\n 'col-lg-1 col-md-2 hidden-sm hidden-xs',\n 'col-lg-1 hidden-md hidden-sm hidden-xs',\n 'col-lg-1 hidden-md hidden-sm hidden-xs',\n];\n\nexport const ContainerRow: React.FC<ContainerRowProps> = ({ pod, container }) => {\n const cstatus = getContainerStatus(pod, container.name);\n const cstate = getContainerState(cstatus);\n const startedAt = _.get(cstate, 'startedAt');\n const finishedAt = _.get(cstate, 'finishedAt');\n\n return (\n <div className=\"row\">\n <div className={podContainerClassNames[0]}>\n <ContainerLink pod={pod} name={container.name} />\n </div>\n <div className={`${podContainerClassNames[1]} co-truncate co-nowrap co-select-to-copy`}>\n {container.image || '-'}\n </div>\n <div className={podContainerClassNames[2]}>\n <Status status={cstate.label} />\n </div>\n <div className={podContainerClassNames[3]}>\n <ContainerLastState containerLastState={cstatus?.lastState} />\n </div>\n <div className={podContainerClassNames[4]}>{getContainerRestartCount(cstatus)}</div>\n <div className={podContainerClassNames[5]}>\n <Timestamp timestamp={startedAt} />\n </div>\n <div className={podContainerClassNames[6]}>\n <Timestamp timestamp={finishedAt} />\n </div>\n <div className={podContainerClassNames[7]}>{_.get(cstate, 'exitCode', '-')}</div>\n </div>\n );\n};\nContainerRow.displayName = 'ContainerRow';\n\nexport const PodContainerTable: React.FC<PodContainerTableProps> = ({\n heading,\n containers,\n pod,\n}) => {\n const { t } = useTranslation();\n return (\n <>\n <SectionHeading text={heading} />\n <div className=\"co-m-table-grid co-m-table-grid--bordered\">\n <div className=\"row co-m-table-grid__head\">\n <div className={podContainerClassNames[0]}>{t('public~Name')}</div>\n <div className={podContainerClassNames[1]}>{t('public~Image')}</div>\n <div className={podContainerClassNames[2]}>{t('public~State')}</div>\n <div className={podContainerClassNames[3]}>{t('public~Last State')}</div>\n <div className={podContainerClassNames[4]}>{t('public~Restarts')}</div>\n <div className={podContainerClassNames[5]}>{t('public~Started')}</div>\n <div className={podContainerClassNames[6]}>{t('public~Finished')}</div>\n <div className={podContainerClassNames[7]}>{t('public~Exit code')}</div>\n </div>\n <div className=\"co-m-table-grid__body\">\n {containers.map((c: any, i: number) => (\n <ContainerRow key={i} pod={pod} container={c} />\n ))}\n </div>\n </div>\n </>\n );\n};\n\nconst getNetworkName = (result: PrometheusResult) =>\n // eslint-disable-next-line camelcase\n result?.metric?.network_name || 'unnamed interface';\n\n// TODO update to use QueryBrowser for each graph\nconst PodMetrics: React.FC<PodMetricsProps> = ({ obj }) => {\n const { t } = useTranslation();\n return (\n <Dashboard className=\"resource-metrics-dashboard\">\n <Grid hasGutter>\n <GridItem xl={6} lg={12}>\n <Card className=\"resource-metrics-dashboard__card\">\n <CardHeader>\n <CardTitle>{t('public~Memory usage')}</CardTitle>\n </CardHeader>\n <CardBody className=\"resource-metrics-dashboard__card-body\">\n <Area\n ariaChartLinkLabel={t('public~View in query browser')}\n humanize={humanizeBinaryBytes}\n byteDataType={ByteDataTypes.BinaryBytes}\n namespace={obj.metadata.namespace}\n query={`sum(container_memory_working_set_bytes{pod='${obj.metadata.name}',namespace='${obj.metadata.namespace}',container='',}) BY (pod, namespace)`}\n limitQuery={`sum(kube_pod_resource_limit{resource='memory',pod='${obj.metadata.name}',namespace='${obj.metadata.namespace}'})`}\n requestedQuery={`sum(kube_pod_resource_request{resource='memory',pod='${obj.metadata.name}',namespace='${obj.metadata.namespace}'}) BY (pod, namespace)`}\n />\n </CardBody>\n </Card>\n </GridItem>\n <GridItem xl={6} lg={12}>\n <Card className=\"resource-metrics-dashboard__card\">\n <CardHeader>\n <CardTitle>{t('public~CPU usage')}</CardTitle>\n </CardHeader>\n <CardBody className=\"resource-metrics-dashboard__card-body\">\n <Area\n ariaChartLinkLabel={t('public~View in query browser')}\n humanize={humanizeCpuCores}\n namespace={obj.metadata.namespace}\n query={`pod:container_cpu_usage:sum{pod='${obj.metadata.name}',namespace='${obj.metadata.namespace}'}`}\n limitQuery={`sum(kube_pod_resource_limit{resource='cpu',pod='${obj.metadata.name}',namespace='${obj.metadata.namespace}'})`}\n requestedQuery={`sum(kube_pod_resource_request{resource='cpu',pod='${obj.metadata.name}',namespace='${obj.metadata.namespace}'}) BY (pod, namespace)`}\n />\n </CardBody>\n </Card>\n </GridItem>\n <GridItem xl={6} lg={12}>\n <Card className=\"resource-metrics-dashboard__card\">\n <CardHeader>\n <CardTitle>{t('public~Filesystem')}</CardTitle>\n </CardHeader>\n <CardBody className=\"resource-metrics-dashboard__card-body\">\n <Area\n ariaChartLinkLabel={t('public~View in query browser')}\n humanize={humanizeBinaryBytes}\n byteDataType={ByteDataTypes.BinaryBytes}\n namespace={obj.metadata.namespace}\n query={`pod:container_fs_usage_bytes:sum{pod='${obj.metadata.name}',namespace='${obj.metadata.namespace}'}`}\n />\n </CardBody>\n </Card>\n </GridItem>\n <GridItem xl={6} lg={12}>\n <Card className=\"resource-metrics-dashboard__card\">\n <CardHeader>\n <CardTitle>{t('public~Network in')}</CardTitle>\n </CardHeader>\n <CardBody className=\"resource-metrics-dashboard__card-body\">\n <Stack\n ariaChartLinkLabel={t('public~View in query browser')}\n humanize={humanizeDecimalBytesPerSec}\n namespace={obj.metadata.namespace}\n query={`pod_interface_network:container_network_receive_bytes:irate5m{pod='${obj.metadata.name}', namespace='${obj.metadata.namespace}'}`}\n description={getNetworkName}\n />\n </CardBody>\n </Card>\n </GridItem>\n <GridItem xl={6} lg={12}>\n <Card className=\"resource-metrics-dashboard__card\">\n <CardHeader>\n <CardTitle>{t('public~Network out')}</CardTitle>\n </CardHeader>\n <CardBody className=\"resource-metrics-dashboard__card-body\">\n <Stack\n ariaChartLinkLabel={t('public~View in query browser')}\n humanize={humanizeDecimalBytesPerSec}\n namespace={obj.metadata.namespace}\n query={`pod_interface_network:container_network_transmit_bytes_total:irate5m{pod='${obj.metadata.name}', namespace='${obj.metadata.namespace}'}`}\n description={getNetworkName}\n />\n </CardBody>\n </Card>\n </GridItem>\n </Grid>\n </Dashboard>\n );\n};\n\nconst PodStatusPopover: React.FC<PodStatusPopoverProps> = ({\n bodyContent,\n headerContent,\n footerContent,\n status,\n}) => {\n return (\n <Popover headerContent={headerContent} bodyContent={bodyContent} footerContent={footerContent}>\n <Button variant=\"link\" isInline data-test=\"popover-status-button\">\n <Status status={status} />\n </Button>\n </Popover>\n );\n};\n\nexport const PodStatus: React.FC<PodStatusProps> = ({ pod }) => {\n const status = podPhase(pod);\n const unschedulableCondition = pod.status?.conditions?.find(\n (condition) => condition.reason === 'Unschedulable' && condition.status === 'False',\n );\n const containerStatusStateWaiting = pod.status?.containerStatuses?.find(\n (cs) => cs.state?.waiting,\n );\n const { t } = useTranslation();\n\n if (status === 'Pending' && unschedulableCondition) {\n return (\n <PodStatusPopover\n bodyContent={unschedulableCondition.message}\n headerContent={t('public~Pod unschedulable')}\n status={status}\n />\n );\n }\n if (\n (status === 'CrashLoopBackOff' || status === 'ErrImagePull' || status === 'ImagePullBackOff') &&\n containerStatusStateWaiting\n ) {\n let footerLinks: React.ReactNode;\n let headerTitle = '';\n if (status === 'CrashLoopBackOff') {\n headerTitle = t('public~Pod crash loop back-off');\n const containers: ContainerSpec[] = pod.spec.containers;\n footerLinks = (\n <TextContent>\n <Text component={TextVariants.p}>\n {t(\n 'public~CrashLoopBackOff indicates that the application within the container is failing to start properly.',\n )}\n </Text>\n <Text component={TextVariants.p}>\n {t('public~To troubleshoot, view logs and events, then debug in terminal.')}\n </Text>\n <Text component={TextVariants.p}>\n <Link to={`${resourcePath('Pod', pod.metadata.name, pod.metadata.namespace)}/logs`}>\n {t('public~View logs')}\n </Link>\n  \n <Link to={`${resourcePath('Pod', pod.metadata.name, pod.metadata.namespace)}/events`}>\n {t('public~View events')}\n </Link>\n </Text>\n <Divider />\n {containers.map((container) => {\n if (isContainerCrashLoopBackOff(pod, container.name) && !isWindowsPod(pod)) {\n return (\n <div key={container.name}>\n <Link\n to={`${resourcePath(\n 'Pod',\n pod.metadata.name,\n pod.metadata.namespace,\n )}/containers/${container.name}/debug`}\n data-test={`popup-debug-container-link-${container.name}`}\n >\n {t('public~Debug container {{name}}', { name: container.name })}\n </Link>\n </div>\n );\n }\n })}\n </TextContent>\n );\n }\n\n return (\n <PodStatusPopover\n headerContent={headerTitle}\n bodyContent={containerStatusStateWaiting.state.waiting.message}\n footerContent={footerLinks}\n status={status}\n />\n );\n }\n\n return <Status status={status} />;\n};\n\nexport const PodDetailsList: React.FC<PodDetailsListProps> = ({ pod }) => {\n const { t } = useTranslation();\n const moreThanOnePodIPs = pod.status?.podIPs?.length > 1;\n const moreThanOneHostIPs = pod.status?.hostIPs?.length > 1;\n return (\n <dl className=\"co-m-pane__details\">\n <dt>{t('public~Status')}</dt>\n <dd>\n <PodStatus pod={pod} />\n </dd>\n <DetailsItem label={t('public~Restart policy')} obj={pod} path=\"spec.restartPolicy\">\n {getRestartPolicyLabel(pod)}\n </DetailsItem>\n <DetailsItem\n label={t('public~Active deadline seconds')}\n obj={pod}\n path=\"spec.activeDeadlineSeconds\"\n >\n {pod.spec.activeDeadlineSeconds\n ? t('public~{{count}} second', { count: pod.spec.activeDeadlineSeconds })\n : t('public~Not configured')}\n </DetailsItem>\n <DetailsItem\n label={moreThanOnePodIPs ? t('public~Pod IPs') : t('public~Pod IP')}\n obj={pod}\n path={moreThanOnePodIPs ? 'status.podIPs' : 'status.podIP'}\n >\n {moreThanOnePodIPs\n ? pod.status.podIPs.map((podIP) => podIP.ip).join(', ')\n : pod.status.podIP}\n </DetailsItem>\n <DetailsItem\n label={moreThanOneHostIPs ? t('public~Host IPs') : t('public~Host IP')}\n obj={pod}\n path={moreThanOneHostIPs ? 'status.hostIPs' : 'status.hostIP'}\n >\n {moreThanOneHostIPs\n ? pod.status.hostIPs.map((hostIP) => hostIP.ip).join(', ')\n : pod.status.hostIP}\n </DetailsItem>\n <DetailsItem label={t('public~Node')} obj={pod} path=\"spec.nodeName\" hideEmpty>\n <NodeLink name={pod.spec.nodeName} />\n </DetailsItem>\n {pod.spec.imagePullSecrets && (\n <DetailsItem label={t('public~Image pull secret')} obj={pod} path=\"spec.imagePullSecrets\">\n {pod.spec.imagePullSecrets.map((imagePullSecret) => (\n <ResourceLink\n key={imagePullSecret.name}\n kind=\"Secret\"\n name={imagePullSecret.name}\n namespace={pod.metadata.namespace}\n />\n ))}\n </DetailsItem>\n )}\n <RuntimeClass obj={pod} path=\"spec.runtimeClassName\" />\n <PodDisruptionBudgetField obj={pod} />\n <DetailsItem label={t('public~Receiving Traffic')} obj={pod}>\n <PodTraffic podName={pod.metadata.name} namespace={pod.metadata.namespace} />\n </DetailsItem>\n </dl>\n );\n};\nPodDetailsList.displayName = 'PodDetailsList';\n\nexport const PodResourceSummary: React.FC<PodResourceSummaryProps> = ({ pod }) => (\n <ResourceSummary\n resource={pod}\n showNodeSelector\n nodeSelector=\"spec.nodeSelector\"\n showTolerations\n />\n);\n\nconst Details: React.FC<PodDetailsProps> = ({ obj: pod }) => {\n const limits = {\n cpu: null,\n memory: null,\n };\n limits.cpu = _.reduce(\n pod.spec.containers,\n (sum, container) => {\n const value = units.dehumanize(_.get(container, 'resources.limits.cpu', 0), 'numeric').value;\n return sum + value;\n },\n 0,\n );\n limits.memory = _.reduce(\n pod.spec.containers,\n (sum, container) => {\n const value = units.dehumanize(\n _.get(container, 'resources.limits.memory', 0),\n 'binaryBytesWithoutB',\n ).value;\n return sum + value;\n },\n 0,\n );\n const { t } = useTranslation();\n return (\n <>\n <ScrollToTopOnMount />\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Pod details')} />\n <div className=\"row\">\n <div className=\"col-sm-6\">\n <PodResourceSummary pod={pod} />\n </div>\n <div className=\"col-sm-6\">\n <PodDetailsList pod={pod} />\n </div>\n </div>\n </div>\n {pod.spec.initContainers && (\n <div className=\"co-m-pane__body\">\n <PodContainerTable\n key=\"initContainerTable\"\n heading={t('public~Init containers')}\n containers={pod.spec.initContainers}\n pod={pod}\n />\n </div>\n )}\n <div className=\"co-m-pane__body\">\n <PodContainerTable\n key=\"containerTable\"\n heading={t('public~Containers')}\n containers={pod.spec.containers}\n pod={pod}\n />\n </div>\n <div className=\"co-m-pane__body\">\n <VolumesTable resource={pod} heading={t('public~Volumes')} />\n </div>\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Conditions')} />\n <Conditions conditions={pod.status.conditions} />\n </div>\n </>\n );\n};\n\nconst EnvironmentPage = (props: any) => (\n <AsyncComponent\n loader={() => import('./environment.jsx').then((c) => c.EnvironmentPage)}\n {...props}\n />\n);\n\nconst envPath = ['spec', 'containers'];\nconst PodEnvironmentComponent = (props) => (\n <EnvironmentPage obj={props.obj} rawEnvData={props.obj.spec} envPath={envPath} readOnly={true} />\n);\n\nexport const PodExecLoader: React.FC<PodExecLoaderProps> = ({\n obj,\n message,\n initialContainer,\n infoMessage,\n}) => (\n <div className=\"co-m-pane__body\">\n <div className=\"row\">\n <div className=\"col-xs-12\">\n <div className=\"panel-body\">\n <AsyncComponent\n loader={() => import('./pod-exec').then((c) => c.PodExec)}\n obj={obj}\n message={message}\n infoMessage={infoMessage}\n initialContainer={initialContainer}\n />\n </div>\n </div>\n </div>\n </div>\n);\nexport const PodsDetailsPage: React.FC<PodDetailsPageProps> = (props) => {\n const prometheusIsAvailable = usePrometheusGate();\n const customActionMenu = (kindObj, obj) => {\n const resourceKind = referenceForModel(kindObj);\n const context = { [resourceKind]: obj };\n return (\n <ActionServiceProvider context={context}>\n {({ actions, options, loaded }) =>\n loaded && (\n <ActionMenu actions={actions} options={options} variant={ActionMenuVariant.DROPDOWN} />\n )\n }\n </ActionServiceProvider>\n );\n };\n return (\n <DetailsPage\n {...props}\n getResourceStatus={podPhase}\n customActionMenu={customActionMenu}\n pages={[\n navFactory.details(Details),\n ...(prometheusIsAvailable ? [navFactory.metrics(PodMetrics)] : []),\n navFactory.editYaml(),\n navFactory.envEditor(PodEnvironmentComponent),\n navFactory.logs(PodLogs),\n navFactory.events(ResourceEventStream),\n navFactory.terminal(PodExecLoader),\n ]}\n />\n );\n};\nPodsDetailsPage.displayName = 'PodsDetailsPage';\n\nexport const PodList: React.FC<PodListProps> = ({ showNamespaceOverride, showNodes, ...props }) => {\n const { t } = useTranslation();\n const columns = React.useMemo(() => getColumns(showNodes, t), [showNodes, t]);\n const [activeColumns, userSettingsLoaded] = useActiveColumns({\n columns,\n showNamespaceOverride,\n columnManagementID,\n });\n const rowData = React.useMemo<PodRowData>(\n () => ({\n showNodes,\n }),\n [showNodes],\n );\n return (\n userSettingsLoaded && (\n <VirtualizedTable<PodKind, PodRowData>\n {...props}\n aria-label={t('public~Pods')}\n label={t('public~Pods')}\n columns={activeColumns}\n Row={PodTableRow}\n rowData={rowData}\n />\n )\n );\n};\nPodList.displayName = 'PodList';\n\nexport const getFilters = (t: TFunction): RowFilter<PodKind>[] => [\n {\n filterGroupName: t('public~Status'),\n type: 'pod-status',\n filter: (phases, pod) => {\n if (!phases || !phases.selected || !phases.selected.length) {\n return true;\n }\n const phase = podPhaseFilterReducer(pod);\n return phases.selected.includes(phase) || !_.includes(phases.all, phase);\n },\n reducer: podPhaseFilterReducer,\n items: [\n { id: 'Running', title: t('public~Running') },\n { id: 'Pending', title: t('public~Pending') },\n { id: 'Terminating', title: t('public~Terminating') },\n { id: 'CrashLoopBackOff', title: t('public~CrashLoopBackOff') },\n // Use title \"Completed\" to match what appears in the status column for the pod.\n // The pod phase is \"Succeeded,\" but the container state is \"Completed.\"\n { id: 'Succeeded', title: t('public~Completed') },\n { id: 'Failed', title: t('public~Failed') },\n { id: 'Unknown', title: t('public~Unknown') },\n ],\n },\n];\n\nexport const PodsPage: React.FC<PodPageProps> = ({\n canCreate = true,\n namespace,\n showNodes,\n showTitle = true,\n selector,\n fieldSelector,\n hideNameLabelFilters,\n hideLabelFilter,\n hideColumnManagement,\n nameFilter,\n showNamespaceOverride,\n mock = false,\n}) => {\n const { t } = useTranslation();\n const dispatch = useDispatch();\n const [tableColumns, , userSettingsLoaded] = useUserSettingsCompatibility<TableColumnsType>(\n COLUMN_MANAGEMENT_CONFIGMAP_KEY,\n COLUMN_MANAGEMENT_LOCAL_STORAGE_KEY,\n undefined,\n true,\n );\n\n /* eslint-disable react-hooks/exhaustive-deps */\n React.useEffect(() => {\n if (showMetrics) {\n const updateMetrics = () =>\n fetchPodMetrics(namespace)\n .then((result) => dispatch(UIActions.setPodMetrics(result)))\n .catch((e) => {\n // Just log the error here. Showing a warning alert could be more annoying\n // than helpful. It should be obvious there are no metrics in the list, and\n // if monitoring is broken, it'll be really apparent since none of the\n // graphs and dashboards will load in the UI.\n // eslint-disable-next-line no-console\n console.error('Unable to fetch pod metrics', e);\n });\n updateMetrics();\n const id = setInterval(updateMetrics, 30 * 1000);\n return () => clearInterval(id);\n }\n }, [namespace]);\n /* eslint-enable react-hooks/exhaustive-deps */\n\n const [pods, loaded, loadError] = useK8sWatchResource<PodKind[]>({\n kind,\n isList: true,\n namespaced: true,\n namespace,\n selector,\n fieldSelector,\n });\n\n const filters = React.useMemo(() => getFilters(t), [t]);\n\n const [data, filteredData, onFilterChange] = useListPageFilter(pods, filters, {\n name: { selected: [nameFilter] },\n });\n const resourceKind = referenceForModel(PodModel);\n const accessReview = {\n groupVersionKind: resourceKind,\n namespace: namespace || 'default',\n };\n return (\n userSettingsLoaded && (\n <>\n <ListPageHeader title={showTitle ? t('public~Pods') : undefined}>\n {canCreate && (\n <ListPageCreate groupVersionKind={resourceKind} createAccessReview={accessReview}>\n {t('public~Create Pod')}\n </ListPageCreate>\n )}\n </ListPageHeader>\n <ListPageBody>\n <ListPageFilter\n data={data}\n loaded={loaded}\n rowFilters={filters}\n onFilterChange={onFilterChange}\n columnLayout={{\n columns: getColumns(showNodes, t).map((column) =>\n _.pick(column, ['title', 'additional', 'id']),\n ),\n id: columnManagementID,\n selectedColumns:\n tableColumns?.[columnManagementID]?.length > 0\n ? new Set(tableColumns[columnManagementID])\n : null,\n showNamespaceOverride,\n type: t('public~Pod'),\n }}\n hideNameLabelFilters={hideNameLabelFilters}\n hideLabelFilter={hideLabelFilter}\n hideColumnManagement={hideColumnManagement}\n />\n <PodList\n data={filteredData}\n unfilteredData={pods}\n loaded={loaded}\n loadError={loadError}\n showNamespaceOverride={showNamespaceOverride}\n showNodes={showNodes}\n namespace={namespace}\n mock={mock}\n />\n </ListPageBody>\n </>\n )\n );\n};\n\ntype ContainerLinkProps = {\n pod: PodKind;\n name: string;\n};\n\ntype ContainerRunningSinceProps = {\n startedAt?: string | number | Date;\n};\n\ntype ContainerTerminatedAtProps = {\n finishedAt?: string | number | Date;\n};\n\ntype ContainerTerminatedExitCodeProps = {\n exitCode?: string;\n};\n\ntype ContainerTerminatedReasonProps = {\n reason?: string;\n};\n\ntype ContainerLastStateProps = {\n containerLastState?: ContainerState;\n};\n\ntype ContainerRowProps = {\n pod: PodKind;\n container: ContainerSpec;\n};\n\ntype PodContainerTableProps = {\n heading: string;\n containers: ContainerSpec[];\n pod: PodKind;\n};\n\ntype PodMetricsProps = {\n obj: PodKind;\n};\n\ntype PodStatusPopoverProps = {\n bodyContent: string;\n headerContent?: string;\n footerContent?: React.ReactNode | string;\n status: string;\n};\n\nexport type PodStatusProps = {\n pod: PodKind;\n};\n\ntype PodResourceSummaryProps = {\n pod: PodKind;\n};\n\nexport type PodDetailsListProps = {\n pod: PodKind;\n};\n\ntype PodExecLoaderProps = {\n obj: PodKind;\n message?: React.ReactElement;\n infoMessage?: React.ReactElement;\n initialContainer?: string;\n};\n\ntype PodDetailsProps = {\n obj: PodKind;\n};\n\ntype PodRowData = {\n showNodes?: boolean;\n};\n\ntype PodListProps = {\n data: PodKind[];\n unfilteredData: PodKind[];\n loaded: boolean;\n loadError: any;\n showNodes?: boolean;\n showNamespaceOverride?: boolean;\n namespace?: string;\n mock?: boolean;\n};\n\ntype PodPageProps = {\n canCreate?: boolean;\n fieldSelector?: string;\n namespace?: string;\n selector?: Selector;\n showTitle?: boolean;\n showNodes?: boolean;\n hideLabelFilter?: boolean;\n hideNameLabelFilters?: boolean;\n hideColumnManagement?: boolean;\n nameFilter?: string;\n showNamespaceOverride?: boolean;\n mock?: boolean;\n};\n\ntype PodDetailsPageProps = {\n kind: K8sResourceKindReference;\n};\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as _ from 'lodash-es';\nimport { Button } from '@patternfly/react-core';\nimport { PencilAltIcon } from '@patternfly/react-icons/dist/esm/icons/pencil-alt-icon';\nimport { useCanClusterUpgrade } from '@console/shared/src/hooks/useCanClusterUpgrade';\nimport { useAnnotationsModal } from '@console/shared/src/hooks/useAnnotationsModal';\nimport { useLabelsModal } from '@console/shared/src/hooks/useLabelsModal';\nimport { DetailsItem } from './details-item';\nimport { Kebab } from './kebab';\nimport { LabelList } from './label-list';\nimport { OwnerReferences } from './owner-references';\nimport { ResourceLink } from './resource-link';\nimport { Selector } from './selector';\nimport { Timestamp } from './timestamp';\nimport { useAccessReview } from './rbac';\nimport {\n ClusterVersionKind,\n K8sResourceCommon,\n K8sResourceKind,\n modelFor,\n referenceFor,\n Toleration,\n} from '../../module/k8s';\nimport { configureClusterUpstreamModal } from '../modals';\n\nexport const pluralize = (\n i: number,\n singular: string,\n plural: string = `${singular}s`,\n includeCount: boolean = true,\n) => {\n const pluralized = `${i === 1 ? singular : plural}`;\n return includeCount ? `${i || 0} ${pluralized}` : pluralized;\n};\n\nexport const detailsPage = <T extends {}>(Component: React.ComponentType<T>) =>\n function DetailsPage(props: T) {\n return <Component {...props} />;\n };\n\nconst getTolerationsPath = (obj: K8sResourceKind): string => {\n // FIXME: Is this correct for all types (jobs, cron jobs)? It would be better for the embedding page to pass in the path.\n return obj.kind === 'Pod' ? 'spec.tolerations' : 'spec.template.spec.tolerations';\n};\n\nexport const ResourceSummary: React.FC<ResourceSummaryProps> = ({\n children,\n resource,\n customPathName,\n showPodSelector = false,\n showNodeSelector = false,\n showAnnotations = true,\n showTolerations = false,\n showLabelEditor = true,\n canUpdateResource = true,\n podSelector = 'spec.selector',\n nodeSelector = 'spec.template.spec.nodeSelector',\n}) => {\n const { t } = useTranslation();\n const { metadata } = resource;\n const reference = referenceFor(resource);\n const model = modelFor(reference);\n const tolerationsPath = getTolerationsPath(resource);\n const tolerations: Toleration[] = _.get(resource, tolerationsPath);\n const annotationsModalLauncher = useAnnotationsModal(resource);\n const labelsModalLauncher = useLabelsModal(resource);\n const canUpdateAccess = useAccessReview({\n group: model.apiGroup,\n resource: model.plural,\n verb: 'patch',\n name: metadata.name,\n namespace: metadata.namespace,\n });\n const canUpdate = canUpdateAccess && canUpdateResource;\n\n return (\n <dl data-test-id=\"resource-summary\" className=\"co-m-pane__details\">\n <DetailsItem\n label={t('public~Name')}\n obj={resource}\n path={customPathName || 'metadata.name'}\n />\n {metadata.namespace && (\n <DetailsItem label={t('public~Namespace')} obj={resource} path=\"metadata.namespace\">\n <ResourceLink\n kind=\"Namespace\"\n name={metadata.namespace}\n title={metadata.uid}\n namespace={null}\n />\n </DetailsItem>\n )}\n <DetailsItem\n label={t('public~Labels')}\n obj={resource}\n path=\"metadata.labels\"\n valueClassName=\"details-item__value--labels\"\n onEdit={labelsModalLauncher}\n canEdit={showLabelEditor && canUpdate}\n editAsGroup\n >\n <LabelList kind={reference} labels={metadata.labels} />\n </DetailsItem>\n {showPodSelector && (\n <DetailsItem label={t('public~Pod selector')} obj={resource} path={podSelector}>\n <Selector\n selector={_.get(resource, podSelector)}\n namespace={_.get(resource, 'metadata.namespace')}\n />\n </DetailsItem>\n )}\n {showNodeSelector && (\n <DetailsItem label={t('public~Node selector')} obj={resource} path={nodeSelector}>\n <Selector kind={t('public~Node')} selector={_.get(resource, nodeSelector)} />\n </DetailsItem>\n )}\n {showTolerations && (\n <DetailsItem label={t('public~Tolerations')} obj={resource} path={tolerationsPath}>\n {canUpdate ? (\n <Button\n type=\"button\"\n isInline\n onClick={Kebab.factory.ModifyTolerations(model, resource).callback}\n variant=\"link\"\n >\n {t('public~{{count}} toleration', { count: _.size(tolerations) })}\n <PencilAltIcon className=\"co-icon-space-l pf-v5-c-button-icon--plain\" />\n </Button>\n ) : (\n t('public~{{count}} toleration', { count: _.size(tolerations) })\n )}\n </DetailsItem>\n )}\n {showAnnotations && (\n <DetailsItem label={t('public~Annotations')} obj={resource} path=\"metadata.annotations\">\n {canUpdate ? (\n <Button\n data-test=\"edit-annotations\"\n type=\"button\"\n isInline\n onClick={annotationsModalLauncher}\n variant=\"link\"\n >\n {t('public~{{count}} annotation', { count: _.size(metadata.annotations) })}\n <PencilAltIcon className=\"co-icon-space-l pf-v5-c-button-icon--plain\" />\n </Button>\n ) : (\n t('public~{{count}} annotation', { count: _.size(metadata.annotations) })\n )}\n </DetailsItem>\n )}\n {children}\n <DetailsItem label={t('public~Created at')} obj={resource} path=\"metadata.creationTimestamp\">\n <Timestamp timestamp={metadata.creationTimestamp} />\n </DetailsItem>\n <DetailsItem label={t('public~Owner')} obj={resource} path=\"metadata.ownerReferences\">\n <OwnerReferences resource={resource} />\n </DetailsItem>\n </dl>\n );\n};\n\nexport const ResourcePodCount: React.SFC<ResourcePodCountProps> = ({ resource }) => {\n const { t } = useTranslation();\n return (\n <>\n <DetailsItem\n label={t('public~Current count')}\n obj={resource}\n path=\"status.replicas\"\n defaultValue=\"0\"\n />\n <DetailsItem\n label={t('public~Desired count')}\n obj={resource}\n path=\"spec.replicas\"\n defaultValue=\"0\"\n />\n </>\n );\n};\n\nexport const RuntimeClass: React.FC<RuntimeClassProps> = ({ obj, path }) => {\n const { t } = useTranslation();\n return (\n <DetailsItem\n label={t('public~Runtime class')}\n obj={obj}\n path={path || 'spec.template.spec.runtimeClassName'}\n hideEmpty\n />\n );\n};\n\nexport const UpstreamConfigDetailsItem: React.SFC<UpstreamConfigDetailsItemProps> = ({\n resource,\n}) => {\n const { t } = useTranslation();\n const canUpgrade = useCanClusterUpgrade();\n return (\n <DetailsItem label={t('public~Upstream configuration')} obj={resource} path=\"spec.upstream\">\n <div>\n <Button\n type=\"button\"\n isInline\n data-test-id=\"cv-upstream-server-url\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n canUpgrade && configureClusterUpstreamModal({ cv: resource });\n }}\n variant=\"link\"\n isDisabled={!canUpgrade}\n >\n {resource?.spec?.upstream || t('public~Default update server')}\n {canUpgrade && <PencilAltIcon className=\"co-icon-space-l pf-v5-c-button-icon--plain\" />}\n </Button>\n </div>\n </DetailsItem>\n );\n};\n\nexport type ResourceSummaryProps = {\n resource: K8sResourceKind;\n showPodSelector?: boolean;\n showNodeSelector?: boolean;\n showAnnotations?: boolean;\n showTolerations?: boolean;\n showLabelEditor?: boolean;\n canUpdateResource?: boolean;\n podSelector?: string;\n nodeSelector?: string;\n children?: React.ReactNode;\n customPathName?: string;\n};\n\nexport type ResourcePodCountProps = {\n resource: K8sResourceKind;\n};\n\nexport type UpstreamConfigDetailsItemProps = {\n resource: ClusterVersionKind;\n};\n\nexport type RuntimeClassProps = {\n obj: K8sResourceCommon;\n path?: string;\n};\n\nResourceSummary.displayName = 'ResourceSummary';\nResourcePodCount.displayName = 'ResourcePodCount';\n","import * as _ from 'lodash';\nimport { WatchK8sResources } from '@console/dynamic-plugin-sdk';\nimport { FirehoseResource } from '@console/internal/components/utils';\nimport { K8sResourceKind, PodKind, referenceForModel } from '@console/internal/module/k8s';\nimport { KafkaConnectionModel } from '@console/rhoas-plugin/src/models';\nimport { GLOBAL_OPERATOR_NS, KNATIVE_SERVING_LABEL } from '../const';\nimport {\n CamelKameletModel,\n ServiceModel,\n RevisionModel,\n ConfigurationModel,\n RouteModel,\n EventingSubscriptionModel,\n EventingBrokerModel,\n EventingTriggerModel,\n KafkaModel,\n KafkaTopicModel,\n CamelIntegrationModel,\n CamelKameletBindingModel,\n DomainMappingModel,\n KafkaSinkModel,\n} from '../models';\nimport { Traffic } from '../types';\nimport {\n getDynamicEventSourcesWatchers,\n getDynamicEventingChannelWatchers,\n} from './fetch-dynamic-eventsources-utils';\n\nexport type KnativeItem = {\n revisions?: K8sResourceKind[];\n configurations?: K8sResourceKind[];\n ksroutes?: K8sResourceKind[];\n ksservices?: K8sResourceKind[];\n eventSources?: K8sResourceKind[];\n eventingsubscription?: K8sResourceKind[];\n eventSourceCronjob?: K8sResourceKind[];\n eventSourceContainers?: K8sResourceKind[];\n eventSourceApiserver?: K8sResourceKind[];\n eventSourceCamel?: K8sResourceKind[];\n eventSourceKafka?: K8sResourceKind[];\n eventSourceSinkbinding?: K8sResourceKind[];\n domainMappings?: K8sResourceKind[];\n pods?: PodKind[];\n associatedDeployment?: K8sResourceKind;\n};\n\nconst isKnativeDeployment = (dc: K8sResourceKind) => {\n return !!_.get(dc.metadata, `labels[\"${KNATIVE_SERVING_LABEL}\"]`);\n};\n\nconst getKsResource = (dc: K8sResourceKind, { data }: K8sResourceKind): K8sResourceKind[] => {\n let ksResource = [];\n if (isKnativeDeployment(dc)) {\n const name = dc.metadata.labels?.[KNATIVE_SERVING_LABEL];\n ksResource = _.filter(data, (config: K8sResourceKind) => {\n return name === _.get(config, 'metadata.name');\n });\n }\n return ksResource;\n};\n\nconst getRevisions = (dc: K8sResourceKind, { data }): K8sResourceKind[] => {\n let revisionResource = [];\n if (isKnativeDeployment(dc)) {\n const ownerUid = dc.metadata.ownerReferences?.[0]?.uid;\n revisionResource = _.filter(data, (revision: K8sResourceKind) => {\n return ownerUid && ownerUid === revision.metadata.uid;\n });\n }\n return revisionResource;\n};\n\nexport const getDomainMapping = (res: K8sResourceKind, { data }): K8sResourceKind[] => {\n const { apiVersion, kind, metadata } = res;\n let domainMappingResource = [];\n if (!metadata || !data.length) return domainMappingResource;\n if (\n kind === ServiceModel.kind &&\n apiVersion === `${ServiceModel.apiGroup}/${ServiceModel.apiVersion}`\n ) {\n domainMappingResource = data.filter((domainMapping) => {\n return (\n domainMapping.spec.ref.apiVersion === apiVersion &&\n domainMapping.spec.ref.kind === kind &&\n domainMapping.spec.ref.name === metadata.name\n );\n });\n }\n return domainMappingResource;\n};\n\nexport const getKnativeServingRevisions = (dc: K8sResourceKind, props): KnativeItem | undefined => {\n const revisions = props && props.revisions && getRevisions(dc, props.revisions);\n return revisions && revisions.length > 0 ? { revisions } : undefined;\n};\n\nexport const getKnativeServingConfigurations = (\n dc: K8sResourceKind,\n props,\n): KnativeItem | undefined => {\n const configurations = props && props.configurations && getKsResource(dc, props.configurations);\n return configurations && configurations.length > 0 ? { configurations } : undefined;\n};\n\nexport const getKnativeServingRoutes = (dc: K8sResourceKind, props): KnativeItem | undefined => {\n const ksroutes = props && props.ksroutes && getKsResource(dc, props.ksroutes);\n return ksroutes && ksroutes.length > 0 ? { ksroutes } : undefined;\n};\n\nexport const getKnativeServingDomainMapping = (res: K8sResourceKind, props) => {\n const domainMappings =\n props && props.domainmappings && getDomainMapping(res, props.domainmappings);\n return domainMappings?.length > 0 ? { domainMappings } : undefined;\n};\n\nexport const getKnativeServingServices = (dc: K8sResourceKind, props): KnativeItem | undefined => {\n const ksservices = props && props.ksservices && getKsResource(dc, props.ksservices);\n return ksservices && ksservices.length > 0 ? { ksservices } : undefined;\n};\n\nexport const knativeServingResourcesRevision = (namespace: string): FirehoseResource[] => {\n const knativeResource = [\n {\n isList: true,\n kind: referenceForModel(RevisionModel),\n namespace,\n prop: 'revisions',\n optional: true,\n },\n ];\n return knativeResource;\n};\n\nexport const knativeServingResourcesConfigurations = (namespace: string): FirehoseResource[] => {\n const knativeResource = [\n {\n isList: true,\n kind: referenceForModel(ConfigurationModel),\n namespace,\n prop: 'configurations',\n optional: true,\n },\n ];\n return knativeResource;\n};\n\nexport const knativeServingResourcesRoutes = (namespace: string): FirehoseResource[] => {\n const knativeResource = [\n {\n isList: true,\n kind: referenceForModel(RouteModel),\n namespace,\n prop: 'ksroutes',\n optional: true,\n },\n ];\n return knativeResource;\n};\n\nexport const k8sServices = (namespace: string, limit?: number): FirehoseResource[] => {\n const knativeResource = [\n {\n isList: true,\n kind: 'Service',\n namespace,\n prop: 'services',\n optional: true,\n ...(limit && { limit }),\n },\n ];\n return knativeResource;\n};\n\nexport const knativeServingResourcesServices = (\n namespace: string,\n limit?: number,\n): FirehoseResource[] => {\n const knativeResource = [\n {\n isList: true,\n kind: referenceForModel(ServiceModel),\n namespace,\n prop: 'ksservices',\n optional: true,\n ...(limit && { limit }),\n },\n ];\n return knativeResource;\n};\n\nexport const knativeKafkaSinks = (namespace: string, limit?: number): FirehoseResource[] => {\n const knativeResource = [\n {\n isList: true,\n kind: referenceForModel(KafkaSinkModel),\n namespace,\n prop: 'kafkasinks',\n optional: true,\n ...(limit && { limit }),\n },\n ];\n return knativeResource;\n};\n\nexport const knativeEventingResourcesSubscription = (namespace: string): FirehoseResource[] => {\n const knativeResource = [\n {\n isList: true,\n kind: referenceForModel(EventingSubscriptionModel),\n namespace,\n prop: 'eventingsubscription',\n optional: true,\n },\n ];\n return knativeResource;\n};\n\nexport const knativeEventingResourcesBroker = (\n namespace: string,\n limit?: number,\n): FirehoseResource[] => {\n const knativeResource = [\n {\n isList: true,\n kind: referenceForModel(EventingBrokerModel),\n namespace,\n prop: EventingBrokerModel.plural,\n optional: true,\n ...(limit && { limit }),\n },\n ];\n return knativeResource;\n};\n\nexport const knativeServingResourcesRevisionWatchers = (\n namespace: string,\n): WatchK8sResources<any> => {\n const knativeResource = {\n revisions: {\n isList: true,\n kind: referenceForModel(RevisionModel),\n namespace,\n optional: true,\n },\n };\n return knativeResource;\n};\n\nexport const knativeServingResourcesConfigurationsWatchers = (\n namespace: string,\n): WatchK8sResources<any> => {\n const knativeResource = {\n configurations: {\n isList: true,\n kind: referenceForModel(ConfigurationModel),\n namespace,\n optional: true,\n },\n };\n return knativeResource;\n};\n\nexport const knativeServingResourcesRoutesWatchers = (\n namespace: string,\n): WatchK8sResources<any> => {\n const knativeResource = {\n ksroutes: {\n isList: true,\n kind: referenceForModel(RouteModel),\n namespace,\n optional: true,\n },\n };\n return knativeResource;\n};\n\nexport const knativeServingResourcesServicesWatchers = (\n namespace: string,\n): WatchK8sResources<any> => {\n const knativeResource = {\n ksservices: {\n isList: true,\n kind: referenceForModel(ServiceModel),\n namespace,\n optional: true,\n },\n };\n return knativeResource;\n};\n\nexport const knativeEventingResourcesSubscriptionWatchers = (\n namespace: string,\n): WatchK8sResources<any> => {\n const knativeResource = {\n eventingsubscription: {\n isList: true,\n kind: referenceForModel(EventingSubscriptionModel),\n namespace,\n optional: true,\n },\n };\n return knativeResource;\n};\n\nexport const knativeEventingBrokerResourceWatchers = (namespace: string) => {\n return {\n [EventingBrokerModel.plural]: {\n isList: true,\n kind: referenceForModel(EventingBrokerModel),\n namespace,\n optional: true,\n },\n };\n};\n\nexport const knativeEventingTriggerResourceWatchers = (namespace: string) => {\n return {\n [EventingTriggerModel.plural]: {\n isList: true,\n kind: referenceForModel(EventingTriggerModel),\n namespace,\n optional: true,\n },\n };\n};\n\nexport const knativeCamelIntegrationsResourceWatchers = (\n namespace: string,\n): WatchK8sResources<any> => {\n return {\n [CamelIntegrationModel.plural]: {\n isList: true,\n kind: referenceForModel(CamelIntegrationModel),\n namespace,\n optional: true,\n },\n };\n};\n\nexport const knativeCamelKameletResourceWatchers = (namespace: string) => {\n return {\n [CamelKameletModel.plural]: {\n isList: true,\n kind: referenceForModel(CamelKameletModel),\n namespace,\n optional: true,\n },\n kameletGlobalNS: {\n isList: true,\n kind: referenceForModel(CamelKameletModel),\n namespace: GLOBAL_OPERATOR_NS,\n optional: true,\n },\n };\n};\n\nexport const kafkaBootStrapServerResourcesWatcher = (namespace: string): WatchK8sResources<any> => {\n return {\n [KafkaModel.plural]: {\n isList: true,\n kind: referenceForModel(KafkaModel),\n optional: true,\n },\n [KafkaConnectionModel.plural]: {\n isList: true,\n kind: referenceForModel(KafkaConnectionModel),\n namespace,\n optional: true,\n },\n };\n};\n\nexport const kafkaTopicsResourcesWatcher = (): WatchK8sResources<any> => {\n return {\n [KafkaTopicModel.plural]: {\n isList: true,\n kind: referenceForModel(KafkaTopicModel),\n optional: true,\n },\n };\n};\n\nexport const knativeCamelKameletBindingResourceWatchers = (\n namespace: string,\n): WatchK8sResources<any> => {\n return {\n [CamelKameletBindingModel.plural]: {\n isList: true,\n kind: referenceForModel(CamelKameletBindingModel),\n namespace,\n optional: true,\n },\n };\n};\n\nexport const knativeCamelDomainMappingResourceWatchers = (\n namespace: string,\n): WatchK8sResources<{ [key: string]: K8sResourceKind[] }> => {\n return {\n [DomainMappingModel.plural]: {\n isList: true,\n kind: referenceForModel(DomainMappingModel),\n namespace,\n optional: true,\n },\n };\n};\n\nexport const getTrafficByRevision = (revName: string, service: K8sResourceKind) => {\n if (!service?.status?.traffic?.length) {\n return {};\n }\n const trafficPercent = service.status.traffic\n .filter((t: Traffic) => t.revisionName === revName)\n .reduce(\n (acc, tr: Traffic) => {\n acc.percent += tr.percent ? tr.percent : 0;\n if (tr.url) {\n acc.urls.push(tr.url);\n }\n return acc;\n },\n { urls: [], percent: 0 },\n );\n return {\n ...trafficPercent,\n percent: trafficPercent.percent ? `${trafficPercent.percent}%` : null,\n };\n};\n\nexport const getSinkableResources = (namespace: string): FirehoseResource[] => {\n return namespace\n ? [\n ...k8sServices(namespace),\n ...knativeServingResourcesServices(namespace),\n ...knativeKafkaSinks(namespace),\n ]\n : [];\n};\n\nexport const getKnativeServingResources = (namespace: string) => {\n return {\n ...knativeServingResourcesRevisionWatchers(namespace),\n ...knativeServingResourcesConfigurationsWatchers(namespace),\n ...knativeServingResourcesRoutesWatchers(namespace),\n ...knativeServingResourcesServicesWatchers(namespace),\n ...knativeCamelDomainMappingResourceWatchers(namespace),\n };\n};\n\nexport const getKnativeEventingResources = (namespace: string) => {\n return {\n ...knativeEventingResourcesSubscriptionWatchers(namespace),\n ...getDynamicEventSourcesWatchers(namespace),\n ...getDynamicEventingChannelWatchers(namespace),\n ...knativeEventingBrokerResourceWatchers(namespace),\n ...knativeEventingTriggerResourceWatchers(namespace),\n };\n};\n\nexport const getKnativeEventingKameletsResources = (namespace: string) => {\n return {\n ...knativeCamelIntegrationsResourceWatchers(namespace),\n ...knativeCamelKameletBindingResourceWatchers(namespace),\n ...knativeCamelDomainMappingResourceWatchers(namespace),\n ...knativeCamelKameletResourceWatchers(namespace),\n };\n};\n","import * as React from 'react';\nimport { Link } from 'react-router-dom-v5-compat';\nimport * as classNames from 'classnames';\nimport * as _ from 'lodash-es';\nimport { Label as PfLabel, LabelGroup as PfLabelGroup } from '@patternfly/react-core';\n\n/* eslint-disable import/named */\nimport { withTranslation, WithTranslation } from 'react-i18next';\n/* eslint-enable import/named */\nimport { K8sResourceKindReference, kindForReference } from '../../module/k8s';\n\nexport const Label: React.SFC<LabelProps> = ({ kind, name, value, expand }) => {\n const href = `/search?kind=${kind}&q=${value ? encodeURIComponent(`${name}=${value}`) : name}`;\n const kindOf = `co-m-${kindForReference(kind.toLowerCase())}`;\n const klass = classNames(kindOf, { 'co-m-expand': expand }, 'co-label');\n\n return (\n <>\n <PfLabel className={klass}>\n <Link className=\"pf-v5-c-label__content\" to={href}>\n <span className=\"co-label__key\" data-test=\"label-key\">\n {name}\n </span>\n {value && <span className=\"co-label__eq\">=</span>}\n {value && <span className=\"co-label__value\">{value}</span>}\n </Link>\n </PfLabel>\n </>\n );\n};\n\nclass TranslatedLabelList extends React.Component<LabelListProps> {\n shouldComponentUpdate(nextProps) {\n return !_.isEqual(nextProps, this.props);\n }\n\n render() {\n const { labels, kind, t, expand = true } = this.props;\n const list = _.map(labels, (label, key) => (\n <Label key={key} kind={kind} name={key} value={label} expand={expand} />\n ));\n\n return (\n <>\n {_.isEmpty(list) ? (\n <div className=\"text-muted\" key=\"0\">\n {t('public~No labels')}\n </div>\n ) : (\n <PfLabelGroup\n className=\"co-label-group\"\n defaultIsOpen={true}\n numLabels={20}\n data-test=\"label-list\"\n >\n {list}\n </PfLabelGroup>\n )}\n </>\n );\n }\n}\n\nexport const LabelList = withTranslation()(TranslatedLabelList);\n\nexport type LabelProps = {\n kind: K8sResourceKindReference;\n name: string;\n value: string;\n expand: boolean;\n};\n\nexport type LabelListProps = WithTranslation & {\n labels: { [key: string]: string };\n kind: K8sResourceKindReference;\n expand?: boolean;\n};\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport { Alert, AlertVariant, Button, List, ListItem } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\n\nexport const ExpandableAlert: React.FC<CustomAlertProps> = ({ alerts, variant }) => {\n const alertCount = alerts.length;\n const [expanded, setExpanded] = React.useState(false);\n const alertContent =\n alertCount > 1 ? (\n <List>\n {_.map(alerts, (error, i) => (\n <ListItem key={i}>{error}</ListItem>\n ))}\n </List>\n ) : (\n alerts\n );\n const { t } = useTranslation();\n\n return (\n <Alert\n isInline\n variant={variant}\n className=\"co-alert\"\n title={\n <>\n {t('public~There is {{count}} {{variant}} alert.', { count: alertCount, variant })}\n <Button type=\"button\" onClick={() => setExpanded(!expanded)} variant=\"link\">\n {expanded ? t('public~Hide details') : t('public~Show details')}\n </Button>\n </>\n }\n >\n {expanded && alertContent}\n </Alert>\n );\n};\n\ntype CustomAlertProps = {\n alerts: React.ReactNode[];\n variant: AlertVariant;\n};\n","import i18next from 'i18next';\nimport { JSONSchema7 } from 'json-schema';\nimport { startCase, toPath } from 'lodash';\nimport { FirehoseResult } from '@console/internal/components/utils/types';\nimport { K8sKind, K8sResourceKind, modelFor } from '@console/internal/module/k8s';\nimport { getUID } from '../selectors/common';\n\nexport type EntityMap<A> = { [propertyName: string]: A };\nexport type K8sEntityMap<A extends K8sResourceKind> = EntityMap<A>;\n\ntype KeyResolver<A> = (entity: A) => string;\n\nexport const createBasicLookup = <A>(list: A[], getKey: KeyResolver<A>): EntityMap<A> => {\n return (list || []).reduce((lookup, entity) => {\n const key = getKey(entity);\n if (key) {\n lookup[key] = entity;\n }\n return lookup;\n }, {});\n};\n\nexport const createLookup = <A extends K8sResourceKind>(\n loadingList: FirehoseResult<A[]>,\n getKey?: KeyResolver<A>,\n): K8sEntityMap<A> => {\n if (loadingList && loadingList.loaded) {\n return createBasicLookup(loadingList.data, getKey || getUID);\n }\n return {};\n};\n\nexport const getRandomChars = (len = 6): string => {\n return Math.random()\n .toString(36)\n .replace(/[^a-z0-9]+/g, '')\n .substr(1, len);\n};\n\nexport const isValidUrl = (url: string): boolean => {\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n return true;\n } catch {\n return false;\n }\n};\n\n// Recursive helper for getSchemaAtPath\nconst recursiveGetSchemaAtPath = (\n schema: JSONSchema7,\n [segment, ...path]: string[] = [],\n): JSONSchema7 => {\n if (segment) {\n return /^\\d+$/.test(segment)\n ? recursiveGetSchemaAtPath(schema?.items as JSONSchema7, path)\n : recursiveGetSchemaAtPath(schema?.properties?.[segment] as JSONSchema7, path);\n }\n return schema;\n};\n\n// Get a schema at the provided path string.\nexport const getSchemaAtPath = (schema: JSONSchema7, path: string): JSONSchema7 => {\n return recursiveGetSchemaAtPath(schema, toPath(path));\n};\n\n// Converts a string to title case `some-title` -> `Some Title`\nexport const toTitleCase = (title: string): string => {\n return title\n .split('-')\n .map((w) => (w ? w[0].toUpperCase() + w.substr(1) : ''))\n .join(' ');\n};\n\n// Check for a modified mouse event. For example - Ctrl + Click\nexport const isModifiedEvent = (event: React.MouseEvent<HTMLElement>) => {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n};\n\n// Returns true if subject starts with at least one search string\nexport const startsWithSome = (subject: string, ...searchStrings: string[]): boolean =>\n searchStrings?.some(\n (searchString) => searchString?.length > 0 && subject.startsWith(searchString),\n );\n\nexport const alphanumericCompare = (a: string, b: string): number => {\n return a.localeCompare(b, undefined, {\n numeric: true,\n sensitivity: 'base',\n });\n};\n\nexport const translationForResourceKind = {\n // t('console-shared~Helm Release')\n HelmRelease: `console-shared~Helm Release`,\n};\n\nexport const labelForNodeKind = (kindString: string) => {\n const model: K8sKind | undefined = modelFor(kindString);\n if (model) {\n return model.label;\n }\n return startCase(kindString);\n};\n\nexport const getTitleForNodeKind = (kindString: string) => {\n const model: K8sKind | undefined = modelFor(kindString);\n if (model) {\n if (model.labelKey) {\n return i18next.t(model.labelKey);\n }\n return model.label;\n }\n if (translationForResourceKind[kindString]) {\n return i18next.t(translationForResourceKind[kindString]);\n }\n return startCase(kindString);\n};\n","import * as React from 'react';\nimport * as _ from 'lodash';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useSelector } from 'react-redux';\nimport { HIDE_USER_WORKLOAD_NOTIFICATIONS_USER_SETTINGS_KEY } from '@console/app/src/consts';\nimport { Alert } from '@console/dynamic-plugin-sdk';\nimport { LabelSelector, ObjectMetadata } from '@console/internal/module/k8s';\nimport { NotificationAlerts } from '@console/internal/reducers/observe';\nimport { RootState } from '@console/internal/redux';\nimport { SYSTEM_ALERT_RULE_LABEL } from '../constants/monitoring';\nimport { useUserSettings } from './useUserSettings';\n\n/** Get notification alerts from redux and filter by current user notification settings OR the\n provided override labels. Alerts that match on override labels will not be fitlered even if\n current user settings would normally exclude them.\n @argument overrideMatchLabels optional, filter alerts by proviced labels. Overrides the current \\\n user settings.\n @returns [filteredAlerts, loaded, loadError]\n*/\nexport const useNotificationAlerts = (\n overrideMatchLabels?: ObjectMetadata['labels'],\n): [Alert[], boolean, Error] => {\n const [hideUserWorkloadNotifications] = useUserSettings(\n HIDE_USER_WORKLOAD_NOTIFICATIONS_USER_SETTINGS_KEY,\n true,\n true,\n );\n const { data: alerts, loaded, loadError } = useSelector<NotificationAlerts>(\n ({ observe }: RootState) => observe.get('notificationAlerts') ?? {},\n );\n\n const [filteredAlerts, setFilteredAlerts] = React.useState<Alert[]>([]);\n\n const next = React.useMemo(() => {\n const alertLabelSelector = new LabelSelector(overrideMatchLabels);\n const alertRuleLabelSelector = new LabelSelector(\n hideUserWorkloadNotifications ? SYSTEM_ALERT_RULE_LABEL : {},\n true,\n );\n return (alerts ?? []).filter(\n (alert) =>\n alertLabelSelector.matchesLabels(alert.labels ?? {}) ||\n alertRuleLabelSelector.matchesLabels(alert.rule.labels ?? {}),\n );\n }, [alerts, overrideMatchLabels, hideUserWorkloadNotifications]);\n\n React.useEffect(() => {\n setFilteredAlerts((current) => (_.isEqual(current, next) ? current : next));\n }, [next]);\n return [filteredAlerts, loaded, loadError];\n};\n","export { isCurrentUser, isSystemNamespace, isOtherUser, requesterFilter } from './filters';\nexport { default as NamespaceDropdown } from './NamespaceDropdown';\n","import { K8sResourceCondition } from '@console/internal/module/k8s';\nimport { ServiceBinding, ComputedServiceBindingStatus } from './types';\n\nconst expectedConditionTypes = ['CollectionReady', 'InjectionReady', 'Ready'];\nconst expectedConditionStatus = 'True';\n\nexport const getComputedServiceBindingStatus = (\n serviceBinding: ServiceBinding,\n): ComputedServiceBindingStatus => {\n const conditions = serviceBinding?.status?.conditions || [];\n const isConnected =\n conditions.filter(\n (condition) =>\n expectedConditionTypes.includes(condition.type) &&\n condition.status === expectedConditionStatus,\n ).length === expectedConditionTypes.length;\n\n return isConnected ? ComputedServiceBindingStatus.CONNECTED : ComputedServiceBindingStatus.ERROR;\n};\n\nexport const getFirstServiceBindingError = (\n serviceBinding: ServiceBinding,\n): K8sResourceCondition | null => {\n const conditions = serviceBinding?.status?.conditions || [];\n const firstError = conditions.find(\n (condition) =>\n expectedConditionTypes.includes(condition.type) &&\n condition.status !== expectedConditionStatus,\n );\n return firstError || null;\n};\n\nexport const getBrandingDetails = () => {\n let productName;\n switch (window.SERVER_FLAGS.branding) {\n case 'openshift':\n productName = 'Red Hat OpenShift';\n break;\n case 'ocp':\n productName = 'Red Hat OpenShift';\n break;\n case 'online':\n productName = 'Red Hat OpenShift Online';\n break;\n case 'dedicated':\n productName = 'Red Hat OpenShift Dedicated';\n break;\n case 'azure':\n productName = 'Azure Red Hat OpenShift';\n break;\n case 'rosa':\n productName = 'Red Hat OpenShift Service on AWS';\n break;\n default:\n productName = 'OKD';\n }\n if (window.SERVER_FLAGS.customProductName) {\n productName = window.SERVER_FLAGS.customProductName;\n }\n return { productName };\n};\n","export * from './GettingStartedGrid';\nexport * from './GettingStartedCard';\nexport * from './RestoreGettingStartedButton';\nexport * from './QuickStartGettingStartedCard';\nexport * from './useGettingStartedShowState';\nexport * from './GettingStartedExpandableGrid';\n","import * as React from 'react';\nimport { KeyTypes, MenuItem, Tooltip } from '@patternfly/react-core';\nimport { DropdownItemProps as DropdownItemPropsDeprecated } from '@patternfly/react-core/deprecated';\nimport * as classNames from 'classnames';\nimport * as _ from 'lodash';\nimport { connect } from 'react-redux';\nimport { Action, ImpersonateKind, impersonateStateToProps } from '@console/dynamic-plugin-sdk';\nimport { useAccessReview, history } from '@console/internal/components/utils';\n\nexport type ActionMenuItemProps = {\n action: Action;\n component?: React.ComponentType<DropdownItemPropsDeprecated>;\n autoFocus?: boolean;\n onClick?: () => void;\n onEscape?: () => void;\n};\n\nconst ActionItem: React.FC<ActionMenuItemProps & { isAllowed: boolean }> = ({\n action,\n onClick,\n onEscape,\n autoFocus,\n isAllowed,\n component,\n}) => {\n const { label, icon, disabled, cta } = action;\n const { href, external } = cta as { href: string; external?: boolean };\n const isDisabled = !isAllowed || disabled;\n const classes = classNames({ 'pf-m-disabled': isDisabled });\n\n const handleClick = React.useCallback(\n (event) => {\n event.preventDefault();\n if (_.isFunction(cta)) {\n cta();\n } else if (_.isObject(cta)) {\n if (!cta.external) {\n history.push(cta.href);\n }\n }\n onClick && onClick();\n event.stopPropagation();\n },\n [cta, onClick],\n );\n\n const handleKeyDown = (event) => {\n if (event.keyCode === KeyTypes.Escape) {\n onEscape && onEscape();\n }\n\n if (event.keyCode === KeyTypes.Enter) {\n handleClick(event);\n }\n };\n const Component = component ?? MenuItem;\n\n const props = {\n icon,\n autoFocus,\n isDisabled,\n className: classes,\n onClick: handleClick,\n 'data-test-action': label,\n translate: 'no',\n };\n\n const extraProps = {\n onKeyDown: handleKeyDown,\n ...(external ? { to: href, isExternalLink: external } : {}),\n };\n\n return (\n <Component {...props} {...(component ? {} : extraProps)}>\n {label}\n </Component>\n );\n};\n\nconst AccessReviewActionItem = connect(impersonateStateToProps)(\n (props: ActionMenuItemProps & { impersonate: ImpersonateKind }) => {\n const { action, impersonate } = props;\n const isAllowed = useAccessReview(action.accessReview, impersonate);\n return <ActionItem {...props} isAllowed={isAllowed} />;\n },\n);\n\nconst ActionMenuItem: React.FC<ActionMenuItemProps> = (props) => {\n const { action } = props;\n let item;\n\n if (action.accessReview) {\n item = <AccessReviewActionItem {...props} />;\n } else {\n item = <ActionItem {...props} isAllowed />;\n }\n\n return action.tooltip ? (\n <Tooltip position=\"left\" content={action.tooltip}>\n {item}\n </Tooltip>\n ) : action.disabled && action.disabledTooltip ? (\n <Tooltip position=\"left\" content={action.disabledTooltip}>\n <div>{item}</div>\n </Tooltip>\n ) : (\n item\n );\n};\n\nexport default ActionMenuItem;\n","import * as React from 'react';\nimport {\n BanIcon,\n ClipboardListIcon,\n HourglassHalfIcon,\n HourglassStartIcon,\n NotStartedIcon,\n SyncAltIcon,\n UnknownIcon,\n} from '@patternfly/react-icons';\nimport { StatusComponentProps } from '../../../extensions/console-types';\nimport { DASH } from '../../constants';\nimport { YellowExclamationTriangleIcon } from './icons';\nimport { ErrorStatus, InfoStatus, ProgressStatus, SuccessStatus } from './statuses';\nimport StatusIconAndText from './StatusIconAndText';\n\nexport type StatusProps = StatusComponentProps & {\n status: string;\n children?: React.ReactNode;\n};\n\n/**\n * Component for displaying a status message\n * @param {string} status - type of status to be displayed\n * @param {string} [title] - (optional) status text\n * @param {boolean} [iconOnly] - (optional) if true, only displays icon\n * @param {boolean} [noTooltip] - (optional) if true, tooltip won't be displayed\n * @param {string} [className] - (optional) additional class name for the component\n * @param {string} [popoverTitle] - (optional) title for popover\n * @param {ReactNode} [children] - (optional) children for the component\n * @example\n * ```tsx\n * <Status status='Warning' />\n * ```\n */\nconst Status: React.FC<StatusProps> = ({\n status,\n title,\n children,\n iconOnly,\n noTooltip,\n className,\n}) => {\n const statusProps = { title: title || status, iconOnly, noTooltip, className };\n switch (status) {\n case 'New':\n return <StatusIconAndText {...statusProps} icon={<HourglassStartIcon />} />;\n\n case 'Pending':\n return <StatusIconAndText {...statusProps} icon={<HourglassHalfIcon />} />;\n\n case 'Planning':\n return <StatusIconAndText {...statusProps} icon={<ClipboardListIcon />} />;\n\n case 'ContainerCreating':\n case 'UpgradePending':\n case 'PendingUpgrade':\n case 'PendingRollback':\n return <ProgressStatus {...statusProps} />;\n\n case 'In Progress':\n case 'Installing':\n case 'InstallReady':\n case 'Replacing':\n case 'Running':\n case 'Updating':\n case 'Upgrading':\n case 'PendingInstall':\n return <StatusIconAndText {...statusProps} icon={<SyncAltIcon />} />;\n\n case 'Cancelled':\n case 'Deleting':\n case 'Expired':\n case 'Not Ready':\n case 'Cancelling':\n case 'Terminating':\n case 'Superseded':\n case 'Uninstalling':\n return <StatusIconAndText {...statusProps} icon={<BanIcon />} />;\n\n case 'Warning':\n case 'RequiresApproval':\n return <StatusIconAndText {...statusProps} icon={<YellowExclamationTriangleIcon />} />;\n\n case 'ContainerCannotRun':\n case 'CrashLoopBackOff':\n case 'Critical':\n case 'ErrImagePull':\n case 'Error':\n case 'Failed':\n case 'Failure':\n case 'ImagePullBackOff':\n case 'InstallCheckFailed':\n case 'Lost':\n case 'Rejected':\n case 'UpgradeFailed':\n return <ErrorStatus {...statusProps}>{children}</ErrorStatus>;\n\n case 'Accepted':\n case 'Active':\n case 'Bound':\n case 'Complete':\n case 'Completed':\n case 'Created':\n case 'Enabled':\n case 'Succeeded':\n case 'Ready':\n case 'Up to date':\n case 'Loaded':\n case 'Provisioned as node':\n case 'Preferred':\n case 'Connected':\n case 'Deployed':\n return <SuccessStatus {...statusProps} />;\n\n case 'Info':\n return <InfoStatus {...statusProps}>{children}</InfoStatus>;\n\n case 'Unknown':\n return <StatusIconAndText {...statusProps} icon={<UnknownIcon />} />;\n\n case 'PipelineNotStarted':\n return <StatusIconAndText {...statusProps} icon={<NotStartedIcon />} />;\n\n default:\n return status ? <StatusIconAndText {...statusProps} /> : <>{DASH}</>;\n }\n};\n\nexport default Status;\n","export { default as ToastContext } from './ToastContext';\nexport { default as ToastProvider } from './ToastProvider';\nexport { default as useToast } from './useToast';\n","/* eslint-disable tsdoc/syntax */\nimport * as _ from 'lodash-es';\nimport * as React from 'react';\nimport * as PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { Map as ImmutableMap } from 'immutable';\n\nimport { inject } from './inject';\nimport { makeReduxID, makeQuery } from './k8s-watcher';\nimport * as k8sActions from '../../actions/k8s';\n\nimport {\n INTERNAL_REDUX_IMMUTABLE_TOARRAY_CACHE_SYMBOL,\n INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL,\n} from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/k8s-watcher';\nimport { getK8sModel } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sModel';\n\nconst shallowMapEquals = (a, b) => {\n if (a === b || (a.size === 0 && b.size === 0)) {\n return true;\n }\n if (a.size !== b.size) {\n return false;\n }\n return a.every((v, k) => b.get(k) === v);\n};\n\nexport const processReduxId = ({ k8s }, props) => {\n const { reduxID, isList, filters } = props;\n\n if (!reduxID) {\n return {};\n }\n\n if (!isList) {\n let stuff = k8s.get(reduxID);\n if (!stuff) {\n return {};\n }\n if (!stuff[INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL]) {\n stuff[INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL] = stuff.toJSON();\n }\n stuff = stuff[INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL];\n return { ...stuff, optional: props.optional };\n }\n\n let data = k8s.getIn([reduxID, 'data']);\n const _filters = k8s.getIn([reduxID, 'filters']);\n const selected = k8s.getIn([reduxID, 'selected']);\n\n if (data && data.toArray) {\n if (!data[INTERNAL_REDUX_IMMUTABLE_TOARRAY_CACHE_SYMBOL]) {\n data[INTERNAL_REDUX_IMMUTABLE_TOARRAY_CACHE_SYMBOL] = data.toArray().map((a) => {\n if (a.toJSON) {\n if (!a[INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL]) {\n a[INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL] = a.toJSON();\n }\n return a[INTERNAL_REDUX_IMMUTABLE_TOJSON_CACHE_SYMBOL];\n }\n return a;\n });\n }\n data = data[INTERNAL_REDUX_IMMUTABLE_TOARRAY_CACHE_SYMBOL];\n }\n\n return {\n data,\n // This is a hack to allow filters passed down from props to make it to\n // the injected component. Ideally filters should all come from redux.\n filters: _.extend({}, _filters && _filters.toJS(), filters),\n kind: props.kind,\n loadError: k8s.getIn([reduxID, 'loadError']),\n loaded: k8s.getIn([reduxID, 'loaded']),\n optional: props.optional,\n selected,\n };\n};\n\nconst worstError = (errors) => {\n let worst = errors && errors[0];\n for (const e of errors) {\n if (e.status === 403) {\n return e;\n }\n if (e.status === 401) {\n worst = e;\n continue;\n }\n if (worst.status === 401) {\n continue;\n }\n if (e.status > worst.status) {\n worst = e;\n continue;\n }\n }\n return worst;\n};\n\nconst mapStateToProps = ({ k8s }) => ({\n k8s,\n});\n\nconst propsAreEqual = (prevProps, nextProps) => {\n if (nextProps.children === prevProps.children && nextProps.reduxes === prevProps.reduxes) {\n return nextProps.reduxes.every(\n ({ reduxID }) => prevProps.k8s.get(reduxID) === nextProps.k8s.get(reduxID),\n );\n }\n return false;\n};\n\n// A wrapper Component that takes data out of redux for a list or object at some reduxID ...\n// passing it to children\nconst ConnectToState = connect(mapStateToProps)(\n React.memo(({ k8s, reduxes, children }) => {\n const resources = {};\n\n reduxes.forEach((redux) => {\n resources[redux.prop] = processReduxId({ k8s }, redux);\n });\n\n const required = _.filter(resources, (r) => !r.optional);\n const loaded = _.every(resources, (resource) =>\n resource.optional ? resource.loaded || !_.isEmpty(resource.loadError) : resource.loaded,\n );\n const loadError = worstError(_.map(required, 'loadError').filter(Boolean));\n\n const k8sResults = Object.assign({}, resources, {\n filters: Object.assign({}, ..._.map(resources, 'filters')),\n loaded,\n loadError,\n reduxIDs: _.map(reduxes, 'reduxID'),\n resources,\n });\n\n return inject(children, k8sResults);\n }, propsAreEqual),\n);\n\nconst stateToProps = (state, { resources }) => {\n const { k8s } = state;\n const k8sModels = resources.reduce(\n (models, { kind }) => models.set(kind, getK8sModel(k8s, kind)),\n ImmutableMap(),\n );\n const loaded = (r) =>\n r.optional ||\n k8s.getIn([\n makeReduxID(\n k8sModels.get(r.kind),\n makeQuery(r.namespace, r.selector, r.fieldSelector, r.name),\n ),\n 'loaded',\n ]);\n\n return {\n k8sModels,\n loaded: resources.every(loaded),\n inFlight: k8s.getIn(['RESOURCES', 'inFlight']),\n };\n};\n\nexport const Firehose = connect(\n stateToProps,\n {\n stopK8sWatch: k8sActions.stopK8sWatch,\n watchK8sObject: k8sActions.watchK8sObject,\n watchK8sList: k8sActions.watchK8sList,\n },\n null,\n {\n areStatesEqual: (next, prev) => next.k8s === prev.k8s,\n areStatePropsEqual: (next, prev) =>\n next.loaded === prev.loaded &&\n next.inFlight === prev.inFlight &&\n shallowMapEquals(next.k8sModels, prev.k8sModels),\n },\n)(\n /** @augments {React.Component<{k8sModels?: Map<string, K8sKind>, doNotConnectToState?: boolean}>} */\n class Firehose extends React.Component {\n state = {\n firehoses: [],\n };\n\n // TODO: Convert this to `componentDidMount`\n // eslint-disable-next-line camelcase\n UNSAFE_componentWillMount() {\n this.start();\n }\n\n componentWillUnmount() {\n this.clear();\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n if (\n Object.keys(nextProps).length === Object.keys(this.props).length &&\n Object.keys(nextProps)\n .filter((key) => key !== 'inFlight')\n .every((key) => nextProps[key] === this.props[key]) &&\n (nextState === this.state ||\n (nextState.firehoses.length === 0 && this.state.firehoses.length === 0))\n ) {\n return this.props.loaded ? false : this.props.inFlight !== nextProps.inFlight;\n }\n return true;\n }\n\n componentDidUpdate(prevProps) {\n const discoveryComplete =\n !this.props.inFlight && !this.props.loaded && this.state.firehoses.length === 0;\n const resourcesChanged =\n prevProps.resources !== this.props.resources &&\n _.intersectionWith(prevProps.resources, this.props.resources, _.isEqual).length !==\n this.props.resources.length;\n\n if (discoveryComplete || resourcesChanged) {\n this.clear();\n this.start();\n }\n }\n\n start() {\n const { watchK8sList, watchK8sObject, resources, k8sModels, inFlight } = this.props;\n\n let firehoses = [];\n if (!(inFlight && _.some(resources, ({ kind }) => !k8sModels.get(kind)))) {\n firehoses = resources\n .map((resource) => {\n const query = makeQuery(\n resource.namespace,\n resource.selector,\n resource.fieldSelector,\n resource.name,\n resource.limit,\n );\n const k8sKind = k8sModels.get(resource.kind);\n const id = makeReduxID(k8sKind, query);\n return _.extend({}, resource, { query, id, k8sKind });\n })\n .filter((f) => {\n if (_.isEmpty(f.k8sKind)) {\n // eslint-disable-next-line no-console\n console.warn(`No model registered for ${f.kind}`);\n }\n return !_.isEmpty(f.k8sKind);\n });\n }\n\n firehoses.forEach(({ id, query, k8sKind, isList, name, namespace, partialMetadata }) =>\n isList\n ? watchK8sList(id, query, k8sKind, null, partialMetadata)\n : watchK8sObject(id, name, namespace, query, k8sKind, partialMetadata),\n );\n this.setState({ firehoses });\n }\n\n clear() {\n this.state.firehoses.forEach(({ id }) => this.props.stopK8sWatch(id));\n }\n\n render() {\n if (this.props.loaded || this.state.firehoses.length > 0) {\n const children = inject(this.props.children, _.omit(this.props, ['children', 'resources']));\n\n if (this.props.doNotConnectToState) {\n return children;\n }\n\n const reduxes = this.state.firehoses.map(\n ({ id, prop, isList, filters, optional, kind }) => ({\n reduxID: id,\n prop,\n isList,\n filters,\n optional,\n kind,\n }),\n );\n return <ConnectToState reduxes={reduxes}>{children}</ConnectToState>;\n }\n return null;\n }\n },\n);\nFirehose.WrappedComponent.contextTypes = {\n router: PropTypes.object,\n};\n\nFirehose.contextTypes = {\n store: PropTypes.object,\n};\n\nFirehose.propTypes = {\n children: PropTypes.node,\n expand: PropTypes.bool,\n doNotConnectToState: PropTypes.bool,\n resources: PropTypes.arrayOf(\n PropTypes.shape({\n kind: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired,\n name: PropTypes.string,\n namespace: PropTypes.string,\n selector: PropTypes.object,\n fieldSelector: PropTypes.string,\n isList: PropTypes.bool,\n optional: PropTypes.bool, // do not block children-rendering while resource is still being loaded; do not fail if resource is missing (404)\n limit: PropTypes.number,\n partialMetadata: PropTypes.bool,\n }),\n ).isRequired,\n};\n","import * as React from 'react';\nimport { Base64 } from 'js-base64';\nimport { saveAs } from 'file-saver';\nimport { EyeIcon } from '@patternfly/react-icons/dist/esm/icons/eye-icon';\nimport { EyeSlashIcon } from '@patternfly/react-icons/dist/esm/icons/eye-slash-icon';\nimport { Button } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { CopyToClipboard, EmptyBox, SectionHeading } from './utils';\nimport { containsNonPrintableCharacters } from './utils/file-input';\n\nexport const MaskedData: React.FC<{}> = () => {\n const { t } = useTranslation();\n return (\n <>\n <span className=\"pf-v5-u-screen-reader\">{t('public~Value hidden')}</span>\n <span aria-hidden=\"true\">•••••</span>\n </>\n );\n};\n\nconst downloadBinary = (key, value) => {\n const rawBinary = window.atob(value);\n const rawBinaryLength = rawBinary.length;\n const array = new Uint8Array(new ArrayBuffer(rawBinaryLength));\n for (let i = 0; i < rawBinaryLength; i++) {\n array[i] = rawBinary.charCodeAt(i);\n }\n const blob = new Blob([array], { type: 'data:application/octet-stream;' });\n saveAs(blob, key);\n};\n\nconst DownloadBinaryButton: React.FC<DownloadBinaryButtonProps> = ({ label, value }) => {\n const { t } = useTranslation();\n return (\n <Button\n className=\"pf-m-link--align-left\"\n type=\"button\"\n onClick={() => downloadBinary(label, value)}\n variant=\"link\"\n >\n {t('public~Save file')}\n </Button>\n );\n};\nDownloadBinaryButton.displayName = 'DownloadBinaryButton';\n\nexport const ConfigMapBinaryData: React.FC<DownloadValueProps> = ({ data }) => {\n const dl = [];\n const { t } = useTranslation();\n Object.keys(data || {})\n .sort()\n .forEach((k) => {\n const value = data[k];\n dl.push(\n <dt i18n-not-translated=\"true\" key={`${k}-k`}>\n {k}\n </dt>,\n );\n dl.push(\n <dd key={`${k}-v`}>\n <DownloadBinaryButton label={k} value={value} />\n </dd>,\n );\n });\n return dl.length ? <dl>{dl}</dl> : <EmptyBox label={t('public~binary data')} />;\n};\nConfigMapBinaryData.displayName = 'ConfigMapBinaryData';\n\nexport const ConfigMapData: React.FC<ConfigMapDataProps> = ({ data, label }) => {\n const dl = [];\n Object.keys(data || {})\n .sort()\n .forEach((k) => {\n const value = data[k];\n dl.push(\n <dt i18n-not-translated=\"true\" key={`${k}-k`}>\n {k}\n </dt>,\n );\n dl.push(\n <dd key={`${k}-v`}>\n <CopyToClipboard value={value} />\n </dd>,\n );\n });\n return dl.length ? <dl>{dl}</dl> : <EmptyBox label={label} />;\n};\nConfigMapData.displayName = 'ConfigMapData';\n\nexport const SecretValue: React.FC<SecretValueProps> = ({ value, reveal, encoded = true }) => {\n const { t } = useTranslation();\n if (!value) {\n return <span className=\"text-muted\">{t('public~No value')}</span>;\n }\n\n const decodedValue = encoded ? Base64.decode(value) : value;\n const visibleValue = reveal ? decodedValue : <MaskedData />;\n return <CopyToClipboard value={decodedValue} visibleValue={visibleValue} />;\n};\nSecretValue.displayName = 'SecretValue';\n\nexport const SecretData: React.FC<SecretDataProps> = ({ data, title }) => {\n const [reveal, setReveal] = React.useState(false);\n const { t } = useTranslation();\n const titleI18n = title || t('public~Data');\n const dl = [];\n Object.keys(data || {})\n .sort()\n .forEach((k) => {\n dl.push(\n <dt i18n-not-translated=\"true\" key={`${k}-k`} data-test=\"secret-data-term\">\n {k}\n </dt>,\n );\n dl.push(\n <dd key={`${k}-v`}>\n {containsNonPrintableCharacters(Base64.decode(data[k])) ? (\n <DownloadBinaryButton label={k} value={data[k]} />\n ) : (\n <SecretValue value={data[k]} reveal={reveal} />\n )}\n </dd>,\n );\n });\n\n return (\n <>\n <SectionHeading text={titleI18n}>\n {dl.length ? (\n <Button\n type=\"button\"\n onClick={() => setReveal(!reveal)}\n variant=\"link\"\n className=\"pf-m-link--align-right\"\n data-test=\"reveal-values\"\n >\n {reveal ? (\n <>\n <EyeSlashIcon className=\"co-icon-space-r\" />\n {t('public~Hide values')}\n </>\n ) : (\n <>\n <EyeIcon className=\"co-icon-space-r\" />\n {t('public~Reveal values')}\n </>\n )}\n </Button>\n ) : null}\n </SectionHeading>\n {dl.length ? <dl data-test=\"secret-data\">{dl}</dl> : <EmptyBox label={t('public~Data')} />}\n </>\n );\n};\nSecretData.displayName = 'SecretData';\n\ntype KeyValueData = {\n [key: string]: string;\n};\n\ntype DownloadBinaryButtonProps = {\n value: string;\n label: string;\n};\n\ntype ConfigMapDataProps = {\n data: KeyValueData;\n label: string;\n};\n\ntype DownloadValueProps = {\n data: KeyValueData;\n};\n\ntype SecretValueProps = {\n value: string;\n encoded?: boolean;\n reveal: boolean;\n};\n\ntype SecretDataProps = {\n data: KeyValueData;\n title?: string;\n};\n","/* eslint-disable tsdoc/syntax */\nimport * as React from 'react';\nimport * as classNames from 'classnames';\nimport { Button, Divider, Flex, FlexItem, ToggleGroup } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\n\nexport const CheckBox = ({ title, active, number, toggle }) => {\n const klass = classNames('pf-v5-c-toggle-group__button', {\n 'pf-m-selected co-row-filter__box--active': active,\n 'pf-m-disabled': !number,\n });\n\n return (\n <div className=\"pf-v5-c-toggle-group__item\">\n <a href=\"#\" onClick={toggle} className={klass}>\n <span\n className={classNames('co-row-filter__number-bubble', {\n 'co-row-filter__number-bubble--active': active,\n })}\n >\n {number}\n </span>\n {title}\n </a>\n </div>\n );\n};\n\nexport const CheckBoxControls = ({\n allSelected,\n itemCount,\n selectedCount,\n onSelectAll,\n children,\n}) => {\n const { t } = useTranslation();\n return (\n <Flex className=\"co-row-filter\" direction={{ default: 'column', md: 'row' }}>\n <ToggleGroup>{children}</ToggleGroup>\n <Divider className=\"pf-v5-u-hidden-on-md\" />\n <Flex flex={{ default: 'flex_1' }}>\n <FlexItem>\n <Button\n disabled={allSelected}\n type=\"button\"\n onClick={onSelectAll}\n variant=\"link\"\n isInline\n >\n {t('public~Select all filters')}\n </Button>\n </FlexItem>\n <FlexItem align={{ default: 'alignRight' }} className=\"co-row-filter__items\">\n {itemCount === selectedCount ? (\n itemCount\n ) : (\n <>{t('public~{{selectedCount}} of {{itemCount}}', { selectedCount, itemCount })}</>\n )}{' '}\n {t('public~Item', { count: itemCount })}\n </FlexItem>\n </Flex>\n </Flex>\n );\n};\n\nexport const storagePrefix = 'rowFilter-';\n","import * as React from 'react';\nimport {\n isPerspective,\n Perspective as PerspectiveExtension,\n PerspectiveType,\n AccessReviewResourceAttributes,\n checkAccess,\n} from '@console/dynamic-plugin-sdk';\nimport { LoadedExtension, useExtensions } from '@console/plugin-sdk/src';\nimport { USERSETTINGS_PREFIX } from '../constants';\n\nconst PERSPECTIVE_VISITED_FEATURE_KEY = 'perspective.visited';\n\nexport enum PerspectiveVisibilityState {\n Enabled = 'Enabled',\n Disabled = 'Disabled',\n AccessReview = 'AccessReview',\n}\n\ntype PerspectiveAccessReview = {\n required?: AccessReviewResourceAttributes[];\n missing?: AccessReviewResourceAttributes[];\n};\n\nexport type PerspectiveVisibility = {\n state: PerspectiveVisibilityState;\n accessReview?: PerspectiveAccessReview;\n};\n\nexport type PerspectivePinnedResource = {\n group: string;\n version: string;\n resource: string;\n};\nexport type Perspective = {\n id: string;\n visibility: PerspectiveVisibility;\n pinnedResources?: PerspectivePinnedResource[];\n};\n\nexport const getPerspectiveVisitedKey = (perspective: PerspectiveType): string =>\n `${USERSETTINGS_PREFIX}.${PERSPECTIVE_VISITED_FEATURE_KEY}.${perspective}`;\n\nexport const hasReviewAccess = async (accessReview: PerspectiveAccessReview) => {\n let hasAccess: boolean = true;\n const requiredAccessReview = accessReview?.required;\n const missingAccessReview = accessReview?.missing;\n const requiredPromises =\n requiredAccessReview?.length > 0 &&\n requiredAccessReview.map((resourceAttributes) => checkAccess(resourceAttributes));\n const missingPromises =\n missingAccessReview?.length &&\n missingAccessReview?.map((resourceAttributes) => checkAccess(resourceAttributes));\n\n requiredPromises?.length > 0 &&\n (await Promise.all(requiredPromises)\n .then((values) => {\n // enable the perspective if all the access review checks are successful\n hasAccess = hasAccess && values.every((val) => val?.status.allowed);\n })\n .catch((e) => {\n // eslint-disable-next-line no-console\n console.warn('AccessReview check failed', e);\n hasAccess = false;\n }));\n\n missingPromises?.length > 0 &&\n (await Promise.all(missingPromises)\n .then((values) => {\n // enable perspective if atleast one access review check fails\n hasAccess = hasAccess && !values.every((val) => val?.status.allowed);\n })\n .catch((e) => {\n // no update when a missing check fails\n // eslint-disable-next-line no-console\n console.warn('AccessReview check failed', e);\n }));\n\n return hasAccess;\n};\n\nexport const usePerspectives = (): LoadedExtension<PerspectiveExtension>[] => {\n const perspectiveExtensions = useExtensions<PerspectiveExtension>(isPerspective);\n const [results, setResults] = React.useState<Record<string, boolean>>(() => {\n let obj: Record<string, boolean> = {};\n if (!window.SERVER_FLAGS.perspectives) {\n obj = perspectiveExtensions.reduce(\n (acc: Record<string, boolean>, ex: LoadedExtension<PerspectiveExtension>) => {\n acc[ex.properties.id] = true;\n return acc;\n },\n {},\n );\n } else {\n const perspectives: Perspective[] = JSON.parse(window.SERVER_FLAGS.perspectives);\n obj = perspectiveExtensions.reduce((acc, perspectiveExtension) => {\n const perspective = perspectives?.find((p) => p.id === perspectiveExtension.properties.id);\n\n if (\n !perspective?.visibility?.state ||\n perspective.visibility.state === PerspectiveVisibilityState.Enabled\n ) {\n acc[perspectiveExtension.properties.id] = true;\n } else if (perspective?.visibility?.state === PerspectiveVisibilityState.Disabled) {\n acc[perspectiveExtension.properties.id] = false;\n }\n return acc;\n }, {});\n }\n return obj;\n });\n\n const handleResults = React.useCallback(\n (id: string, newState: boolean) => {\n setResults((oldResults: Record<string, boolean>) => {\n if (oldResults[id] === newState) {\n return oldResults;\n }\n return {\n ...oldResults,\n [id]: newState,\n };\n });\n },\n [setResults],\n );\n React.useEffect(() => {\n if (window.SERVER_FLAGS.perspectives) {\n const perspectives: Perspective[] = JSON.parse(window.SERVER_FLAGS.perspectives);\n perspectiveExtensions.forEach((perspectiveExtension) => {\n const perspective = perspectives?.find((p) => p.id === perspectiveExtension.properties.id);\n\n if (\n !perspective ||\n !perspective.visibility ||\n perspective.visibility.state === PerspectiveVisibilityState.Enabled\n ) {\n handleResults(perspectiveExtension.properties.id, true);\n } else if (perspective.visibility.state === PerspectiveVisibilityState.Disabled) {\n handleResults(perspectiveExtension.properties.id, false);\n } else if (\n perspective?.visibility?.state === PerspectiveVisibilityState.AccessReview &&\n perspective?.visibility?.accessReview &&\n Object.keys(perspective?.visibility?.accessReview)?.length > 0\n ) {\n hasReviewAccess(perspective?.visibility?.accessReview)\n .then((res) => {\n handleResults(perspectiveExtension.properties.id, res);\n })\n .catch((e) => {\n handleResults(perspectiveExtension.properties.id, true);\n // eslint-disable-next-line no-console\n console.warn('Could not check access', e);\n });\n }\n });\n }\n }, [perspectiveExtensions, handleResults]);\n const perspectives = React.useMemo(() => {\n if (!window.SERVER_FLAGS.perspectives) {\n return perspectiveExtensions;\n }\n\n const filteredExtensions = perspectiveExtensions.filter((e) => results[e.properties.id]);\n\n return filteredExtensions.length === 0 &&\n Object.keys(results).length === perspectiveExtensions.length\n ? perspectiveExtensions.filter((p) => p.properties.id === 'admin')\n : filteredExtensions;\n }, [perspectiveExtensions, results]);\n return perspectives;\n};\n\nexport const usePerspectiveExtension = (id: string): LoadedExtension<PerspectiveExtension> => {\n const perspectiveExtensions = usePerspectives();\n return React.useMemo(() => perspectiveExtensions.find((e) => e.properties.id === id), [\n id,\n perspectiveExtensions,\n ]);\n};\n","import * as _ from 'lodash';\nimport i18n from '@console/internal/i18n';\nimport { getName } from '@console/shared/src/selectors/common';\nimport { operatorNamespaceFor } from '../components/operator-group';\nimport {\n ClusterServiceVersionKind,\n SubscriptionKind,\n SubscriptionState,\n ClusterServiceVersionPhase,\n ClusterServiceVersionStatus,\n} from '../types';\nimport { upgradeRequiresApproval } from '../utils';\n\nconst pendingPhases = [\n ClusterServiceVersionPhase.CSVPhasePending,\n ClusterServiceVersionPhase.CSVPhaseInstalling,\n ClusterServiceVersionPhase.CSVPhaseReplacing,\n ClusterServiceVersionPhase.CSVPhaseDeleting,\n];\n\nexport const subscriptionForCSV = (\n subscriptions: SubscriptionKind[],\n csv: ClusterServiceVersionKind,\n): SubscriptionKind =>\n // TODO Replace _.find with Array.prototype.find\n _.find<SubscriptionKind>(subscriptions, {\n metadata: {\n namespace: operatorNamespaceFor(csv),\n },\n status: {\n installedCSV: getName(csv),\n },\n });\n\nexport const getCSVStatus = (\n csv: ClusterServiceVersionKind,\n): { status: ClusterServiceVersionStatus; title: string } => {\n const statusPhase = csv?.status?.phase ?? ClusterServiceVersionPhase.CSVPhaseUnknown;\n // TODO Get rid of let.\n let status: ClusterServiceVersionStatus;\n if (pendingPhases.includes(statusPhase)) {\n status = i18n.t('olm~Pending');\n } else {\n switch (statusPhase) {\n case ClusterServiceVersionPhase.CSVPhaseSucceeded:\n status = i18n.t('olm~OK');\n break;\n case ClusterServiceVersionPhase.CSVPhaseFailed:\n status = i18n.t('olm~Failed');\n break;\n default:\n return {\n status: i18n.t('olm~Unknown'),\n title: statusPhase,\n };\n }\n }\n return {\n status,\n title: statusPhase,\n };\n};\n\nexport const getSubscriptionStatus = (subscription: SubscriptionKind): SubscriptionStatus => {\n const status = subscription?.status?.state ?? SubscriptionState.SubscriptionStateNone;\n switch (status) {\n case SubscriptionState.SubscriptionStateUpgradeAvailable:\n return {\n status,\n title: i18n.t('olm~Upgrade available'),\n };\n case SubscriptionState.SubscriptionStateUpgradePending:\n return upgradeRequiresApproval(subscription)\n ? {\n status: SubscriptionState.SubscriptionStateUpgradeAvailable,\n title: i18n.t('olm~Upgrade available'),\n }\n : {\n status,\n title: i18n.t('olm~Upgrading'),\n };\n case SubscriptionState.SubscriptionStateAtLatest:\n return {\n status,\n title: i18n.t('olm~Up to date'),\n };\n default:\n return {\n status,\n title: '',\n };\n }\n};\n\ntype SubscriptionStatus = { status: SubscriptionState; title?: string };\n","import * as React from 'react';\n\n/**\n * React hook that forces component render.\n */\nexport const useForceRender = () => React.useReducer((s: boolean) => !s, false)[1] as VoidFunction;\n","export { default as CamelCaseWrap } from './utils/camel-case-wrap';\nexport { default as GenericStatus } from './status/GenericStatus';\nexport { default as ListPageBody } from './factory/ListPage/ListPageBody';\nexport { default as PopoverStatus } from './status/PopoverStatus';\nexport { default as StatusComponent } from './status/Status';\nexport { default as StatusIconAndText } from './status/StatusIconAndText';\nexport { default as ResourceStatus } from './utils/resource-status';\n\nexport * from './status/icons';\nexport * from './status/statuses';\nexport { checkAccess, useAccessReviewAllowed, useAccessReview } from './utils/rbac';\nexport { useSafetyFirst } from './safety-first';\n","import * as React from 'react';\nimport { Badge } from '@patternfly/react-core';\nimport * as classNames from 'classnames';\nimport './resource-status.scss';\n\ntype ResourceStatusProps = {\n additionalClassNames?: string;\n badgeAlt?: boolean;\n children: React.ReactNode;\n};\n\n/**\n * Component for displaying resource status badge.\n * Use this component to display status of given resource.\n * It accepts child element to be rendered inside the badge.\n * @component ResourceStatus\n * @example\n * ```ts\n * return (\n * <ResourceStatus additionalClassNames=\"hidden-xs\">\n * <Status status={resourceStatus} />\n * </ResourceStatus>\n * )\n * ```\n */\nconst ResourceStatus: React.FC<ResourceStatusProps> = ({\n additionalClassNames,\n badgeAlt,\n children,\n}) => {\n return (\n <span className={classNames('dps-resource-item__resource-status', additionalClassNames)}>\n <Badge\n className={classNames('dps-resource-item__resource-status-badge', {\n 'dps-resource-item__resource-status-badge--alt': badgeAlt,\n })}\n isRead\n data-test=\"resource-status\"\n >\n {children}\n </Badge>\n </span>\n );\n};\n\nexport default ResourceStatus;\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport {\n AccessReviewResourceAttributes,\n K8sVerb,\n SelfSubjectAccessReviewKind,\n} from '../../../extensions/console-types';\nimport { ProjectModel, SelfSubjectAccessReviewModel } from '../../../models';\nimport { k8sCreate } from '../../../utils/k8s/k8s-resource';\nimport { getImpersonate } from '../../core/reducers/coreSelectors';\nimport { ImpersonateKind } from '../../redux-types';\nimport storeHandler from '../../storeHandler';\nimport { useSafetyFirst } from '../safety-first';\n\n/**\n * It provides impersonation key based on data from the redux store.\n */\nconst getImpersonateKey = (impersonate?: ImpersonateKind): string => {\n const newImpersonate = impersonate || getImpersonate(storeHandler.getStore().getState());\n return newImpersonate ? `${newImpersonate.kind}~${newImpersonate.name}` : '';\n};\n\n/**\n * Memoizes the result so it is possible to only make the request once for each access review.\n * This does mean that the user will have to refresh the page to see updates.\n * Function takes in the destructured resource attributes so that the cache keys are stable.\n * `JSON.stringify` is not guaranteed to give the same result for equivalent objects.\n * Impersonate headers are added automatically by `k8sCreate`.\n * @param group resource group.\n * @param resource resource string.\n * @param subresource subresource string.\n * @param verb K8s verb.\n * @param namespace namespace.\n * @param impersonateKey parameter to include in the cache key even though it's not used in the function body.\n * @returns Memoized result of the access review.\n */\nconst checkAccessInternal = _.memoize(\n (\n group: string,\n resource: string,\n subresource: string,\n verb: K8sVerb,\n name: string,\n namespace: string,\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n impersonateKey: string,\n ): Promise<SelfSubjectAccessReviewKind> => {\n // Projects are a special case. `namespace` must be set to the project name\n // even though it's a cluster-scoped resource.\n const reviewNamespace =\n group === ProjectModel.apiGroup && resource === ProjectModel.plural ? name : namespace;\n const ssar: SelfSubjectAccessReviewKind = {\n apiVersion: 'authorization.k8s.io/v1',\n kind: 'SelfSubjectAccessReview',\n spec: {\n resourceAttributes: {\n group,\n resource,\n subresource,\n verb,\n name,\n namespace: reviewNamespace,\n },\n },\n };\n return k8sCreate(SelfSubjectAccessReviewModel, ssar);\n },\n (...args) => args.join('~'),\n);\n\n/**\n * Provides information about user access to a given resource.\n * @param resourceAttributes resource attributes for access review\n * @param impersonate impersonation details\n * @returns Object with resource access information.\n */\nexport const checkAccess = (\n resourceAttributes: AccessReviewResourceAttributes,\n impersonate?: ImpersonateKind,\n): Promise<SelfSubjectAccessReviewKind> => {\n // Destructure the attributes with defaults so we can create a stable cache key.\n const {\n group = '',\n resource = '',\n subresource = '',\n verb = '' as K8sVerb,\n name = '',\n namespace = '',\n } = resourceAttributes || {};\n return checkAccessInternal(\n group,\n resource,\n subresource,\n verb,\n name,\n namespace,\n getImpersonateKey(impersonate),\n );\n};\n\n/**\n * Hook that provides information about user access to a given resource.\n * @param resourceAttributes resource attributes for access review\n * @param impersonate impersonation details\n * @returns Array with `isAllowed` and `loading` values.\n */\nexport const useAccessReview = (\n resourceAttributes: AccessReviewResourceAttributes,\n impersonate?: ImpersonateKind,\n): [boolean, boolean] => {\n const [loading, setLoading] = useSafetyFirst(true);\n const [isAllowed, setAllowed] = useSafetyFirst(false);\n // Destructure the attributes to pass them as dependencies to `useEffect`,\n // which doesn't do deep comparison of object dependencies.\n const {\n group = '',\n resource = '',\n subresource = '',\n verb = '' as K8sVerb,\n name = '',\n namespace = '',\n } = resourceAttributes;\n const impersonateKey = getImpersonateKey(impersonate);\n React.useEffect(() => {\n checkAccessInternal(group, resource, subresource, verb, name, namespace, impersonateKey)\n .then((result: SelfSubjectAccessReviewKind) => {\n setAllowed(result.status.allowed);\n setLoading(false);\n })\n .catch((e) => {\n // eslint-disable-next-line no-console\n console.warn('SelfSubjectAccessReview failed', e);\n // Default to enabling the action if the access review fails so that we\n // don't incorrectly block users from actions they can perform. The server\n // still enforces access control.\n setAllowed(true);\n setLoading(false);\n });\n }, [setLoading, setAllowed, group, resource, subresource, verb, name, namespace, impersonateKey]);\n\n return [isAllowed, loading];\n};\n\n/**\n * @deprecated - Use useAccessReview from \\@console/dynamic-plugin-sdk instead.\n * Hook that provides allowed status about user access to a given resource.\n * @param resourceAttributes resource attributes for access review\n * @param impersonate impersonation details\n * @returns The isAllowed boolean value.\n */\nexport const useAccessReviewAllowed = (\n resourceAttributes: AccessReviewResourceAttributes,\n impersonate?: ImpersonateKind,\n): boolean => {\n return useAccessReview(resourceAttributes, impersonate)[0];\n};\n","/* eslint-disable guard-for-in, default-case, no-case-declarations, tsdoc/syntax */\n\n/**\n * Converted from Angular based \"kubernetes-label-selector\"\n * git://github.com/kubernetes-ui/label-selector.git\n * author: Jessica Forrester <jforrest@redhat.com>\n **/\nimport * as _ from 'lodash-es';\n// selector (optional) - the JSON format as returned by k8s API, will also\n// handle {key: null} as the key exists operator (not currently returned\n// by API)\n// emptySelectsAll (optional) - whether a label selector with no conjuncts\n// selects objects. Typical behavior is false. Example of an\n// exceptional case is when filtering by labels, no label selectors\n// means no filters.\nexport class LabelSelector {\n constructor(selector, emptySelectsAll) {\n this._conjuncts = {};\n this._emptySelectsAll = !!emptySelectsAll;\n // expects the JSON format as returned by k8s API\n // Supports both the old selector syntax of just key: value pairs like on RCs\n // as well as the new matchLabel and matchExpression syntax on newer controllers like ReplicaSets\n // For now it will also handle key: null as key exists for backwards compatibility from before\n // the matchExpression support was added.\n this._OPERATOR_MAP = {\n In: 'in',\n NotIn: 'not in',\n Exists: 'exists',\n DoesNotExist: 'does not exist',\n };\n this._REVERSE_OPERATOR_MAP = {\n in: 'In',\n 'not in': 'NotIn',\n exists: 'Exists',\n 'does not exist': 'DoesNotExist',\n };\n if (selector) {\n if (selector.matchLabels || selector.matchExpressions) {\n _.forEach(\n selector.matchLabels,\n (details, key) => {\n this.addConjunct(key, 'in', [details]);\n },\n this,\n );\n _.forEach(\n selector.matchExpressions,\n (expression) => {\n this.addConjunct(\n expression.key,\n this._OPERATOR_MAP[expression.operator],\n expression.values,\n );\n },\n this,\n );\n } else {\n _.forEach(\n selector,\n (details, key) => {\n if (details || details === '') {\n this.addConjunct(key, 'in', [details]);\n } else {\n this.addConjunct(key, 'exists', []);\n }\n },\n this,\n );\n }\n }\n }\n\n addConjunct(key, operator, values) {\n const conjunct = {\n key,\n operator,\n values,\n };\n const id = this._getIdForConjunct(conjunct);\n this._conjuncts[id] = conjunct;\n conjunct.id = id;\n conjunct.string = this._getStringForConjunct(conjunct);\n return conjunct;\n }\n\n // Can accept either the id of the conjunct to remove, or the conjunct\n // object that was returned from a call to addConjunct\n removeConjunct(conjunct) {\n if (conjunct.id) {\n delete this._conjuncts[conjunct.id];\n } else {\n delete this._conjuncts[conjunct];\n }\n }\n clearConjuncts() {\n this._conjuncts = {};\n }\n isEmpty() {\n return _.isEmpty(this._conjuncts);\n }\n each(fn) {\n _.forEach(this._conjuncts, fn);\n }\n select(resources) {\n // If passed an array, return an array.\n if (_.isArray(resources)) {\n return _.filter(resources, _.bind(this.matches, this));\n }\n // Otherwise handle it as a map.\n return _.pickBy(resources, _.bind(this.matches, this));\n }\n matchesLabels(labels) {\n if (this.isEmpty()) {\n return this._emptySelectsAll;\n }\n for (const id in this._conjuncts) {\n const conjunct = this._conjuncts[id];\n switch (conjunct.operator) {\n case 'exists':\n if (!labels[conjunct.key] && labels[conjunct.key] !== '') {\n return false;\n }\n break;\n case 'does not exist':\n if (labels[conjunct.key] || labels[conjunct.key] === '') {\n return false;\n }\n break;\n case 'in':\n let found = false;\n if (labels[conjunct.key] || labels[conjunct.key] === '') {\n for (let i = 0; !found && i < conjunct.values.length; i++) {\n if (labels[conjunct.key] === conjunct.values[i]) {\n found = true;\n }\n }\n }\n if (!found) {\n return false;\n }\n break;\n case 'not in':\n let keep = true;\n if (labels[conjunct.key]) {\n for (let i = 0; keep && i < conjunct.values.length; i++) {\n keep = labels[conjunct.key] !== conjunct.values[i];\n }\n }\n if (!keep) {\n return false;\n }\n }\n }\n return true;\n }\n matches(resource) {\n if (!resource) {\n return false;\n }\n const labels = resource.metadata?.labels || {};\n return this.matchesLabels(labels);\n }\n hasConjunct(conjunct) {\n return !!this._conjuncts[this._getIdForConjunct(conjunct)];\n }\n findConjunctsMatching(operator, key) {\n return _.pickBy(\n this._conjuncts,\n _.matches({\n operator,\n key,\n }),\n );\n }\n // Test whether this label selector covers the given selector\n covers(selector) {\n if (this.isEmpty()) {\n // TODO don't think we ever want to consider an empty\n // label selector as covering any other label selector\n return false;\n }\n return _.every(this._conjuncts, function (conjunct) {\n // Return true immediately if we find an exact match for operator/key/values\n if (selector.hasConjunct(conjunct)) {\n return true;\n }\n // If we can't find a conjunct that matches exactly, do a more detailed check\n switch (conjunct.operator) {\n case 'exists':\n // If an Exists conjunct existed for the same key in selector it\n // would have passed the exact match, just need to check if an In\n // conjunct exists for the same key\n return !_.isEmpty(selector.findConjunctsMatching('in', conjunct.key));\n case 'does not exist':\n // A DoesNotExist can only cover a DoesNotExist operator, if we got here\n // then we didn't have a DNE with the same key so we know we can't cover\n return false;\n case 'in':\n // In (A,B,C) covers In (A,B) AND In (B,C)\n const inConjuncts = selector.findConjunctsMatching('in', conjunct.key);\n if (_.isEmpty(inConjuncts)) {\n return false;\n }\n return _.every(inConjuncts, function (inConjunct) {\n return (\n inConjunct.values.length === _.intersection(inConjunct.values, conjunct.values).length\n );\n });\n case 'not in':\n // NotIn (A,B) covers NotIn (A,B,C) AND NotIn (A,B,D)\n const notInConjuncts = selector.findConjunctsMatching('not in', conjunct.key);\n if (_.isEmpty(notInConjuncts)) {\n return false;\n }\n return _.every(notInConjuncts, function (notInConjunct) {\n return (\n conjunct.values.length ===\n _.intersection(notInConjunct.values, conjunct.values).length\n );\n });\n }\n return true;\n });\n }\n\n // Exports the labelSelector as a string in the API format, exports as matchExpressions\n exportJSON() {\n const result = {\n matchExpressions: [],\n };\n for (const id in this._conjuncts) {\n const conjunct = this._conjuncts[id];\n const expression = {\n key: conjunct.key,\n operator: this._REVERSE_OPERATOR_MAP[conjunct.operator],\n values: conjunct.values,\n };\n result.matchExpressions.push(expression);\n }\n return JSON.stringify(result);\n }\n\n // We assume label values have no whitespace, commas, parens, etc. based\n // on k8s def for label values\n _getStringForConjunct(conjunct) {\n let conjunctString = conjunct.key;\n if (conjunct.operator === 'exists') {\n return `${conjunctString} exists`;\n } else if (conjunct.operator === 'does not exist') {\n return `${conjunctString} does not exist`;\n }\n if (conjunct.operator === 'not in') {\n conjunctString += ' not';\n }\n conjunctString += ' in (';\n for (let i = 0; i < conjunct.values.length; i++) {\n if (conjunct.values[i] === '') {\n conjunctString += '\"\"';\n } else {\n conjunctString += conjunct.values[i];\n }\n if (i !== conjunct.values.length - 1) {\n conjunctString += ', ';\n }\n }\n conjunctString += ')';\n\n return conjunctString;\n }\n\n _getIdForConjunct(conjunct) {\n let id = `${conjunct.key}-${conjunct.operator}`;\n if (conjunct.values) {\n id += `-${conjunct.values.join(',')}`;\n }\n return id;\n }\n}\n","import * as React from 'react';\nimport { Map as ImmutableMap } from 'immutable';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useSelector, useDispatch } from 'react-redux';\nimport { createSelectorCreator, defaultMemoize } from 'reselect';\nimport { K8sModel } from '../../../api/common-types';\nimport * as k8sActions from '../../../app/k8s/actions/k8s';\nimport { UseK8sWatchResources } from '../../../extensions/console-types';\nimport {\n transformGroupVersionKindToReference,\n getReferenceForModel,\n getGroupVersionKindForReference,\n} from '../k8s-ref';\nimport { GetIDAndDispatch, OpenShiftReduxRootState } from './k8s-watch-types';\nimport { getIDAndDispatch, getReduxData, NoModelError } from './k8s-watcher';\nimport { useDeepCompareMemoize } from './useDeepCompareMemoize';\nimport { getK8sModel } from './useK8sModel';\nimport { useModelsLoaded } from './useModelsLoaded';\nimport { usePrevious } from './usePrevious';\n\n/**\n * Hook that retrieves the Kubernetes resources along with their respective status for loaded and error.\n * @param initResources resources need to be watched as key-value pair, wherein key will be unique to resource and value will be options needed to watch for the respective resource.\n * @returns A map where keys are as provided in initResouces and value has three properties data, loaded and error.\n * @example\n * ```ts\n * const Component: React.FC = () => {\n * const watchResources = {\n 'deployment': {...},\n 'pod': {...}\n ...\n }\n * const {deployment, pod} = useK8sWatchResources(watchResources)\n * return ...\n * }\n * ```\n */\nexport const useK8sWatchResources: UseK8sWatchResources = (initResources) => {\n const resources = useDeepCompareMemoize(initResources, true);\n const modelsLoaded = useModelsLoaded();\n\n const allK8sModels = useSelector<OpenShiftReduxRootState, ImmutableMap<string, K8sModel>>(\n (state: OpenShiftReduxRootState) => state.k8s.getIn(['RESOURCES', 'models']),\n );\n\n const prevK8sModels = usePrevious(allK8sModels);\n const prevResources = usePrevious(resources);\n\n const k8sModelsRef = React.useRef<ImmutableMap<string, K8sModel>>(ImmutableMap());\n\n if (\n prevResources !== resources ||\n (prevK8sModels !== allK8sModels &&\n Object.values(resources).some((r) => {\n const modelReference = transformGroupVersionKindToReference(r.groupVersionKind || r.kind);\n return (\n getK8sModel(prevK8sModels, modelReference) !== getK8sModel(allK8sModels, modelReference)\n );\n }))\n ) {\n const requiredModels = Object.values(resources).map((r) =>\n transformGroupVersionKindToReference(r.groupVersionKind || r.kind),\n );\n k8sModelsRef.current = allK8sModels.filter(\n (model) =>\n requiredModels.includes(getReferenceForModel(model)) || requiredModels.includes(model.kind),\n );\n }\n\n const k8sModels = k8sModelsRef.current;\n\n const reduxIDs = React.useMemo<{\n [key: string]: ReturnType<GetIDAndDispatch<OpenShiftReduxRootState>> & { noModel: boolean };\n }>(\n () =>\n modelsLoaded\n ? Object.keys(resources).reduce((ids, key) => {\n const modelReference = transformGroupVersionKindToReference(\n resources[key].groupVersionKind || resources[key].kind,\n );\n\n const resourceModel =\n modelReference &&\n (k8sModels.get(modelReference) ||\n k8sModels.get(getGroupVersionKindForReference(modelReference).kind));\n if (!resourceModel) {\n ids[key] = {\n noModel: true,\n };\n } else {\n const idAndDispatch = getIDAndDispatch(resources[key], resourceModel);\n if (idAndDispatch) {\n ids[key] = idAndDispatch;\n }\n }\n return ids;\n }, {})\n : null,\n [k8sModels, modelsLoaded, resources],\n );\n\n const dispatch = useDispatch();\n React.useEffect(() => {\n const reduxIDKeys = Object.keys(reduxIDs || {});\n reduxIDKeys.forEach((k) => {\n if (reduxIDs[k].dispatch) {\n dispatch(reduxIDs[k].dispatch);\n }\n });\n return () => {\n reduxIDKeys.forEach((k) => {\n if (reduxIDs[k].dispatch) {\n dispatch(k8sActions.stopK8sWatch(reduxIDs[k].id));\n }\n });\n };\n }, [dispatch, reduxIDs]);\n\n const resourceK8sSelectorCreator = React.useMemo(\n () =>\n createSelectorCreator(\n // specifying createSelectorCreator<ImmutableMap<string, K8sKind>> throws type error\n defaultMemoize as any,\n (oldK8s: ImmutableMap<string, K8sModel>, newK8s: ImmutableMap<string, K8sModel>) =>\n Object.keys(reduxIDs || {})\n .filter((k) => !reduxIDs[k].noModel)\n .every((k) => oldK8s.get(reduxIDs[k].id) === newK8s.get(reduxIDs[k].id)),\n ),\n [reduxIDs],\n );\n\n const resourceK8sSelector = React.useMemo(\n () =>\n resourceK8sSelectorCreator(\n (state: OpenShiftReduxRootState) => state.k8s,\n (k8s) => k8s,\n ),\n [resourceK8sSelectorCreator],\n );\n\n const resourceK8s = useSelector(resourceK8sSelector);\n\n const results = React.useMemo(\n () =>\n Object.keys(resources).reduce((acc, key) => {\n if (reduxIDs?.[key].noModel) {\n acc[key] = {\n data: resources[key].isList ? [] : {},\n loaded: true,\n loadError: new NoModelError(),\n };\n } else if (resourceK8s.has(reduxIDs?.[key].id)) {\n const data = getReduxData(resourceK8s.getIn([reduxIDs[key].id, 'data']), resources[key]);\n const loaded = resourceK8s.getIn([reduxIDs[key].id, 'loaded']);\n const loadError = resourceK8s.getIn([reduxIDs[key].id, 'loadError']);\n acc[key] = { data, loaded, loadError };\n } else {\n acc[key] = {\n data: resources[key].isList ? [] : {},\n loaded: false,\n loadError: undefined,\n };\n }\n return acc;\n }, {} as any),\n [resources, reduxIDs, resourceK8s],\n );\n return results;\n};\n","import * as React from 'react';\nimport { ExpandableSection } from '@patternfly/react-core';\n\ninterface ExpandCollapseProps {\n textExpanded: string;\n textCollapsed: string;\n onToggle?: (isExpanded: boolean) => void;\n dataTest?: string;\n}\n\nexport const ExpandCollapse: React.FC<ExpandCollapseProps> = ({\n textCollapsed,\n textExpanded,\n onToggle,\n dataTest,\n children,\n}) => {\n const [isExpanded, toggleExpandCollapse] = React.useState(false);\n return (\n <ExpandableSection\n toggleTextExpanded={textExpanded}\n toggleTextCollapsed={textCollapsed}\n onToggle={() => {\n onToggle?.(!isExpanded);\n toggleExpandCollapse(!isExpanded);\n }}\n data-test={dataTest}\n >\n {children}\n </ExpandableSection>\n );\n};\n","import * as React from 'react';\nimport { Label } from '@patternfly/react-core';\nimport './Badge.scss';\nimport { useTranslation } from 'react-i18next';\n\nconst DevPreviewBadge: React.FC = () => {\n const { t } = useTranslation();\n return <Label className=\"ocs-preview-badge\">{t('console-shared~Dev preview')}</Label>;\n};\n\nexport default DevPreviewBadge;\n","import * as React from 'react';\n\nexport const useResizeObserver = (\n callback: ResizeObserverCallback,\n targetElement?: HTMLElement | null,\n): void => {\n const element = React.useMemo(() => targetElement ?? document.querySelector('body'), [\n targetElement,\n ]);\n React.useEffect(() => {\n const observer = new ResizeObserver(callback);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [callback, element]);\n};\n","import * as React from 'react';\nimport { QuickStart } from '@patternfly/quickstarts';\nimport { Map as ImmutableMap } from 'immutable';\nimport {\n FirehoseResult,\n HealthState,\n K8sResourceCommon,\n LIMIT_STATE,\n PrometheusResponse,\n QueryParams,\n StatusGroupMapper,\n TopConsumerPopoverProps,\n} from '../extensions/console-types';\nimport { Alert, K8sModel } from './common-types';\n\ntype WithClassNameProps<R = {}> = R & {\n className?: string;\n};\n\nexport type ActivityItemProps = WithClassNameProps;\n\nexport type ActivityBodyProps = WithClassNameProps<{\n children: React.ReactNode;\n}>;\n\nexport type AlertsBodyProps = WithClassNameProps<{\n error?: boolean;\n}>;\n\nexport type RecentEventsBodyProps = {\n events: FirehoseResult<EventKind[]>;\n filter?: (arg: EventKind) => boolean;\n moreLink?: string;\n};\n\ntype OngoingActvityProps<T> = {\n resource: T;\n};\n\nexport type OngoingActivityBodyProps = {\n resourceActivities?: (OngoingActvityProps<K8sResourceCommon> & {\n timestamp: Date;\n loader?: () => Promise<React.ComponentType<Partial<OngoingActvityProps<K8sResourceCommon>>>>;\n component?: React.ComponentType<Partial<OngoingActvityProps<K8sResourceCommon>>>;\n })[];\n prometheusActivities?: {\n results: PrometheusResponse[];\n loader?: () => Promise<React.ComponentType<{ results?: PrometheusResponse[] }>>;\n component?: React.ComponentType<{ results: PrometheusResponse[] }>;\n }[];\n loaded: boolean;\n};\n\nexport type AlertItemProps = {\n alert: Alert;\n documentationLink?: string;\n};\n\nexport type HealthItemProps = WithClassNameProps<{\n title: string;\n details?: string;\n state?: HealthState;\n popupTitle?: string;\n popupClassname?: string;\n popupBodyContent?: React.ReactNode | ((hide: () => void) => React.ReactNode);\n popupKeepOnOutsideClick?: boolean;\n noIcon?: boolean;\n icon?: React.ReactNode;\n}>;\n\nexport type ResourceInventoryItemProps = {\n resources: K8sResourceCommon[];\n additionalResources?: { [key: string]: [] };\n mapper?: StatusGroupMapper;\n kind: K8sModel;\n isLoading: boolean;\n namespace?: string;\n error: boolean;\n showLink?: boolean;\n TitleComponent?: React.ComponentType<{}>;\n title?: string;\n titlePlural?: string;\n ExpandedComponent?: React.ComponentType<{}>;\n basePath?: string;\n dataTest?: string;\n};\n\nexport type DetailItemProps = {\n title: string;\n children: React.ReactNode;\n isLoading?: boolean;\n error?: boolean;\n valueClassName?: string;\n errorMessage?: string;\n};\n\nexport type DetailsBodyProps = {\n children?: React.ReactNode;\n};\n\nexport type UtilizationBodyProps = {\n children: React.ReactNode;\n};\n\nexport enum ByteDataTypes {\n BinaryBytes = 'binaryBytes',\n BinaryBytesWithoutB = 'binaryBytesWithoutB',\n DecimalBytes = 'decimalBytes',\n DecimalBytesWithoutB = 'decimalBytesWithoutB',\n}\n\nexport type UtilizationItemProps = {\n title: string;\n utilization?: PrometheusResponse;\n limit?: PrometheusResponse;\n requested?: PrometheusResponse;\n isLoading: boolean;\n // Todo(bipuladh): Make huamnize type Humanize once unit.js is converted\n humanizeValue: Function;\n query: string | string[];\n error: boolean;\n max?: number;\n byteDataType?: ByteDataTypes;\n TopConsumerPopover?: React.ComponentType<TopConsumerPopoverProps>;\n setLimitReqState?: (state: { limit: LIMIT_STATE; requested: LIMIT_STATE }) => void;\n};\n\ntype EventInvolvedObject = {\n apiVersion?: string;\n kind?: string;\n name?: string;\n uid?: string;\n namespace?: string;\n};\n\nexport type EventKind = {\n action?: string;\n count?: number;\n type?: string;\n involvedObject: EventInvolvedObject;\n message?: string;\n eventTime?: string;\n lastTimestamp?: string;\n firstTimestamp?: string;\n reason?: string;\n source: {\n component: string;\n host?: string;\n };\n series?: {\n count?: number;\n lastObservedTime?: string;\n state?: string;\n };\n} & K8sResourceCommon;\n\nexport type UtilizationDurationDropdownProps = {\n adjustDuration?: (duration: number) => number;\n};\n\ntype UtilizationDurationState = {\n duration: number;\n endDate: Date;\n selectedKey: string;\n startDate: Date;\n updateDuration: (duration: number) => void;\n updateEndDate: (endDate: Date) => void;\n updateSelectedKey: (key: string) => void;\n};\n\nexport type UseUtilizationDuration = (\n adjustDuration?: (duration: number) => number,\n) => UtilizationDurationState;\n\nexport type Options = {\n ns?: string;\n name?: string;\n path?: string;\n queryParams?: QueryParams;\n cluster?: string;\n};\n\nexport type UseLastNamespace = () => [\n string,\n React.Dispatch<React.SetStateAction<string>>,\n boolean,\n];\n\nexport type VirtualizedGridProps = {\n items: VirtualizedGridItem[] | VirtualizedGridGroupedItems;\n renderCell: VirtualizedGridRenderCell;\n /**\n * should be set when items are grouped/ `isItemGrouped` is set to true and each group has a heading\n */\n renderHeader?: VirtualizedGridRenderHeader;\n /**\n * Default value: false\n * should be set true when items are grouped\n */\n isItemsGrouped?: boolean;\n\n /** Grid styles */\n className?: string;\n\n /** Cell Measurements */\n cellWidth?: number;\n cellMargin?: number;\n celldefaultHeight?: number;\n estimatedCellHeight?: number;\n\n overscanRowCount?: number;\n headerHeight?: number;\n};\n\nexport type VirtualizedGridItem = {\n [key: string]: any;\n};\n\nexport type VirtualizedGridGroupedItems = {\n [key: string]: VirtualizedGridItem[];\n};\n\nexport type VirtualizedGridRenderHeader = (heading: string) => React.ReactNode;\n\nexport type VirtualizedGridRenderCell = (item: VirtualizedGridItem) => React.ReactNode;\n\nexport type LazyActionMenuProps = {\n context: ActionContext;\n variant?: ActionMenuVariant;\n label?: string;\n isDisabled?: boolean;\n};\n\nexport type ActionContext = {\n [contextId: string]: any;\n};\n\nexport enum ActionMenuVariant {\n KEBAB = 'plain',\n DROPDOWN = 'default',\n}\n\ntype Request<R> = {\n active: boolean;\n timeout: NodeJS.Timer;\n inFlight: boolean;\n data: R;\n error: any;\n};\n\nexport type RequestMap<R> = ImmutableMap<string, Request<R>>;\n\nexport type Fetch = (url: string) => Promise<any>;\nexport type WatchURLProps = {\n url: string;\n fetch?: Fetch;\n};\n\nexport type WatchPrometheusQueryProps = {\n query: string;\n namespace?: string;\n timespan?: number;\n};\n\nexport type UseDashboardResources = ({\n prometheusQueries,\n urls,\n notificationAlertLabelSelectors,\n}: {\n prometheusQueries?: WatchPrometheusQueryProps[];\n urls?: WatchURLProps[];\n notificationAlertLabelSelectors?: { [k: string]: string };\n}) => {\n urlResults: RequestMap<any>;\n prometheusResults: RequestMap<PrometheusResponse>;\n notificationAlerts: { alerts: Alert[]; loaded: boolean; loadError: Error };\n};\n\nexport type QuickStartsLoaderProps = {\n children: (quickStarts: QuickStart[], loaded: boolean) => React.ReactNode;\n};\n\nexport type UseURLPoll = <R>(\n url: string,\n delay?: number,\n ...dependencies: any[]\n) => [R, any, boolean];\n","// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useSelector } from 'react-redux';\nimport { FeatureSubStore } from '../app/features';\n\nexport type UseFlag = (flag: string) => boolean;\n\n/**\n * Hook that returns the given feature flag from FLAGS redux state.\n * @param flag The feature flag to return\n * @returns the boolean value of the requested feature flag or undefined\n */\nexport const useFlag: UseFlag = (flag) =>\n useSelector<FeatureSubStore, boolean>(({ FLAGS }) => FLAGS.get(flag));\n","import * as React from 'react';\nimport { ButtonProps, NumberInput } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\n\nexport const NumberSpinner: React.FC<NumberSpinnerProps> = ({\n className,\n changeValueBy,\n min,\n value,\n ...inputProps\n}) => {\n const { t } = useTranslation();\n\n return (\n <div className=\"co-m-number-spinner\">\n <NumberInput\n min={min}\n value={value}\n onMinus={() => changeValueBy(-1)}\n onChange={inputProps.onChange}\n onPlus={() => changeValueBy(1)}\n inputProps={{ ...inputProps }}\n className={className}\n minusBtnAriaLabel={t('public~Decrement')}\n minusBtnProps={{ 'data-test-id': 'Decrement' } as ButtonProps}\n plusBtnAriaLabel={t('public~Increment')}\n plusBtnProps={{ 'data-test-id': 'Increment' } as ButtonProps}\n isDisabled={inputProps.disabled}\n />\n </div>\n );\n};\n\ntype NumberSpinnerProps = {\n value: number;\n className?: string;\n changeValueBy: (operation: number) => void;\n min?: number;\n} & React.HTMLProps<HTMLInputElement>;\n","import { ExtensionK8sModel } from '../api/common-types';\nimport { Extension, ExtensionDeclaration } from '../types';\n\n/** This extension identifies a resource used to manage the configuration of the cluster.\n A link to the resource will be added to the Administration - Cluster Settings - Configuration page. */\nexport type ClusterGlobalConfig = ExtensionDeclaration<\n 'console.global-config',\n {\n /** Unique identifier for the cluster config resource instance. */\n id: string;\n /** The name of the cluster config resource instance. */\n name: string;\n /** The model which refers to a cluster config resource. */\n model: ExtensionK8sModel;\n /** The namespace of the cluster config resource instance. */\n namespace: string;\n }\n>;\n\n// Type guards\n\nexport const isClusterGlobalConfig = (e: Extension): e is ClusterGlobalConfig =>\n e.type === 'console.global-config';\n","import { ExtensionK8sModel } from '../api/common-types';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\nimport { K8sResourceCommon } from './console-types';\n\nexport type DetailsItemColumn = 'right' | 'left';\n\nexport type DetailsItemComponentProps<R extends K8sResourceCommon = K8sResourceCommon, V = any> = {\n /** The subject resource */\n obj: R;\n\n /** The path property provided by the extension */\n path?: string;\n\n /** The property of obj referenced by path */\n value?: V;\n};\n\n/** Adds a new details item to the default resource summary on the details page. */\nexport type DetailsItem = ExtensionDeclaration<\n 'console.resource/details-item',\n {\n /** The subject resource's API group, version, and kind. */\n model: ExtensionK8sModel;\n\n /** A unique identifier. */\n id: string;\n\n /**\n * Determines if the item will appear in the 'left' or 'right' column of the resource summary on\n * the details page. Default: 'right'\n */\n column: DetailsItemColumn;\n\n /** The details item title. */\n title: string;\n\n /**\n * An optional, fully-qualified path to a resource property to used as the details item\n * value. Only [primitive type](https://developer.mozilla.org/en-US/docs/Glossary/Primitive)\n * values can be rendered directly. Use the component property to handle other data types.\n */\n path?: string;\n\n /**\n * An optional React component that will render the details item value.\n */\n component?: CodeRef<React.ComponentType<DetailsItemComponentProps>>;\n\n /**\n * An optional sort weight, relative to all other details items in the same column. Represented\n * by any valid [JavaScript\n * Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#number_type).\n * Items in each column are sorted independently, lowest to highest. Items without sort weights\n * are sorted after items with sort weights.\n */\n sortWeight?: number;\n }\n>;\n\nexport const isDetailsItem = (e: Extension): e is DetailsItem =>\n e.type === 'console.resource/details-item';\n\nexport const isLeftDetailsItem = (e: DetailsItem): e is DetailsItem =>\n isDetailsItem(e) && e.properties.column === 'left';\n\nexport const isRightDetailsItem = (e: DetailsItem): e is DetailsItem =>\n isDetailsItem(e) && e.properties.column === 'right';\n","import { ExtensionK8sModel } from '../api/common-types';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\n\n/** Gives full control over Console feature flags. */\nexport type FeatureFlag = ExtensionDeclaration<\n 'console.flag',\n {\n /** Used to set/unset arbitrary feature flags. */\n handler: CodeRef<FeatureFlagHandler>;\n }\n>;\n\n/** Adds new Console feature flag driven by the presence of a CRD on the cluster. */\nexport type ModelFeatureFlag = ExtensionDeclaration<\n 'console.flag/model',\n {\n /** The name of the flag to set once the CRD is detected. */\n flag: string;\n /** The model which refers to a `CustomResourceDefinition`. */\n model: ExtensionK8sModel;\n }\n>;\n\n/** Gives full control over Console feature flags with hook handlers. */\nexport type FeatureFlagHookProvider = ExtensionDeclaration<\n 'console.flag/hookProvider',\n {\n /** Used to set/unset arbitrary feature flags. */\n handler: CodeRef<FeatureFlagHandler>;\n }\n>;\n\n// Type guards\n\nexport const isFeatureFlag = (e: Extension): e is FeatureFlag => e.type === 'console.flag';\n\nexport const isModelFeatureFlag = (e: Extension): e is ModelFeatureFlag =>\n e.type === 'console.flag/model';\n\nexport const isFeatureFlagHookProvider = (e: Extension): e is FeatureFlagHookProvider =>\n e.type === 'console.flag/hookProvider';\n\n// Support types\n\nexport type SetFeatureFlag = (flag: string, enabled: boolean) => void;\nexport type FeatureFlagHandler = (callback: SetFeatureFlag) => void;\n","export * from './core';\n","export { coreReducer } from './core';\nexport * from './coreSelectors';\n","import { Map as ImmutableMap } from 'immutable';\nimport { AdmissionWebhookWarning, CoreState } from '../../redux-types';\nimport { ActionType, CoreAction } from '../actions/core';\n\n/**\n * Reducer function for the core\n * @param state the reducer state\n * @param action provided associated action type alongwith payload\n * @param action.type type of the action\n * @param action.payload associated payload for the action\n * @see CoreAction\n * @returns The the updated state.\n */\nexport const coreReducer = (\n state: CoreState = {\n user: {},\n admissionWebhookWarnings: ImmutableMap<string, AdmissionWebhookWarning>(),\n },\n action: CoreAction,\n): CoreState => {\n switch (action.type) {\n case ActionType.BeginImpersonate:\n return {\n ...state,\n impersonate: {\n kind: action.payload.kind,\n name: action.payload.name,\n subprotocols: action.payload.subprotocols,\n },\n };\n case ActionType.EndImpersonate: {\n const stateKeys = Object.keys(state);\n return stateKeys.reduce((acc, key) => {\n if (key !== 'impersonate') {\n return {\n ...acc,\n [key]: state[key],\n };\n }\n return acc;\n }, {} as CoreState);\n }\n\n case ActionType.SetUser:\n return {\n ...state,\n user: action.payload.userInfo,\n };\n\n case ActionType.SetAdmissionWebhookWarning:\n return {\n ...state,\n admissionWebhookWarnings: state.admissionWebhookWarnings.set(\n action.payload.id,\n action.payload.warning,\n ),\n };\n case ActionType.RemoveAdmissionWebhookWarning:\n return {\n ...state,\n admissionWebhookWarnings: state.admissionWebhookWarnings.remove(action.payload.id),\n };\n default:\n return state;\n }\n};\n","const createURL = (host: string, path: string): string => {\n let url;\n\n if (host === 'auto') {\n if (window.location.protocol === 'https:') {\n url = 'wss://';\n } else {\n url = 'ws://';\n }\n url += window.location.host;\n } else {\n url = host;\n }\n\n if (path) {\n url += path;\n }\n\n return url;\n};\n\nexport type WSOptions = {\n host: string;\n path: string;\n subprotocols: string[];\n reconnect?: boolean;\n jsonParse?: boolean;\n bufferMax?: number;\n bufferFlushInterval?: number;\n timeout?: number;\n};\n\ntype GenericHandler<T = any> = (data: T) => void;\nexport type OpenHandler = GenericHandler<undefined>; // nothing is sent\nexport type CloseHandler = GenericHandler<CloseEvent>;\nexport type ErrorHandler = GenericHandler<Event>;\n/**\n * The WebSocket can send JSON that is parsed, or we just send it through as-is\n */\nexport type MessageDataType = object | any;\nexport type MessageHandler = GenericHandler<MessageDataType>;\n/**\n * Data is provided potentially by .destroy() caller.\n */\nexport type DestroyHandler = GenericHandler<unknown | undefined>;\nexport type BulkMessageHandler = GenericHandler<MessageDataType>;\n\ntype WSHandlers = {\n open: OpenHandler[];\n close: CloseHandler[];\n error: ErrorHandler[];\n message: MessageHandler[];\n destroy: DestroyHandler[];\n bulkmessage: BulkMessageHandler[];\n};\n\ntype WSHandlerType = keyof WSHandlers;\n\n/**\n * @class WebSocket factory and utility wrapper.\n */\nexport class WSFactory {\n private readonly id: string;\n\n private paused: boolean;\n\n private handlers: WSHandlers;\n\n private state: string;\n\n private messageBuffer: MessageDataType[];\n\n private connectionAttempt: ReturnType<typeof setTimeout>;\n\n private readonly flushCanceler: ReturnType<typeof setInterval>;\n\n private options: WSOptions;\n\n private bufferMax: number;\n\n private ws: WebSocket;\n\n /**\n * @param id - unique id for the WebSocket.\n * @param options - websocket options to initate the WebSocket with.\n */\n constructor(id: string, options: WSOptions) {\n this.id = id;\n this.options = options;\n this.bufferMax = options.bufferMax || 0;\n this.paused = false;\n this.handlers = {\n open: [],\n close: [],\n error: [],\n message: [],\n destroy: [],\n bulkmessage: [],\n };\n this.connect();\n\n if (this.bufferMax) {\n this.flushCanceler = setInterval(\n this.flushMessageBuffer.bind(this),\n this.options.bufferFlushInterval || 500,\n );\n }\n }\n\n private reconnect() {\n if (this.connectionAttempt || this.state === 'destroyed') {\n return;\n }\n\n let delay = 1000;\n\n const attempt = () => {\n if (!this.options.reconnect || this.state === 'open') {\n clearTimeout(this.connectionAttempt);\n this.connectionAttempt = null;\n return;\n }\n if (this.options.timeout && delay > this.options.timeout) {\n clearTimeout(this.connectionAttempt);\n this.connectionAttempt = null;\n this.destroy();\n return;\n }\n\n this.connect();\n delay = Math.round(Math.min(1.5 * delay, 60000));\n this.connectionAttempt = setTimeout(attempt, delay);\n // eslint-disable-next-line no-console\n console.log(`attempting reconnect in ${delay / 1000} seconds...`);\n };\n\n this.connectionAttempt = setTimeout(attempt, delay);\n }\n\n private connect() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n this.state = 'init';\n this.messageBuffer = [];\n const url = createURL(this.options.host, this.options.path);\n try {\n this.ws = new WebSocket(url, this.options.subprotocols);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Error creating websocket:', e);\n this.reconnect();\n return;\n }\n\n this.ws.onopen = function () {\n // eslint-disable-next-line no-console\n console.log(`websocket open: ${that.id}`);\n that.state = 'open';\n that.triggerEvent('open', undefined);\n if (that.connectionAttempt) {\n clearTimeout(that.connectionAttempt);\n that.connectionAttempt = null;\n }\n };\n this.ws.onclose = function (evt: CloseEvent) {\n // eslint-disable-next-line no-console\n console.log(`websocket closed: ${that.id}`, evt);\n that.state = 'closed';\n that.triggerEvent('close', evt);\n that.reconnect();\n };\n this.ws.onerror = function (evt: Event) {\n // eslint-disable-next-line no-console\n console.log(`websocket error: ${that.id}`);\n that.state = 'error';\n that.triggerEvent('error', evt);\n };\n this.ws.onmessage = function (evt: Parameters<typeof WebSocket.prototype.onmessage>[0]) {\n const msg = that.options?.jsonParse ? JSON.parse(evt.data) : evt.data;\n // In some browsers, onmessage can fire after onclose/error. Don't update state to be incorrect.\n if (that.state !== 'destroyed' && that.state !== 'closed') {\n that.state = 'open';\n }\n that.triggerEvent('message', msg);\n };\n }\n\n private registerHandler(type: WSHandlerType, fn: GenericHandler) {\n if (this.state === 'destroyed') {\n return;\n }\n this.handlers[type].push(fn);\n }\n\n /**\n * Invoke all registered handler callbacks for a given event type.\n */\n private invokeHandlers(type: WSHandlerType, data: MessageDataType) {\n const handlers = this.handlers[type];\n if (!handlers) {\n return;\n }\n handlers.forEach(function (h) {\n try {\n h(data);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('WS handling failed:', e);\n }\n });\n }\n\n /**\n * Triggers event to be buffered or invoked depending on config.\n */\n private triggerEvent(type: WSHandlerType, event?: MessageDataType) {\n if (this.state === 'destroyed') {\n return;\n }\n\n // Only buffer \"message\" events, so \"error\" and \"close\" etc can pass thru.\n if (this.bufferMax && type === 'message') {\n this.messageBuffer.push(event);\n\n if (this.messageBuffer.length > this.bufferMax) {\n this.messageBuffer.shift();\n }\n\n return;\n }\n\n this.invokeHandlers(type, event);\n }\n\n onmessage(fn: MessageHandler) {\n this.registerHandler('message', fn);\n return this;\n }\n\n onbulkmessage(fn: BulkMessageHandler) {\n this.registerHandler('bulkmessage', fn);\n return this;\n }\n\n onerror(fn: ErrorHandler) {\n this.registerHandler('error', fn);\n return this;\n }\n\n onopen(fn: OpenHandler) {\n this.registerHandler('open', fn);\n return this;\n }\n\n onclose(fn: CloseHandler) {\n this.registerHandler('close', fn);\n return this;\n }\n\n ondestroy(fn: DestroyHandler) {\n this.registerHandler('destroy', fn);\n return this;\n }\n\n flushMessageBuffer() {\n if (this.paused) {\n return;\n }\n\n if (!this.messageBuffer.length) {\n return;\n }\n\n if (this.handlers.bulkmessage.length) {\n this.invokeHandlers('bulkmessage', this.messageBuffer);\n } else {\n this.messageBuffer.forEach((e) => this.invokeHandlers('message', e));\n }\n\n this.messageBuffer = [];\n }\n\n /**\n * Pausing prevents any buffer flushing until unpaused.\n */\n pause() {\n this.paused = true;\n }\n\n unpause() {\n this.paused = false;\n this.flushMessageBuffer();\n }\n\n isPaused() {\n return this.paused;\n }\n\n getState() {\n return this.state;\n }\n\n bufferSize() {\n return this.messageBuffer.length;\n }\n\n destroy(eventData?: unknown) {\n // eslint-disable-next-line no-console\n console.log(`destroying websocket: ${this.id}`);\n if (this.state === 'destroyed') {\n return;\n }\n\n try {\n if (this.ws) {\n this.ws.close();\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Error while close WS socket', e);\n }\n\n clearInterval(this.flushCanceler);\n clearTimeout(this.connectionAttempt);\n\n if (this.ws) {\n this.ws.onopen = null;\n this.ws.onclose = null;\n this.ws.onerror = null;\n this.ws.onmessage = null;\n delete this.ws;\n }\n\n try {\n this.triggerEvent('destroy', eventData);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Error while trigger destroy event for WS socket', e);\n }\n\n this.state = 'destroyed';\n\n this.messageBuffer = [];\n }\n\n send(data: Parameters<typeof WebSocket.prototype.send>[0]) {\n this.ws && this.ws.send(data);\n }\n}\n","import { coreReducer } from './core/reducers/core';\nimport sdkK8sReducers from './k8s/reducers/k8s';\n\n/**\n * Dynamic Plugin SDK Redux store reducers\n *\n * If the app uses Redux, these can be spread into the root of your store to provide an integrated SDK.\n * If the app does not use Redux, these will be provided via the SDK Redux Store.\n */\nexport const SDKReducers = Object.freeze({\n sdkCore: coreReducer,\n k8s: sdkK8sReducers,\n});\n","import * as React from 'react';\n\nconst MEMO = {};\n\nconst CamelCaseWrap: React.FC<CamelCaseWrapProps> = ({ value, dataTest }) => {\n if (!value) {\n return '-';\n }\n\n if (MEMO[value]) {\n return MEMO[value];\n }\n\n // Add word break points before capital letters (but keep consecutive capital letters together).\n const words = value.match(/[A-Z]+[^A-Z]*|[^A-Z]+/g);\n const rendered = (\n <span data-test={dataTest}>\n {words.map((word, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <React.Fragment key={i}>\n {word}\n {i !== words.length - 1 && <wbr />}\n </React.Fragment>\n ))}\n </span>\n );\n MEMO[value] = rendered;\n return rendered;\n};\n\ntype CamelCaseWrapProps = {\n value: string;\n dataTest?: string;\n};\n\nexport default CamelCaseWrap;\n","import * as React from 'react';\nimport { Button, Popover, PopoverPosition, PopoverProps } from '@patternfly/react-core';\nimport './PopoverStatus.scss';\n\ntype PopoverStatusProps = {\n statusBody: React.ReactNode;\n onHide?: () => void;\n onShow?: () => void;\n title?: string;\n hideHeader?: boolean;\n isVisible?: boolean;\n shouldClose?: (hideFunction: any) => void;\n shouldOpen?: PopoverProps['shouldOpen'];\n};\n\n/**\n * Component for creating a status popover item\n * @param {ReactNode} statusBody - content displayed within the popover.\n * @param {function} [onHide] - (optional) function invoked when popover begins to transition out\n * @param {function} [onShow] - (optional) function invoked when popover begins to appear\n * @param {string} [title] - (optional) title for the popover\n * @param {boolean} [hideHeader] - (optional) when true, header text is hidden\n * @param {boolean} [isVisible] - (optional) when true, the popover is displayed\n * @param {function} [shouldClose] - (optional) callback function invoked when the popover is closed only if isVisible is also controlled\n * @param {ReactNode} [children] - (optional) children for the component\n * @example\n * ```tsx\n * <PopoverStatus title={title} statusBody={statusBody}>\n * {children}\n * </PopoverStatus>\n * ```\n */\nconst PopoverStatus: React.FC<PopoverStatusProps> = ({\n hideHeader,\n children,\n isVisible = null,\n shouldClose = null,\n shouldOpen = null,\n statusBody,\n title,\n onHide,\n onShow,\n}) => {\n return (\n <Popover\n position={PopoverPosition.right}\n headerContent={hideHeader ? null : title}\n bodyContent={children}\n aria-label={title}\n onHide={onHide}\n onShow={onShow}\n isVisible={isVisible}\n shouldClose={shouldClose}\n shouldOpen={shouldOpen}\n >\n <Button variant=\"link\" isInline className=\"co-popover-status-button\">\n {statusBody}\n </Button>\n </Popover>\n );\n};\n\nexport default PopoverStatus;\n","export const DASH = '-';\n","import { KebabAction } from '@console/internal/components/utils/kebab';\nimport { K8sKind } from '@console/internal/module/k8s';\nimport { Extension } from './base';\n\nnamespace ExtensionProperties {\n export interface KebabActions {\n // no kind should return any actions common for all kinds\n getKebabActionsForKind: (kind: K8sKind) => KebabAction[];\n }\n}\n\nexport interface KebabActions extends Extension<ExtensionProperties.KebabActions> {\n type: 'KebabActions';\n}\n\nexport function isKebabActions(e: Extension): e is KebabActions {\n return e.type === 'KebabActions';\n}\n","import { TourDataType } from '@console/app/src/components/tour';\nimport { Extension } from './base';\n\nnamespace ExtensionProperties {\n export interface GuidedTour {\n perspective: string;\n tour: TourDataType;\n }\n}\n\nexport interface GuidedTour extends Extension<ExtensionProperties.GuidedTour> {\n type: 'GuidedTour';\n}\n\nexport const isGuidedTour = (e: Extension): e is GuidedTour => {\n return e.type === 'GuidedTour';\n};\n","import * as React from 'react';\nimport { Label } from '@patternfly/react-core';\nimport './Badge.scss';\nimport { useTranslation } from 'react-i18next';\n\nconst TechPreviewBadge: React.FC = () => {\n const { t } = useTranslation();\n return <Label className=\"ocs-preview-badge\">{t('console-shared~Tech preview')}</Label>;\n};\n\nexport default TechPreviewBadge;\n","import { useAccessReviewAllowed } from '@console/dynamic-plugin-sdk';\nimport { ClusterVersionModel } from '@console/internal/models';\n\nexport const isClusterExternallyManaged = (): boolean => {\n return window.SERVER_FLAGS.controlPlaneTopology === 'External';\n};\n\nexport const useCanClusterUpgrade = (): boolean => {\n const hasPermissionsToUpdate = useAccessReviewAllowed({\n group: ClusterVersionModel.apiGroup,\n resource: ClusterVersionModel.plural,\n verb: 'patch',\n name: 'version',\n });\n const notExternallyManaged = !isClusterExternallyManaged();\n const brandingManagedUpdates =\n window.SERVER_FLAGS.branding === 'dedicated' || window.SERVER_FLAGS.branding === 'rosa';\n const canPerformUpgrade =\n hasPermissionsToUpdate && !brandingManagedUpdates && notExternallyManaged;\n\n return canPerformUpgrade;\n};\n","import * as _ from 'lodash';\nexport const LINE_PATTERN = /^.*(\\n|$)/gm;\nconst TRUNCATE_LENGTH = 1024;\n\nexport class LineBuffer {\n private _buffer: string[];\n private _tail: string;\n private _hasTruncated: boolean;\n private _maxSize?: number;\n\n constructor(maxSize) {\n this._buffer = [];\n this._tail = '';\n this._hasTruncated = false;\n this._maxSize = maxSize;\n }\n\n ingest(text): number {\n const lines = text.match(LINE_PATTERN);\n let lineCount = 0;\n lines.forEach((line) => {\n const next = `${this._tail}${line}`;\n if (next.length > TRUNCATE_LENGTH) {\n this._hasTruncated = true;\n }\n if (/\\n$/.test(line)) {\n if (this._buffer.length === this._maxSize) {\n this._buffer.shift();\n }\n this._buffer.push(_.truncate(next, { length: TRUNCATE_LENGTH }).trimEnd());\n lineCount++;\n this._tail = '';\n } else {\n this._tail = next;\n }\n });\n return lineCount;\n }\n\n clear(): void {\n this._buffer = [];\n this._hasTruncated = false;\n this._tail = '';\n }\n\n getLines(): string[] {\n return this._buffer;\n }\n\n getBlob(options: BlobPropertyBag, lineSeparator = '\\n'): Blob {\n return new Blob([this._buffer.join(lineSeparator)], options);\n }\n\n getHasTruncated(): boolean {\n return this._hasTruncated;\n }\n\n getTail() {\n return _.truncate(this._tail, { length: TRUNCATE_LENGTH });\n }\n\n length(): number {\n return this._buffer.length;\n }\n}\n","import * as React from 'react';\nimport i18next from 'i18next';\nimport { useTranslation } from 'react-i18next';\n\nexport const withHandlePromise: WithHandlePromise = (Component) => (props) => {\n const [inProgress, setInProgress] = React.useState(false);\n const [errorMessage, setErrorMessage] = React.useState('');\n\n const { t } = useTranslation();\n\n const handlePromise = (promise, onFulfill, onError) => {\n setInProgress(true);\n promise.then(\n (res) => {\n setInProgress(false);\n setErrorMessage('');\n onFulfill && onFulfill(res);\n },\n (error) => {\n const errorMsg = error.message || t('public~An error occurred. Please try again.');\n setInProgress(false);\n setErrorMessage(errorMsg);\n onError\n ? onError(errorMsg)\n : // eslint-disable-next-line no-console\n console.error(\n `handlePromise failed in component ${Component.displayName || Component.name}:`,\n error,\n );\n },\n );\n };\n\n return (\n <Component\n {...(props as any)}\n handlePromise={handlePromise}\n inProgress={inProgress}\n errorMessage={errorMessage}\n />\n );\n};\n\nexport class PromiseComponent<P, S extends PromiseComponentState> extends React.Component<P, S> {\n constructor(props) {\n super(props);\n this.state = {\n inProgress: false,\n errorMessage: '',\n } as S;\n }\n\n handlePromise<T>(promise: Promise<T>): Promise<T> {\n this.setState({\n inProgress: true,\n });\n return promise.then(\n (res) => this.then(res),\n (error) => this.catch(error),\n );\n }\n\n private then(res) {\n this.setState({\n inProgress: false,\n errorMessage: '',\n });\n return res;\n }\n\n private catch(error) {\n const errorMessage = error.message || i18next.t('public~An error occurred. Please try again.');\n this.setState({\n inProgress: false,\n errorMessage,\n });\n return Promise.reject(errorMessage);\n }\n}\n\nexport type HandlePromiseProps = {\n handlePromise: <T>(\n promise: Promise<T>,\n onFulfill?: (res) => void,\n onError?: (errorMsg: string) => void,\n ) => void;\n inProgress: boolean;\n errorMessage: string;\n};\n\nexport type WithHandlePromise = <P extends HandlePromiseProps>(\n C: React.ComponentType<P>,\n) => React.FC<Diff<P, HandlePromiseProps>>;\n\nexport type PromiseComponentState = {\n inProgress: boolean;\n errorMessage: string;\n};\n","import * as React from 'react';\n\nexport const useCombineRefs = <RefType extends any>(...refs: (React.Ref<RefType> | undefined)[]) =>\n React.useCallback(\n (element: RefType | null): void =>\n refs.forEach((ref) => {\n if (ref) {\n if (typeof ref === 'function') {\n ref(element);\n } else {\n (ref as React.MutableRefObject<any>).current = element;\n }\n }\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n refs,\n );\n","import * as React from 'react';\nimport { CloseButton as CloseButtonPF } from '@patternfly/react-component-groups';\nimport './CloseButton.scss';\n\ntype CloseButtonProps = {\n additionalClassName?: string;\n ariaLabel?: string;\n dataTestID?: string;\n onClick: (e: any) => void;\n};\n\n/**\n * @deprecated Do not use deprecated CloseButton import; the component has been moved to @patternfly/react-component-groups\n */\nconst CloseButton: React.FC<CloseButtonProps> = ({ additionalClassName, ariaLabel, ...rest }) => (\n <CloseButtonPF className={additionalClassName} aria-label={ariaLabel} {...rest} />\n);\n\nexport default CloseButton;\n","export { default as NamespaceDropdown } from './NamespaceDropdown';\nexport * from './usePreferredNamespace';\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { connect } from 'react-redux';\n\nimport { Divider } from '@patternfly/react-core';\nimport { k8sPatch } from '../../module/k8s';\nimport { RoleModel, ClusterRoleModel } from '../../models';\nimport { Kebab, EmptyBox, ResourceIcon } from '../utils';\nimport { confirmModal } from '../modals';\nimport { useTranslation } from 'react-i18next';\n\nexport const RulesList = ({ rules, name, namespace }) => {\n const { t } = useTranslation();\n return _.isEmpty(rules) ? (\n <EmptyBox label={t('public~Rules')} />\n ) : (\n <div className=\"co-m-table-grid co-m-table-grid--bordered\">\n <div className=\"row co-m-table-grid__head\">\n <div className=\"col-xs-5 col-sm-4 col-md-3 col-lg-2\">{t('public~Actions')}</div>\n <div className=\"hidden-xs col-sm-4 col-md-3 col-lg-3\">{t('public~API groups')}</div>\n <div className=\"col-xs-7 col-sm-4 col-md-6 col-lg-7\">{t('public~Resources')}</div>\n </div>\n <div className=\"co-m-table-grid__body\">\n {rules.map((rule, i) => (\n <div className=\"row co-resource-list__item\" key={i}>\n <Rule {...rule} name={name} namespace={namespace} i={i} />\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nconst Actions = ({ verbs }) => {\n let actions = [];\n _.each(verbs, (a) => {\n if (a === '*') {\n actions = <div className=\"rbac-rule-row\">All</div>;\n return false;\n }\n actions.push(\n <div className=\"rbac-rule-row\" key={a}>\n {a}\n </div>,\n );\n });\n return <div>{actions}</div>;\n};\n\nconst Groups = ({ apiGroups }) => {\n // defaults to [\"\"]\n let groups = [];\n _.each(apiGroups, (g) => {\n if (g === '*') {\n groups = (\n <div className=\"rbac-rule-row\">\n * <i>All</i>\n </div>\n );\n return false;\n }\n groups.push(\n <div className=\"rbac-rule-row\" key={g}>\n {g}\n </div>,\n );\n });\n return <div>{groups}</div>;\n};\n\nconst Resources = connect(({ k8s }) => ({ allModels: k8s.getIn(['RESOURCES', 'models']) }))(\n ({ resources, nonResourceURLs, allModels }) => {\n let allResources = [];\n resources &&\n _.each([...new Set(resources)].sort(), (r) => {\n if (r === '') {\n return false;\n }\n if (r === '*') {\n allResources = [\n <span key={r} className=\"rbac-rule-resource rbac-rule-row\">\n All Resources\n </span>,\n ];\n return false;\n }\n const base = r.split('/')[0];\n const kind = allModels.find((model) => model.plural === base);\n\n allResources.push(\n <span key={r} className=\"rbac-rule-resource rbac-rule-row\">\n <ResourceIcon kind={kind ? kind.kind : r} />{' '}\n <span className=\"rbac-rule-resource__label\">{r}</span>\n </span>,\n );\n });\n\n if (nonResourceURLs && nonResourceURLs.length) {\n if (allResources.length) {\n allResources.push(<Divider key=\"hr\" className=\"co-divider resource-separator\" />);\n }\n let URLs = [];\n _.each(nonResourceURLs.sort(), (r) => {\n if (r === '*') {\n URLs = [\n <div className=\"rbac-rule-row\" key={r}>\n All Non-resource URLs\n </div>,\n ];\n return false;\n }\n URLs.push(\n <div className=\"rbac-rule-row\" key={r}>\n {r}\n </div>,\n );\n });\n allResources.push.apply(allResources, URLs);\n }\n return <div className=\"rbac-rule-resources\">{allResources}</div>;\n },\n);\n\n// This page is temporarily disabled until we update the safe resources list.\n// const EditRule = (name, namespace, i) => ({\n// label: 'Edit Rule',\n// href: namespace ? `/k8s/ns/${namespace}/roles/${name}/${i}/edit` : `/k8s/cluster/clusterroles/${name}/${i}/edit`,\n// });\n\nconst RuleKebab = ({ name, namespace, i }) => {\n const { t } = useTranslation();\n const DeleteRule = () => ({\n label: t('public~Delete rule'),\n callback: () =>\n confirmModal({\n title: t('public~Delete rule'),\n message: t('public~Are you sure you want to delete rule #{{ruleNumber}}?', {\n ruleNumber: i,\n }),\n btnText: t('public~Delete rule'),\n executeFn: () => {\n const kind = namespace ? RoleModel : ClusterRoleModel;\n return k8sPatch(kind, { metadata: { name, namespace } }, [\n {\n op: 'remove',\n path: `/rules/${i}`,\n },\n ]);\n },\n }),\n });\n\n const options = [\n // EditRule,\n DeleteRule,\n ].map((f) => f(name, namespace, i));\n return <Kebab options={options} />;\n};\n\nconst Rule = ({ resources, nonResourceURLs, verbs, apiGroups, name, namespace, i }) => (\n <div className=\"rbac-rule\">\n <div className=\"col-xs-5 col-sm-4 col-md-3 col-lg-2\">\n <Actions verbs={verbs} />\n </div>\n <div className=\"hidden-xs col-sm-4 col-md-3 col-lg-3\">\n <Groups apiGroups={apiGroups} />\n </div>\n <div className=\"col-xs-7 col-sm-4 col-md-6 col-lg-7\">\n <Resources resources={resources} nonResourceURLs={nonResourceURLs} />\n </div>\n <div className=\"dropdown-kebab-pf\">\n <RuleKebab name={name} namespace={namespace} i={i} />\n </div>\n </div>\n);\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useDispatch } from 'react-redux';\nimport { TableGridBreakpoint, SortByDirection, OnSelect } from '@patternfly/react-table';\nimport {\n Table as PfTable,\n TableHeader as TableHeaderDeprecated,\n TableBody as TableBodyDeprecated,\n TableProps as PfTableProps,\n} from '@patternfly/react-table/deprecated';\nimport * as classNames from 'classnames';\nimport { CellMeasurerCache, CellMeasurer } from 'react-virtualized';\nimport {\n AutoSizer,\n VirtualTableBody,\n WindowScroller,\n} from '@patternfly/react-virtualized-extension';\nimport { Scroll } from '@patternfly/react-virtualized-extension/dist/js/components/Virtualized/types';\nimport { useNavigate } from 'react-router-dom-v5-compat';\nimport {\n getMachinePhase,\n getMachineSetInstanceType,\n pvcUsed,\n snapshotSize,\n snapshotSource,\n ALL_NAMESPACES_KEY,\n getName,\n useDeepCompareMemoize,\n} from '@console/shared';\nimport { PackageManifestKind } from '@console/operator-lifecycle-manager/src/types';\nimport { defaultChannelFor } from '@console/operator-lifecycle-manager/src/components';\nimport { RowFilter as RowFilterExt } from '@console/dynamic-plugin-sdk';\nimport { RowFilter } from '../filter-toolbar';\nimport * as UIActions from '../../actions/ui';\nimport { alertingRuleStateOrder, alertSeverityOrder } from '../monitoring/utils';\nimport { ingressValidHosts } from '../ingress';\nimport { convertToBaseValue, EmptyBox, StatusBox, WithScrollContainer } from '../utils';\nimport {\n CustomResourceDefinitionKind,\n getClusterOperatorStatus,\n getClusterOperatorVersion,\n getJobTypeAndCompletions,\n getLatestVersionForCRD,\n getTemplateInstanceStatus,\n K8sResourceKind,\n K8sResourceKindReference,\n PodKind,\n podPhase,\n podReadiness,\n podRestarts,\n MachineKind,\n VolumeSnapshotKind,\n ClusterOperator,\n} from '../../module/k8s';\nimport { useTableData } from './table-data-hook';\n\nconst sorts = {\n alertingRuleStateOrder,\n alertSeverityOrder,\n crdLatestVersion: (crd: CustomResourceDefinitionKind): string => getLatestVersionForCRD(crd),\n daemonsetNumScheduled: (daemonset) =>\n _.toInteger(_.get(daemonset, 'status.currentNumberScheduled')),\n dataSize: (resource) => _.size(_.get(resource, 'data')) + _.size(_.get(resource, 'binaryData')),\n ingressValidHosts,\n instanceType: (obj): string => getMachineSetInstanceType(obj),\n jobCompletionsSucceeded: (job) => job?.status?.succeeded || 0,\n jobType: (job) => getJobTypeAndCompletions(job).type,\n numReplicas: (resource) => _.toInteger(_.get(resource, 'status.replicas')),\n namespaceCPU: (ns: K8sResourceKind): number => UIActions.getNamespaceMetric(ns, 'cpu'),\n namespaceMemory: (ns: K8sResourceKind): number => UIActions.getNamespaceMetric(ns, 'memory'),\n podCPU: (pod: PodKind): number => UIActions.getPodMetric(pod, 'cpu'),\n podMemory: (pod: PodKind): number => UIActions.getPodMetric(pod, 'memory'),\n podPhase,\n podReadiness: (pod: PodKind): number => podReadiness(pod).readyCount,\n podRestarts,\n pvStorage: (pv) => _.toInteger(convertToBaseValue(pv?.spec?.capacity?.storage)),\n pvcStorage: (pvc) => _.toInteger(convertToBaseValue(pvc?.status?.capacity?.storage)),\n string: (val) => JSON.stringify(val),\n number: (val) => _.toNumber(val),\n getClusterOperatorStatus: (operator: ClusterOperator) => getClusterOperatorStatus(operator),\n getClusterOperatorVersion: (operator: ClusterOperator) => getClusterOperatorVersion(operator),\n getTemplateInstanceStatus,\n machinePhase: (machine: MachineKind): string => getMachinePhase(machine),\n pvcUsed: (pvc: K8sResourceKind): number => pvcUsed(pvc),\n volumeSnapshotSize: (snapshot: VolumeSnapshotKind): number => snapshotSize(snapshot),\n volumeSnapshotSource: (snapshot: VolumeSnapshotKind): string => snapshotSource(snapshot),\n snapshotLastRestore: (snapshot: K8sResourceKind, { restores }) =>\n restores[getName(snapshot)]?.status?.restoreTime,\n sortPackageManifestByDefaultChannelName: (packageManifest: PackageManifestKind): string => {\n const channel = defaultChannelFor(packageManifest);\n return channel?.currentCSVDesc?.displayName;\n },\n};\n\n// Common table row/columns helper SFCs for implementing accessible data grid\nexport const TableRow: React.FC<TableRowProps> = ({\n id,\n index,\n trKey,\n style,\n className,\n ...props\n}) => {\n return (\n <tr\n {...props}\n data-id={id}\n data-index={index}\n data-test-rows=\"resource-row\"\n data-key={trKey}\n style={style}\n className={classNames('pf-v5-c-table__tr', className)}\n role=\"row\"\n />\n );\n};\nTableRow.displayName = 'TableRow';\n\nexport type TableRowProps = {\n id: React.ReactText;\n index: number;\n title?: string;\n trKey: string;\n style: object;\n className?: string;\n};\n\nconst BREAKPOINT_SM = 576;\nconst BREAKPOINT_MD = 768;\nconst BREAKPOINT_LG = 992;\nconst BREAKPOINT_XL = 1200;\nconst BREAKPOINT_XXL = 1400;\nconst MAX_COL_XS = 2;\nconst MAX_COL_SM = 4;\nconst MAX_COL_MD = 4;\nconst MAX_COL_LG = 6;\nconst MAX_COL_XL = 8;\n\nconst isColumnVisible = (\n widthInPixels: number,\n columnID: string,\n columns: Set<string> = new Set(),\n showNamespaceOverride,\n) => {\n const showNamespace =\n columnID !== 'namespace' ||\n UIActions.getActiveNamespace() === ALL_NAMESPACES_KEY ||\n showNamespaceOverride;\n if (_.isEmpty(columns) && showNamespace) {\n return true;\n }\n if (!columns.has(columnID) || !showNamespace) {\n return false;\n }\n const columnIndex = [...columns].indexOf(columnID);\n if (widthInPixels < BREAKPOINT_SM) {\n return columnIndex < MAX_COL_XS;\n }\n if (widthInPixels < BREAKPOINT_MD) {\n return columnIndex < MAX_COL_SM;\n }\n if (widthInPixels < BREAKPOINT_LG) {\n return columnIndex < MAX_COL_MD;\n }\n if (widthInPixels < BREAKPOINT_XL) {\n return columnIndex < MAX_COL_LG;\n }\n if (widthInPixels < BREAKPOINT_XXL) {\n return columnIndex < MAX_COL_XL;\n }\n return true;\n};\n\nexport const TableData: React.FC<TableDataProps> = ({\n className,\n columnID,\n columns,\n showNamespaceOverride,\n ...props\n}) => {\n return isColumnVisible(window.innerWidth, columnID, columns, showNamespaceOverride) ? (\n <td {...props} className={classNames('pf-v5-c-table__td', className)} role=\"gridcell\" />\n ) : null;\n};\nTableData.displayName = 'TableData';\nexport type TableDataProps = {\n className?: string;\n columnID?: string;\n columns?: Set<string>;\n id?: string;\n showNamespaceOverride?: boolean;\n};\n\nconst TableWrapper: React.FC<TableWrapperProps> = ({\n virtualize,\n ariaLabel,\n ariaRowCount,\n ...props\n}) => {\n return virtualize ? (\n <div {...props} role=\"grid\" aria-label={ariaLabel} aria-rowcount={ariaRowCount} />\n ) : (\n <React.Fragment {...props} />\n );\n};\nexport type TableWrapperProps = {\n virtualize: boolean;\n ariaLabel: string;\n ariaRowCount: number;\n};\nconst RowMemo = React.memo<RowFunctionArgs & { Row: React.FC<RowFunctionArgs> }>(\n ({ Row, ...props }) => <Row {...props} />,\n);\n\nconst VirtualBody: React.FC<VirtualBodyProps> = (props) => {\n const {\n customData,\n Row,\n height,\n isScrolling,\n onChildScroll,\n data,\n columns,\n scrollTop,\n width,\n getRowProps,\n onRowsRendered,\n } = props;\n\n const cellMeasurementCache = new CellMeasurerCache({\n fixedWidth: true,\n minHeight: 44,\n keyMapper: (rowIndex) => _.get(props.data[rowIndex], 'metadata.uid', rowIndex),\n });\n\n const rowRenderer = ({ index, isVisible, key, style, parent }) => {\n const rowArgs = {\n obj: data[index],\n columns,\n customData,\n };\n\n // do not render non visible elements (this excludes overscan)\n if (!isVisible) {\n return null;\n }\n\n const rowProps = getRowProps?.(rowArgs.obj);\n const rowId = rowProps?.id ?? key;\n return (\n <CellMeasurer\n cache={cellMeasurementCache}\n columnIndex={0}\n key={key}\n parent={parent}\n rowIndex={index}\n >\n <TableRow {...rowProps} id={rowId} index={index} trKey={key} style={style}>\n <RowMemo Row={Row} {...rowArgs} />\n </TableRow>\n </CellMeasurer>\n );\n };\n\n return (\n <VirtualTableBody\n autoHeight\n className=\"pf-v5-c-table pf-m-compact pf-m-border-rows pf-v5-c-window-scroller\"\n deferredMeasurementCache={cellMeasurementCache}\n rowHeight={cellMeasurementCache.rowHeight}\n height={height || 0}\n isScrolling={isScrolling}\n onScroll={onChildScroll}\n overscanRowCount={10}\n columns={columns}\n rows={data}\n rowCount={data.length}\n rowRenderer={rowRenderer}\n scrollTop={scrollTop}\n width={width}\n onRowsRendered={onRowsRendered}\n />\n );\n};\n\nexport type RowFunctionArgs<T = any, C = any> = {\n obj: T;\n columns: any[];\n customData?: C;\n};\n\nexport type VirtualBodyProps<D = any, C = any> = {\n customData?: C;\n Row: React.FC<RowFunctionArgs>;\n height: number;\n isScrolling: boolean;\n onChildScroll: (params: Scroll) => void;\n data: D[];\n columns: any[];\n scrollTop: number;\n width: number;\n expand: boolean;\n getRowProps?: (obj: D) => Partial<Pick<TableRowProps, 'id' | 'className' | 'title'>>;\n onRowsRendered?: (params: {\n overscanStartIndex: number;\n overscanStopIndex: number;\n startIndex: number;\n stopIndex: number;\n }) => void;\n};\n\ntype HeaderFunc = (componentProps: ComponentProps) => any[];\n\nconst getActiveColumns = (\n windowWidth: number,\n Header: HeaderFunc,\n componentProps: ComponentProps,\n activeColumns: Set<string>,\n columnManagementID: string,\n showNamespaceOverride: boolean,\n) => {\n let columns = Header(componentProps);\n if (_.isEmpty(activeColumns)) {\n activeColumns = new Set(\n columns.map((col) => {\n if (col.id && !col.additional) {\n return col.id;\n }\n }),\n );\n }\n if (columnManagementID) {\n columns = columns?.filter(\n (col) =>\n isColumnVisible(windowWidth, col.id, activeColumns, showNamespaceOverride) ||\n col.title === '',\n );\n } else {\n columns = columns?.filter((col) => activeColumns.has(col.id) || col.title === '');\n }\n\n const showNamespace =\n UIActions.getActiveNamespace() === ALL_NAMESPACES_KEY || showNamespaceOverride;\n if (!showNamespace) {\n columns = columns.filter((column) => column.id !== 'namespace');\n }\n return columns;\n};\n\nconst getComponentProps = (\n data: any[],\n filters: Filter[],\n selected: boolean,\n kindObj: K8sResourceKindReference,\n): ComponentProps => ({\n data,\n filters,\n selected,\n kindObj,\n});\n\nexport const Table: React.FC<TableProps> = ({\n onSelect,\n filters: initFilters,\n selected,\n kindObj,\n Header: initHeader,\n activeColumns,\n columnManagementID,\n showNamespaceOverride,\n scrollElement,\n Rows,\n Row,\n expand,\n label,\n mock,\n selectedResourcesForKind,\n 'aria-label': ariaLabel,\n virtualize = true,\n customData,\n gridBreakPoint = TableGridBreakpoint.none,\n loaded,\n loadError,\n NoDataEmptyMsg,\n EmptyMsg,\n defaultSortOrder,\n customSorts,\n data: propData,\n defaultSortFunc,\n reduxID,\n reduxIDs,\n staticFilters,\n rowFilters,\n isPinned,\n defaultSortField,\n getRowProps,\n onRowsRendered,\n}) => {\n const filters = useDeepCompareMemoize(initFilters);\n const Header = useDeepCompareMemoize(initHeader);\n const { currentSortField, currentSortFunc, currentSortOrder, data, listId } = useTableData({\n reduxID,\n reduxIDs,\n defaultSortFunc,\n defaultSortField,\n defaultSortOrder,\n staticFilters,\n filters,\n rowFilters: rowFilters as RowFilterExt[],\n propData,\n loaded,\n isPinned,\n customData,\n customSorts,\n sorts,\n });\n\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const [windowWidth, setWindowWidth] = React.useState(window.innerWidth);\n const [sortBy, setSortBy] = React.useState({});\n\n const [columns, componentProps] = React.useMemo(() => {\n const cProps = getComponentProps(data, filters, selected, kindObj);\n return [\n getActiveColumns(\n windowWidth,\n Header,\n cProps,\n activeColumns,\n columnManagementID,\n showNamespaceOverride,\n ),\n cProps,\n ];\n }, [\n windowWidth,\n Header,\n data,\n filters,\n selected,\n kindObj,\n activeColumns,\n columnManagementID,\n showNamespaceOverride,\n ]);\n\n const columnShift = onSelect ? 1 : 0; //shift indexes by 1 if select provided\n\n React.useEffect(() => {\n if (!sortBy) {\n let newSortBy = {};\n if (currentSortField && currentSortOrder) {\n const columnIndex = _.findIndex(columns, { sortField: currentSortField });\n if (columnIndex > -1) {\n newSortBy = { index: columnIndex + columnShift, direction: currentSortOrder };\n }\n } else if (currentSortFunc && currentSortOrder) {\n const columnIndex = _.findIndex(columns, { sortFunc: currentSortFunc });\n if (columnIndex > -1) {\n newSortBy = { index: columnIndex + columnShift, direction: currentSortOrder };\n }\n }\n setSortBy(newSortBy);\n }\n }, [columnShift, columns, currentSortField, currentSortFunc, currentSortOrder, sortBy]);\n\n const applySort = React.useCallback(\n (sortField, sortFunc, direction, columnTitle) => {\n dispatch(UIActions.sortList(listId, sortField, sortFunc || currentSortFunc, direction));\n const url = new URL(window.location.href);\n const sp = new URLSearchParams(window.location.search);\n sp.set('orderBy', direction);\n sp.set('sortBy', columnTitle);\n navigate(`${url.pathname}?${sp.toString()}${url.hash}`, { replace: true });\n },\n [currentSortFunc, dispatch, listId, navigate],\n );\n\n const onSort = React.useCallback(\n (event, index, direction) => {\n event.preventDefault();\n const sortColumn = columns[index - columnShift];\n applySort(sortColumn.sortField, sortColumn.sortFunc, direction, sortColumn.title);\n setSortBy({\n index,\n direction,\n });\n },\n [applySort, columnShift, columns],\n );\n\n React.useEffect(() => {\n const handleResize = _.debounce(() => setWindowWidth(window.innerWidth), 100);\n const sp = new URLSearchParams(window.location.search);\n const columnIndex = _.findIndex(columns, { title: sp.get('sortBy') });\n\n if (columnIndex > -1) {\n const sortOrder = sp.get('orderBy') || SortByDirection.asc;\n const column = columns[columnIndex];\n applySort(column.sortField, column.sortFunc, sortOrder, column.title);\n setSortBy({\n index: columnIndex + columnShift,\n direction: sortOrder,\n });\n }\n\n // re-render after resize\n window.addEventListener('resize', handleResize);\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const ariaRowCount = data && data.length;\n const scrollNode = typeof scrollElement === 'function' ? scrollElement() : scrollElement;\n const renderVirtualizedTable = (scrollContainer) => (\n <WindowScroller scrollElement={scrollContainer}>\n {({ height, isScrolling, registerChild, onChildScroll, scrollTop }) => (\n <AutoSizer disableHeight>\n {({ width }) => (\n <div ref={registerChild}>\n <VirtualBody\n Row={Row}\n customData={customData}\n height={height}\n isScrolling={isScrolling}\n onChildScroll={onChildScroll}\n data={data}\n columns={columns}\n scrollTop={scrollTop}\n width={width}\n expand={expand}\n getRowProps={getRowProps}\n onRowsRendered={onRowsRendered}\n />\n </div>\n )}\n </AutoSizer>\n )}\n </WindowScroller>\n );\n const children = mock ? (\n <EmptyBox label={label} />\n ) : (\n <div className={classNames({ 'co-virtualized-table': virtualize })}>\n <TableWrapper virtualize={virtualize} ariaLabel={ariaLabel} ariaRowCount={ariaRowCount}>\n <PfTable\n cells={columns}\n rows={\n virtualize\n ? []\n : Rows({\n componentProps,\n selectedResourcesForKind,\n customData,\n })\n }\n gridBreakPoint={gridBreakPoint}\n onSort={onSort}\n onSelect={onSelect}\n sortBy={sortBy}\n className=\"pf-m-compact pf-m-border-rows\"\n role={virtualize ? 'presentation' : 'grid'}\n aria-label={virtualize ? null : ariaLabel}\n >\n <TableHeaderDeprecated role=\"rowgroup\" />\n {!virtualize && <TableBodyDeprecated />}\n </PfTable>\n {virtualize &&\n (scrollNode ? (\n renderVirtualizedTable(scrollNode)\n ) : (\n <WithScrollContainer>{renderVirtualizedTable}</WithScrollContainer>\n ))}\n </TableWrapper>\n </div>\n );\n return (\n <div className=\"co-m-table-grid co-m-table-grid--bordered\">\n {mock ? (\n children\n ) : (\n <StatusBox\n skeleton={<div className=\"loading-skeleton--table\" />}\n data={data}\n loaded={loaded}\n loadError={loadError}\n unfilteredData={propData}\n label={label}\n NoDataEmptyMsg={NoDataEmptyMsg}\n EmptyMsg={EmptyMsg}\n >\n {children}\n </StatusBox>\n )}\n </div>\n );\n};\n\nexport type Filter = { key: string; value: string };\n\ntype RowsArgs<C = any> = {\n componentProps: ComponentProps;\n selectedResourcesForKind: string[];\n customData: C;\n};\n\nexport type TableProps<D = any, C = any> = Partial<ComponentProps<D>> & {\n customData?: C;\n customSorts?: { [key: string]: (obj: D) => number | string };\n defaultSortFunc?: string;\n defaultSortField?: string;\n defaultSortOrder?: SortByDirection;\n showNamespaceOverride?: boolean;\n Header: HeaderFunc;\n loadError?: string | Object;\n Row?: React.FC<RowFunctionArgs<D, C>>;\n Rows?: (args: RowsArgs<C>) => PfTableProps['rows'];\n 'aria-label': string;\n onSelect?: OnSelect;\n virtualize?: boolean;\n NoDataEmptyMsg?: React.ComponentType<{}>;\n EmptyMsg?: React.ComponentType<{}>;\n loaded?: boolean;\n reduxID?: string;\n reduxIDs?: string[];\n rowFilters?: RowFilter[];\n label?: string;\n columnManagementID?: string;\n isPinned?: (val: D) => boolean;\n staticFilters?: Filter[];\n activeColumns?: Set<string>;\n gridBreakPoint?: TableGridBreakpoint;\n selectedResourcesForKind?: string[];\n mock?: boolean;\n expand?: boolean;\n scrollElement?: HTMLElement | (() => HTMLElement);\n getRowProps?: VirtualBodyProps<D>['getRowProps'];\n onRowsRendered?: VirtualBodyProps<D>['onRowsRendered'];\n};\n\nexport type ComponentProps<D = any> = {\n data: D[];\n filters: Filter[];\n selected: boolean;\n kindObj: K8sResourceKindReference;\n};\n","import * as React from 'react';\nimport { getParentScrollableElement } from '@console/shared/src/hooks/useScrollContainer';\n\ntype WithScrollContainerProps = {\n children: (scrollContainer: HTMLElement) => React.ReactElement | null;\n};\n\nexport const WithScrollContainer: React.FC<WithScrollContainerProps> = ({ children }) => {\n const [scrollContainer, setScrollContainer] = React.useState<HTMLElement>();\n const ref = React.useCallback((node) => {\n if (node) {\n setScrollContainer(getParentScrollableElement(node));\n }\n }, []);\n return scrollContainer ? children(scrollContainer) : <span ref={ref} />;\n};\n","import * as React from 'react';\n\nconst isHTMLElement = (n: Node): n is HTMLElement => {\n return n.nodeType === Node.ELEMENT_NODE;\n};\n\nexport const getParentScrollableElement = (node: HTMLElement) => {\n let parentNode: Node = node;\n while (parentNode) {\n if (isHTMLElement(parentNode)) {\n let overflow = parentNode.style?.overflow;\n if (!overflow.includes('scroll') && !overflow.includes('auto')) {\n overflow = window.getComputedStyle(parentNode).overflow;\n }\n if (overflow.includes('scroll') || overflow.includes('auto')) {\n return parentNode;\n }\n }\n parentNode = parentNode.parentNode;\n }\n return undefined;\n};\n\nexport const useScrollContainer = (): [HTMLElement, (node: HTMLElement) => void] => {\n const [scrollContainer, setScrollContainer] = React.useState<HTMLElement>(null);\n const elementRef = React.useCallback((node: HTMLElement) => {\n if (node === null) {\n setScrollContainer(null);\n }\n if (node) {\n setScrollContainer(getParentScrollableElement(node));\n }\n }, []);\n return [scrollContainer, elementRef];\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { getGroupVersionKindForModel } from '@console/dynamic-plugin-sdk/src/utils/k8s/k8s-ref';\nimport { K8sModel } from '@console/dynamic-plugin-sdk/src/api/common-types';\nimport { k8sPatchResource } from '@console/dynamic-plugin-sdk/src/utils/k8s/k8s-resource';\nimport { K8sResourceCommon } from '@console/dynamic-plugin-sdk/src/extensions/console-types';\nimport { K8sResourceKind } from '../../module/k8s';\nimport { usePromiseHandler } from '@console/shared/src/hooks/promise-handler';\nimport {\n createModalLauncher,\n ModalBody,\n ModalComponentProps,\n ModalSubmitFooter,\n ModalTitle,\n} from '../factory/modal';\nimport { ResourceIcon, SelectorInput } from '../utils';\nimport { useK8sWatchResource } from '../utils/k8s-watch-hook';\n\nconst LABELS_PATH = '/metadata/labels';\nconst TEMPLATE_SELECTOR_PATH = '/spec/template/metadata/labels';\n\nconst BaseLabelsModal: React.FC<BaseLabelsModalProps> = ({\n cancel,\n close,\n descriptionKey,\n isPodSelector,\n kind,\n labelClassName,\n messageKey,\n messageVariables,\n path,\n resource,\n}) => {\n const [handlePromise, , errorMessage] = usePromiseHandler<K8sResourceCommon>();\n const [labels, setLabels] = React.useState(\n SelectorInput.arrayify(_.get(resource, path.split('/').slice(1))),\n );\n const [watchedResource, watchedResourceLoaded] = useK8sWatchResource<K8sResourceCommon>({\n kind: resource?.kind,\n name: resource?.metadata?.name,\n namespace: resource?.metadata?.namespace,\n });\n const [stale, setStale] = React.useState(false);\n const createPath = !labels.length;\n const { t } = useTranslation();\n\n React.useEffect(() => {\n if (watchedResourceLoaded && !_.isEmpty(watchedResource)) {\n setStale(!_.isEqual(resource?.metadata?.labels, watchedResource?.metadata?.labels));\n }\n }, [path, resource, watchedResource, watchedResourceLoaded]);\n\n const submit = (e) => {\n e.preventDefault();\n const data = [\n {\n op: createPath ? 'add' : 'replace',\n path,\n value: SelectorInput.objectify(labels),\n },\n ];\n\n // https://kubernetes.io/docs/user-guide/deployments/#selector\n // .spec.selector must match .spec.template.metadata.labels, or it will be rejected by the API\n const updateTemplate =\n isPodSelector && !_.isEmpty(_.get(resource, TEMPLATE_SELECTOR_PATH.split('/').slice(1)));\n\n if (updateTemplate) {\n data.push({\n path: TEMPLATE_SELECTOR_PATH,\n op: 'replace',\n value: SelectorInput.objectify(labels),\n });\n }\n const promise = k8sPatchResource({ model: kind, resource, data });\n handlePromise(promise).then(close);\n };\n\n return (\n <form onSubmit={submit} name=\"form\" className=\"modal-content\">\n <ModalTitle>\n {descriptionKey\n ? t('public~Edit {{description}}', {\n description: t(descriptionKey),\n })\n : t('public~Edit labels')}\n </ModalTitle>\n <ModalBody>\n <div className=\"row co-m-form-row\">\n <div className=\"col-sm-12\">\n {messageKey\n ? t(messageKey, messageVariables)\n : t(\n 'public~Labels help you organize and select resources. Adding labels below will let you query for objects that have similar, overlapping or dissimilar labels.',\n )}\n </div>\n </div>\n <div className=\"row co-m-form-row\">\n <div className=\"col-sm-12\">\n <label htmlFor=\"tags-input\" className=\"control-label\">\n {descriptionKey\n ? t('{{description}} for', { description: t(descriptionKey) })\n : t('public~Labels for')}{' '}\n <ResourceIcon groupVersionKind={getGroupVersionKindForModel(kind)} />{' '}\n {resource?.metadata?.name}\n </label>\n <SelectorInput\n onChange={(l) => setLabels(l)}\n tags={labels}\n labelClassName={labelClassName || `co-m-${kind.id}`}\n autoFocus\n />\n </div>\n </div>\n </ModalBody>\n <ModalSubmitFooter\n errorMessage={errorMessage}\n message={\n stale\n ? t('public~Labels have been updated. Click Cancel and reapply your changes.')\n : undefined\n }\n inProgress={false}\n submitText={t('public~Save')}\n submitDisabled={stale}\n cancel={cancel}\n />\n </form>\n );\n};\n\nexport const LabelsModal: React.FC<LabelsModalProps> = (props) => (\n <BaseLabelsModal path={LABELS_PATH} {...props} />\n);\nexport const labelsModalLauncher = createModalLauncher<LabelsModalProps>(LabelsModal);\n\nexport const podSelectorModal = createModalLauncher<PodSelectorModalProps>((props) => {\n const { t } = useTranslation();\n return (\n <BaseLabelsModal\n path={\n ['replicationcontrolleres', 'services'].includes(props.kind.plural)\n ? '/spec/selector'\n : '/spec/selector/matchLabels'\n }\n isPodSelector={true}\n // t('public~Pod selector')\n descriptionKey=\"public~Pod selector\"\n // t('public~Determines the set of pods targeted by this {{kind}}.')\n messageKey={'public~Determines the set of pods targeted by this {{kind}}.'}\n messageVariables={{\n kind: props.kind.labelKey ? t(props.kind.labelKey) : props.kind.label.toLowerCase(),\n }}\n labelClassName=\"co-m-pod\"\n {...props}\n />\n );\n});\n\ntype BaseLabelsModalProps = {\n descriptionKey?: string;\n isPodSelector?: boolean;\n kind: K8sModel;\n labelClassName?: string;\n messageKey?: string;\n messageVariables?: { [key: string]: string };\n path: string;\n resource: K8sResourceKind;\n} & ModalComponentProps;\nexport type LabelsModalProps = Omit<BaseLabelsModalProps, 'path'>;\ntype PodSelectorModalProps = Omit<\n BaseLabelsModalProps,\n 'descriptionKey' | 'isPodSelector' | 'labelClassName' | 'messageKey' | 'messageVariables' | 'path'\n>;\n","const UPSTREAM_LATEST = 'https://docs.okd.io/latest/';\n\n// Prefer the documentation base URL passed as a flag, but fall back to the latest upstream docs if none was specified.\nexport const openshiftHelpBase = window.SERVER_FLAGS.documentationBaseURL || UPSTREAM_LATEST;\n\nexport const DOC_URL_OPENSHIFT_WHATS_NEW = 'https://www.openshift.com/learn/whats-new';\nexport const DOC_URL_OPERATORFRAMEWORK_SDK = 'https://sdk.operatorframework.io/';\nexport const DOC_URL_PODDISRUPTIONBUDGET_POLICY = `${UPSTREAM_LATEST}rest_api/policy_apis/poddisruptionbudget-policy-v1.html#poddisruptionbudget-policy-v1`;\nexport const DOC_URL_PODMAN = 'https://podman.io/';\nexport const DOC_URL_RED_HAT_MARKETPLACE =\n 'https://marketplace.redhat.com/en-us?utm_source=openshift_console';\n\nconst KUBE_DOCS = 'https://kubernetes.io/docs/';\nexport const DOC_URL_STORAGE_CLASSES_AWS_EBS = `${KUBE_DOCS}/concepts/storage/storage-classes/#aws-ebs`;\nexport const DOC_URL_STORAGE_CLASSES_AZURE_DISK = `${KUBE_DOCS}/concepts/storage/storage-classes/#azure-disk`;\nexport const DOC_URL_STORAGE_CLASSES_AZURE_FILE = `${KUBE_DOCS}/concepts/storage/storage-classes/#azure-file`;\nexport const DOC_URL_STORAGE_CLASSES_GCE = `${KUBE_DOCS}/concepts/storage/storage-classes/#gce`;\nexport const DOC_URL_STORAGE_CLASSES_GLUSTERFS = `${KUBE_DOCS}/concepts/storage/storage-classes/#glusterfs`;\nexport const DOC_URL_STORAGE_CLASSES_LOCAL = `${KUBE_DOCS}/concepts/storage/storage-classes/#local`;\nexport const DOC_URL_STORAGE_CLASSES_OPENSTACK_CINDER = `${KUBE_DOCS}/concepts/storage/storage-classes/#openstack-cinder`;\nexport const DOC_URL_STORAGE_CLASSES_PORTWORX_VOLUME = `${KUBE_DOCS}/concepts/storage/storage-classes/#portworx-volume`;\nexport const DOC_URL_STORAGE_CLASSES_QUOBYTE = `${KUBE_DOCS}/concepts/storage/storage-classes/#quobyte`;\nexport const DOC_URL_STORAGE_CLASSES_SCALEIO = `${KUBE_DOCS}/concepts/storage/storage-classes/#scaleio`;\nexport const DOC_URL_STORAGE_CLASSES_STORAGEOS = `${KUBE_DOCS}/concepts/storage/storage-classes/#storageos`;\nexport const DOC_URL_STORAGE_CLASSES_VSPHERE = `${KUBE_DOCS}/concepts/storage/storage-classes/#vsphere`;\n\nexport const documentationURLs: documentationURLsType = {\n applicationHealth: {\n downstream: 'html/building_applications/application-health',\n upstream: 'applications/application-health.html',\n },\n configuringMonitoring: {\n downstream:\n 'html/monitoring/configuring-the-monitoring-stack#maintenance-and-support_configuring-the-monitoring-stack',\n upstream:\n 'observability/monitoring/configuring-the-monitoring-stack.html#maintenance-and-support_configuring-monitoring',\n },\n networkPolicy: {\n downstream: 'html/networking/network-policy#about-network-policy',\n kube: `${KUBE_DOCS}/concepts/services-networking/network-policies/`,\n upstream: 'networking/network_policy/about-network-policy.html',\n },\n operators: {\n downstream: 'html/operators/understanding-operators#olm-what-operators-are',\n upstream: 'operators/understanding/olm-what-operators-are.html',\n },\n pipelines: {\n downstream: 'html/cicd/pipelines#understanding-openshift-pipelines',\n upstream: '', // intentionally blank as there is no upstream equivalent\n },\n postInstallationMachineConfigurationTasks: {\n downstream: 'html/postinstallation_configuration/index',\n upstream: 'post_installation_configuration/machine-configuration-tasks.html',\n },\n understandingUpgradeChannels: {\n downstream:\n 'html/updating_clusters/understanding-openshift-updates-1#understanding-update-channels-releases',\n upstream: 'updating/understanding_updates/intro-to-updates.html',\n },\n updateService: {\n downstream:\n 'html/updating_clusters/performing-a-cluster-update#updating-a-cluster-in-a-disconnected-environment',\n upstream: '', // intentionally blank as there is no upstream equivalent\n },\n updateUsingCustomMachineConfigPools: {\n downstream:\n 'html/updating_clusters/performing-a-cluster-update#update-using-custom-machine-config-pools',\n upstream: 'updating/updating_a_cluster/update-using-custom-machine-config-pools.html',\n },\n usingInsights: {\n downstream:\n 'html/support/remote-health-monitoring-with-connected-clusters#using-insights-to-identify-issues-with-your-cluster',\n upstream:\n 'support/remote_health_monitoring/using-insights-to-identify-issues-with-your-cluster.html',\n },\n usingRBAC: {\n downstream: 'html/authentication_and_authorization/using-rbac',\n upstream: 'authentication/using-rbac.html',\n },\n workingWithProjects: {\n downstream: 'html/building_applications/projects#working-with-projects',\n upstream: 'applications/projects/working-with-projects.html',\n },\n deprecatedDeploymentConfig: {\n downstream: 'html/building_applications/deployments',\n upstream: 'applications/deployments/what-deployments-are.html',\n },\n admissionWebhookWarning: {\n downstream: 'html/architecture/admission-plug-ins#admission-plug-ins-about_admission-plug-ins',\n kube: `${KUBE_DOCS}/reference/access-authn-authz/extensible-admission-controllers/#response`,\n upstream: 'architecture/index.html#about-admission-plug-ins',\n },\n};\n\nexport const isUpstream = () => window.SERVER_FLAGS.branding === 'okd';\n\nexport const isManaged = () =>\n window.SERVER_FLAGS.branding === 'rosa' || window.SERVER_FLAGS.branding === 'dedicated';\n\nexport const getDocumentationURL = (docURLs: docURLs) =>\n isUpstream()\n ? `${UPSTREAM_LATEST}${docURLs.upstream}`\n : `${window.SERVER_FLAGS.documentationBaseURL}${docURLs.downstream}`;\n\nexport const getNetworkPolicyDocURL = (openshiftFlag: boolean): string => {\n const networkLink = getDocumentationURL(documentationURLs.networkPolicy);\n\n return openshiftFlag ? networkLink : documentationURLs.networkPolicy.kube;\n};\n\ntype documentationURLsType = {\n [key: string]: docURLs;\n};\n\ntype docURLs = {\n downstream: string;\n kube?: string;\n upstream: string;\n};\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nconst NotificationDrawerHeading: React.FC<NotificationDrawerHeadingProps> = ({\n count,\n children,\n onClose,\n}) => {\n const { t } = useTranslation();\n return (\n <div className=\"pf-v5-c-notification-drawer\">\n <div className=\"pf-v5-c-notification-drawer__header\">\n <h1 className=\"pf-v5-c-notification-drawer__header-title\">\n {t('notification-drawer~Notifications')}\n </h1>\n {count && (\n <span className=\"pf-v5-c-notification-drawer__header-status\">\n {t('notification-drawer~{{count}} unread', { count })}\n </span>\n )}\n <div className=\"pf-v5-c-notification-drawer__header-action\">\n <div className=\"pf-v5-c-notification-drawer__header-action-close\">\n <button\n className=\"pf-v5-c-button pf-m-plain\"\n type=\"button\"\n aria-label={t('notification-drawer~Close')}\n onClick={onClose}\n >\n <i className=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n <div className=\"pf-v5-c-notification-drawer__body\">\n <div className=\"pf-v5-c-notification-drawer__group-list\">{children}</div>\n </div>\n </div>\n );\n};\n\ntype NotificationDrawerHeadingProps = {\n children: React.ReactNode;\n count?: number;\n /** A callback for when the close button is clicked */\n onClose: () => void;\n};\n\nexport default NotificationDrawerHeading;\n","import * as _ from 'lodash';\n\nexport const keywordFilter = <T>(\n filterText: string,\n items: T[],\n compareFunction: (keyword: string, item: T) => boolean,\n): T[] => {\n if (!filterText) {\n return items;\n }\n const keywords = _.uniq(filterText.match(/\\S+/g)).map((w) => w.toLowerCase());\n\n // Sort the longest keyword fist\n keywords.sort(function (a: string, b: string) {\n return b.length - a.length;\n });\n\n return items.filter((item) => {\n return keywords.every((keyword) => {\n return compareFunction(keyword, item);\n });\n });\n};\n","interface ItemsToSort {\n id: string;\n insertBefore?: string | string[];\n insertAfter?: string | string[];\n}\n\nconst toArray = (val) => (val ? (Array.isArray(val) ? val : [val]) : []);\n\nconst itemDependsOnItem = <T extends ItemsToSort>(s1: T, s2: T): boolean => {\n if (!s1.insertBefore && !s1.insertAfter) {\n return false;\n }\n const before = toArray(s1.insertBefore);\n const after = toArray(s1.insertAfter);\n return before.includes(s2.id) || after.includes(s2.id);\n};\n\nconst isPositioned = <T extends ItemsToSort>(item: T, allItems: T[]): boolean =>\n !!allItems.find((i) => itemDependsOnItem<T>(item, i));\n\nconst findIndexForItem = <T extends ItemsToSort>(item: T, currentItems: T[]): number => {\n const { insertBefore, insertAfter } = item;\n let index = -1;\n const before = toArray(insertBefore);\n const after = toArray(insertAfter);\n let count = 0;\n while (count < before.length && index < 0) {\n // eslint-disable-next-line no-loop-func\n index = currentItems.findIndex((i) => i.id === before[count]);\n count++;\n }\n count = 0;\n while (count < after.length && index < 0) {\n // eslint-disable-next-line no-loop-func\n index = currentItems.findIndex((i) => i.id === after[count]);\n if (index >= 0) {\n index += 1;\n }\n count++;\n }\n return index;\n};\n\nconst insertItem = <T extends ItemsToSort>(item: T, currentItems: T[]): void => {\n const index = findIndexForItem<T>(item, currentItems);\n if (index >= 0) {\n currentItems.splice(index, 0, item);\n } else {\n currentItems.push(item);\n }\n};\n\nconst insertPositionedItems = <T extends ItemsToSort>(\n insertItems: T[],\n currentItems: T[],\n): void => {\n if (insertItems.length === 0) {\n return;\n }\n\n const sortedItems = insertItems.filter((item) => !isPositioned<T>(item, insertItems));\n const positionedItems = insertItems.filter((item) => isPositioned<T>(item, insertItems));\n\n if (sortedItems.length === 0) {\n // Circular dependencies\n positionedItems.forEach((i) => insertItem<T>(i, currentItems));\n return;\n }\n\n sortedItems.forEach((i) => insertItem<T>(i, currentItems));\n insertPositionedItems<T>(positionedItems, currentItems);\n};\n\nexport const orderExtensionBasedOnInsertBeforeAndAfter = <T extends ItemsToSort>(\n items: T[],\n): T[] => {\n if (!items || !items.length) {\n return [];\n }\n const sortedItems = items.filter((item) => !isPositioned<T>(item, items));\n const positionedItems = items.filter((item) => isPositioned<T>(item, items));\n insertPositionedItems<T>(positionedItems, sortedItems);\n return sortedItems;\n};\n","import * as React from 'react';\nimport { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';\nimport { K8sResourceKind } from '@console/internal/module/k8s';\nimport { getServicesForResource } from '../utils';\n\nexport const useServicesWatcher = (\n resource: K8sResourceKind,\n): { loaded: boolean; loadError: string; services: K8sResourceKind[] } => {\n const { namespace } = resource.metadata;\n const [allServices, loaded, loadError] = useK8sWatchResource<K8sResourceKind[]>({\n isList: true,\n kind: 'Service',\n namespace,\n });\n\n const services = React.useMemo(\n () => (!loadError && loaded ? getServicesForResource(resource, allServices) : []),\n [allServices, loadError, loaded, resource],\n );\n\n return { loaded, loadError, services };\n};\n","import { useCallback, useMemo } from 'react';\nimport { K8sResourceCommon } from '@console/internal/module/k8s';\nimport {\n isPostFormSubmissionAction,\n PostFormSubmissionAction,\n useExtensions,\n} from '@console/plugin-sdk';\nimport { useQueryParams } from './useQueryParams';\n\nexport const usePostFormSubmitAction = <R = K8sResourceCommon[]>(\n key: string = 'action',\n): ((arg: R) => Promise<R>) => {\n const params = useQueryParams();\n const actionParams = params.get(key);\n\n const [actionTypes, actionPayload] = useMemo(() => {\n let parsedAction;\n try {\n parsedAction = JSON.parse(actionParams);\n } catch {\n return [[], {}];\n }\n if (!parsedAction) return [[], {}];\n if (Array.isArray(parsedAction)) {\n return parsedAction.reduce(\n ([types, payload], a) => {\n types.push(a.type);\n payload[a.type] = a.payload;\n return [types, payload];\n },\n [[], {}],\n );\n }\n return [[parsedAction.type], { [parsedAction.type]: parsedAction.payload }];\n }, [actionParams]);\n\n const extensions = useExtensions<PostFormSubmissionAction<R>>(isPostFormSubmissionAction);\n const filteredExtensions = extensions.filter(({ properties: { type } }) =>\n actionTypes.includes(type),\n );\n\n const formCallback = useCallback(\n async (arg: R) => {\n if (filteredExtensions.length > 0) {\n await Promise.all(\n filteredExtensions.map(async ({ properties: { type, callback } }) => {\n if (actionPayload[type]) {\n await callback(arg, actionPayload[type]);\n } else {\n await callback(arg);\n }\n }),\n );\n }\n return arg;\n },\n [filteredExtensions, actionPayload],\n );\n\n return formCallback;\n};\n","import * as React from 'react';\nimport { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';\nimport { HorizontalPodAutoscalerModel } from '@console/internal/models';\nimport { HorizontalPodAutoscalerKind } from '@console/internal/module/k8s';\nimport { doesHpaMatch } from '../utils/hpa-utils';\n\nexport const useRelatedHPA = (\n workloadAPI: string,\n workloadKind: string,\n workloadName: string,\n workloadNamespace: string,\n): [HorizontalPodAutoscalerKind, boolean, string] => {\n // useRelatedHPA is used by PodRing which will be shown many many times on the topology.\n // The topology loads all HPAs itself via useK8sWatchResource, and because our watch\n // hooks are smart enough to do not watch the same resources twice, we can do this here\n // without additional API calls.\n // See also packages/topology/src/data-transforms/ModelContext.ts (getBaseWatchedResources)\n const [hpas, loaded, error] = useK8sWatchResource<HorizontalPodAutoscalerKind[]>({\n kind: HorizontalPodAutoscalerModel.kind,\n namespace: workloadNamespace,\n optional: true,\n isList: true,\n });\n\n const matchingHpa = React.useMemo<HorizontalPodAutoscalerKind>(() => {\n if (hpas && loaded && !error) {\n return hpas.find(\n doesHpaMatch({\n apiVersion: workloadAPI,\n kind: workloadKind,\n metadata: { name: workloadName },\n }),\n );\n }\n return undefined; // similar to .find(() => false)\n }, [hpas, loaded, error, workloadAPI, workloadKind, workloadName]);\n\n return [matchingHpa, loaded, error];\n};\n","import * as React from 'react';\nimport * as fuzzy from 'fuzzysearch';\nimport { TFunction } from 'i18next';\nimport * as _ from 'lodash';\nimport { withTranslation } from 'react-i18next';\nimport {\n Dropdown,\n FirehoseResult,\n LoadingInline,\n ResourceIcon,\n} from '@console/internal/components/utils';\nimport {\n K8sResourceKind,\n referenceForModel,\n K8sKind,\n modelFor,\n referenceFor,\n} from '@console/internal/module/k8s';\nimport { getNamespace } from '../../selectors';\n\ntype DropdownItemProps = {\n model: K8sKind;\n name: string;\n namespace?: string;\n};\n\nconst DropdownItem: React.FC<DropdownItemProps> = ({ model, name, namespace }) => (\n <span className=\"co-resource-item\">\n <span className=\"co-resource-icon--fixed-width\">\n <ResourceIcon kind={referenceForModel(model)} />\n </span>\n <span className=\"co-resource-item__resource-name\">\n <span>{name}</span>\n {namespace && (\n <div className=\"text-muted co-truncate co-nowrap small co-resource-item__resource-namespace\">\n {namespace}\n </div>\n )}\n </span>\n </span>\n);\n\ninterface State {\n resources: {};\n items: {};\n title: React.ReactNode;\n}\n\nexport interface ResourceDropdownItems {\n [key: string]: string | React.ReactElement;\n}\n\nexport interface ResourceDropdownProps {\n id?: string;\n ariaLabel?: string;\n className?: string;\n dropDownClassName?: string;\n menuClassName?: string;\n buttonClassName?: string;\n title?: React.ReactNode;\n titlePrefix?: string;\n allApplicationsKey?: string;\n userSettingsPrefix?: string;\n storageKey?: string;\n disabled?: boolean;\n allSelectorItem?: {\n allSelectorKey?: string;\n allSelectorTitle?: string;\n };\n noneSelectorItem?: {\n noneSelectorKey?: string;\n noneSelectorTitle?: string;\n };\n actionItems?: {\n actionTitle: string;\n actionKey: string;\n }[];\n dataSelector: string[] | number[] | symbol[];\n transformLabel?: Function;\n loaded?: boolean;\n loadError?: string;\n placeholder?: string;\n resources?: FirehoseResult[];\n selectedKey: string;\n autoSelect?: boolean;\n resourceFilter?: (resource: K8sResourceKind) => boolean;\n onChange?: (key: string, name?: string | object, selectedResource?: K8sResourceKind) => void;\n onLoad?: (items: ResourceDropdownItems) => void;\n showBadge?: boolean;\n autocompleteFilter?: (strText: string, item: object) => boolean;\n customResourceKey?: (key: string, resource: K8sResourceKind) => string;\n appendItems?: ResourceDropdownItems;\n t: TFunction;\n}\n\nclass ResourceDropdown extends React.Component<ResourceDropdownProps, State> {\n constructor(props) {\n super(props);\n this.state = {\n resources: this.props.loaded ? this.getResourceList(props) : {},\n items: this.props.loaded ? this.getDropdownList(props, false) : {},\n title: this.props.loaded ? (\n <span className=\"btn-dropdown__item--placeholder\">{this.props.placeholder}</span>\n ) : (\n <LoadingInline />\n ),\n };\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n UNSAFE_componentWillReceiveProps(nextProps: ResourceDropdownProps) {\n const {\n loaded,\n loadError,\n autoSelect,\n selectedKey,\n placeholder,\n onLoad,\n title,\n actionItems,\n } = nextProps;\n if (!loaded && !loadError) {\n this.setState({ title: <LoadingInline /> });\n return;\n }\n\n // If autoSelect is true only then have an item pre-selected based on selectedKey.\n if (!this.props.loadError && !autoSelect && (!this.props.loaded || !selectedKey)) {\n this.setState({\n title: <span className=\"btn-dropdown__item--placeholder\">{placeholder}</span>,\n });\n }\n\n if (loadError) {\n this.setState({\n title: (\n <span className=\"cos-error-title\">\n {this.props.t('console-shared~Error loading - {{placeholder}}', { placeholder })}\n </span>\n ),\n });\n return;\n }\n\n const resourceList = this.getDropdownList({ ...this.props, ...nextProps }, true);\n // set placeholder as title if resourceList is empty no actionItems are there\n if (loaded && !loadError && _.isEmpty(resourceList) && !actionItems && placeholder && !title) {\n this.setState({\n title: <span className=\"btn-dropdown__item--placeholder\">{placeholder}</span>,\n });\n }\n this.setState({ items: resourceList });\n if (nextProps.loaded && onLoad) {\n onLoad(resourceList);\n }\n this.setState({ resources: this.getResourceList(nextProps) });\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n if (_.isEqual(this.state, nextState) && _.isEqual(this.props, nextProps)) {\n return false;\n }\n return true;\n }\n\n private craftResourceKey = (\n resource: K8sResourceKind,\n props: ResourceDropdownProps,\n ): { customKey: string; key: string } => {\n const { customResourceKey, resourceFilter, dataSelector } = props;\n let key;\n if (resourceFilter && resourceFilter(resource)) {\n key = _.get(resource, dataSelector);\n } else if (!resourceFilter) {\n key = _.get(resource, dataSelector);\n }\n return {\n customKey: customResourceKey ? customResourceKey(key, resource) : key,\n key,\n };\n };\n\n private getResourceList = (nextProps: ResourceDropdownProps) => {\n const { resources } = nextProps;\n const resourceList = {};\n _.each(resources, ({ data }) => {\n _.each(data, (resource) => {\n const { customKey, key } = this.craftResourceKey(resource, nextProps);\n const indexKey = customKey || key;\n if (indexKey) {\n resourceList[indexKey] = resource;\n }\n });\n });\n return resourceList;\n };\n\n private getDropdownList = (props: ResourceDropdownProps, updateSelection: boolean) => {\n const {\n loaded,\n actionItems,\n autoSelect,\n selectedKey,\n resources,\n transformLabel,\n allSelectorItem,\n noneSelectorItem,\n showBadge = false,\n appendItems,\n } = props;\n\n const unsortedList = { ...appendItems };\n const namespaces = new Set(_.flatten(_.map(resources, ({ data }) => data?.map(getNamespace))));\n const containsMultipleNs = namespaces.size > 1;\n _.each(resources, ({ data, kind }) => {\n _.reduce(\n data,\n (acc, resource) => {\n const { customKey, key: name } = this.craftResourceKey(resource, props);\n const dataValue = customKey || name;\n if (dataValue) {\n if (showBadge) {\n const model = modelFor(referenceFor(resource)) || (kind && modelFor(kind));\n const namespace = containsMultipleNs ? getNamespace(resource) : null;\n acc[dataValue] = model ? (\n <DropdownItem\n key={resource.metadata.uid}\n model={model}\n name={name}\n namespace={namespace}\n />\n ) : (\n name\n );\n } else {\n acc[dataValue] = transformLabel ? transformLabel(resource) : name;\n }\n }\n return acc;\n },\n unsortedList,\n );\n });\n const sortedList = {};\n\n if (allSelectorItem && !_.isEmpty(unsortedList)) {\n sortedList[allSelectorItem.allSelectorKey] = allSelectorItem.allSelectorTitle;\n }\n if (noneSelectorItem && !_.isEmpty(unsortedList)) {\n sortedList[noneSelectorItem.noneSelectorKey] = noneSelectorItem.noneSelectorTitle;\n }\n\n _.keys(unsortedList)\n .sort()\n .forEach((key) => {\n sortedList[key] = unsortedList[key];\n });\n\n if (updateSelection) {\n let selectedItem = selectedKey;\n if (\n (_.isEmpty(sortedList) || !sortedList[selectedKey]) &&\n allSelectorItem &&\n allSelectorItem.allSelectorKey !== selectedKey\n ) {\n selectedItem = allSelectorItem.allSelectorKey;\n } else if (autoSelect && !selectedKey) {\n selectedItem =\n loaded && _.isEmpty(sortedList) && actionItems\n ? actionItems[0].actionKey\n : _.get(_.keys(sortedList), 0);\n }\n selectedItem && this.handleChange(selectedItem, sortedList);\n }\n return sortedList;\n };\n\n private handleChange = (key, items) => {\n const name = items[key];\n const { actionItems, onChange, selectedKey } = this.props;\n const selectedActionItem = actionItems && actionItems.find((ai) => key === ai.actionKey);\n const title = selectedActionItem ? selectedActionItem.actionTitle : name;\n if (title !== this.state.title) {\n this.setState({ title });\n }\n if (key !== selectedKey) {\n onChange && onChange(key, name, this.state.resources[key]);\n }\n };\n\n private onChange = (key: string) => {\n this.handleChange(key, this.state.items);\n };\n\n render() {\n return (\n <Dropdown\n id={this.props.id}\n ariaLabel={this.props.ariaLabel}\n className={this.props.className}\n dropDownClassName={this.props.dropDownClassName}\n menuClassName={this.props.menuClassName}\n buttonClassName={this.props.buttonClassName}\n titlePrefix={this.props.titlePrefix}\n autocompleteFilter={this.props.autocompleteFilter || fuzzy}\n actionItems={this.props.actionItems}\n items={this.state.items}\n onChange={this.onChange}\n selectedKey={this.props.selectedKey}\n title={this.props.title || this.state.title}\n autocompletePlaceholder={this.props.placeholder}\n userSettingsPrefix={this.props.userSettingsPrefix}\n storageKey={this.props.storageKey}\n disabled={this.props.disabled}\n />\n );\n }\n}\n\nexport default withTranslation()(ResourceDropdown);\n","import * as React from 'react';\nimport { HourglassHalfIcon } from '@patternfly/react-icons/dist/esm/icons/hourglass-half-icon';\nimport { useTranslation } from 'react-i18next';\nimport {\n GenericStatus,\n StatusComponentProps,\n ErrorStatus as SdkErrorStatus,\n InfoStatus as SdkInfoStatus,\n ProgressStatus as SdkProgressStatus,\n SuccessStatus as SdkSuccessStatus,\n} from '@console/dynamic-plugin-sdk';\nimport { YellowExclamationTriangleIcon } from './icons';\n\nexport const ErrorStatus: React.FC<StatusComponentProps> = ({ title, ...props }) => {\n const { t } = useTranslation();\n return <SdkErrorStatus {...props} title={title || t('console-shared~Error')} />;\n};\n\nexport const InfoStatus: React.FC<StatusComponentProps> = ({ title, ...props }) => {\n const { t } = useTranslation();\n return <SdkInfoStatus {...props} title={title || t('console-shared~Information')} />;\n};\n\nexport const ProgressStatus: React.FC<StatusComponentProps> = ({ title, ...props }) => {\n const { t } = useTranslation();\n return <SdkProgressStatus {...props} title={title || t('console-shared~In progress')} />;\n};\n\nexport const SuccessStatus: React.FC<StatusComponentProps> = ({ title, ...props }) => {\n const { t } = useTranslation();\n return <SdkSuccessStatus {...props} title={title || t('console-shared~Healthy')} />;\n};\n\nexport const PendingStatus: React.FC<StatusComponentProps> = (props) => {\n const { t } = useTranslation();\n return (\n <GenericStatus\n {...props}\n Icon={HourglassHalfIcon}\n title={props.title || t('console-shared~Pending')}\n />\n );\n};\nPendingStatus.displayName = 'PendingStatus';\n\nexport const WarningStatus: React.FC<StatusComponentProps> = (props) => {\n const { t } = useTranslation();\n return (\n <GenericStatus\n {...props}\n Icon={YellowExclamationTriangleIcon}\n title={props.title || t('console-shared~Warning')}\n />\n );\n};\nWarningStatus.displayName = 'WarningStatus';\n","import * as React from 'react';\nimport * as _ from 'lodash';\n\ntype SecondaryStatusProps = {\n status?: string | string[];\n className?: string;\n dataStatusID?: string;\n};\n\nconst SecondaryStatus: React.FC<SecondaryStatusProps> = ({ status, className, dataStatusID }) => {\n const statusLabel = _.compact(_.concat([], status)).join(', ');\n const cssClassName = className || '';\n if (statusLabel) {\n return (\n <div data-status-id={dataStatusID}>\n <small className={`${cssClassName} text-muted`}>{statusLabel}</small>\n </div>\n );\n }\n return null;\n};\n\nexport default SecondaryStatus;\n","import * as React from 'react';\nimport { TextInput, TextInputTypes, ValidatedOptions } from '@patternfly/react-core';\nimport BaseInputField from './BaseInputField';\nimport { BaseInputFieldProps } from './field-types';\n\nimport './InputField.scss';\n\nconst InputField: React.FC<BaseInputFieldProps> = (\n { type = TextInputTypes.text, ...baseProps },\n ref,\n) => (\n <BaseInputField type={type} {...baseProps}>\n {(props) => (\n <div className=\"oc-inputfield\">\n <TextInput ref={ref} {...props} />\n {props.validated && props.validated !== ValidatedOptions.default ? (\n <div\n className={`oc-inputfield__validation-icon ${props.validated}`}\n // The BaseInputField will show an description (helper-text) below\n // the input field that describes the validation error.\n aria-hidden=\"true\"\n />\n ) : null}\n </div>\n )}\n </BaseInputField>\n);\n\nexport default React.forwardRef(InputField);\n","import * as React from 'react';\nimport { Radio } from '@patternfly/react-core';\nimport { useField, useFormikContext, FormikValues } from 'formik';\nimport { RadioButtonFieldProps } from './field-types';\nimport { getFieldId } from './field-utils';\n\nconst RadioButtonField: React.FC<RadioButtonFieldProps> = ({\n name,\n label,\n value,\n onChange,\n isChecked,\n ...props\n}) => {\n const [field, { touched, error }] = useField(name);\n const { setFieldValue, setFieldTouched } = useFormikContext<FormikValues>();\n const fieldId = getFieldId(`${name}-${value}`, 'radiobutton');\n const isValid = !(touched && error);\n return (\n <Radio\n {...field}\n {...props}\n id={fieldId}\n value={value}\n label={label}\n isChecked={isChecked || field.value === value}\n isValid={isValid}\n isDisabled={props.isDisabled}\n aria-label={`${fieldId}-${label}`}\n data-test={`${value}-view-input`}\n data-checked-state={isChecked || field.value === value}\n onChange={() => {\n if (onChange) {\n onChange(value);\n } else {\n setFieldValue(name, value);\n }\n setFieldTouched(name, true);\n }}\n />\n );\n};\n\nexport default RadioButtonField;\n","import * as React from 'react';\nimport { FormGroup, FormHelperText, HelperText, HelperTextItem } from '@patternfly/react-core';\nimport * as classNames from 'classnames';\nimport { useField } from 'formik';\nimport { RedExclamationCircleIcon } from '../status';\nimport { RadioGroupFieldProps } from './field-types';\nimport { getFieldId } from './field-utils';\nimport RadioButtonField from './RadioButtonField';\n\nimport './RadioGroupField.scss';\n\nconst RadioGroupField: React.FC<RadioGroupFieldProps> = ({\n label,\n labelIcon,\n options,\n helpText,\n required,\n isInline,\n onChange,\n ...props\n}) => {\n const [field, { touched, error }] = useField(props.name);\n const fieldId = getFieldId(props.name, 'radiogroup');\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n return (\n <FormGroup\n className={classNames('ocs-radio-group-field', { 'ocs-radio-group-field--inline': isInline })}\n fieldId={fieldId}\n isRequired={required}\n label={label}\n labelIcon={labelIcon}\n isInline={isInline}\n >\n {options.map((option) => {\n const activeChild = field.value === option.value && option.activeChildren;\n const staticChild = option.children;\n\n const description = (activeChild || staticChild) && (\n <div className=\"ocs-radio-group-field__children\">\n {staticChild}\n {activeChild}\n </div>\n );\n\n return (\n <React.Fragment key={option.value}>\n <RadioButtonField\n {...field}\n {...props}\n value={option.value}\n label={option.label}\n isDisabled={option.isDisabled}\n isChecked={option.isChecked}\n aria-describedby={helpText ? `${fieldId}-helper` : undefined}\n description={description}\n onChange={onChange}\n />\n </React.Fragment>\n );\n })}\n\n <FormHelperText>\n <HelperText>\n {!isValid ? (\n <HelperTextItem variant=\"error\" icon={<RedExclamationCircleIcon />}>\n {errorMessage}\n </HelperTextItem>\n ) : (\n <HelperTextItem>{helpText}</HelperTextItem>\n )}\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n};\n\nexport default RadioGroupField;\n","import { ValidatedOptions, TextInputTypes, gridItemSpanValueShape } from '@patternfly/react-core';\nimport { SelectVariant as SelectVariantDeprecated } from '@patternfly/react-core/deprecated';\nimport { JSONSchema7 } from 'json-schema';\nimport { K8sKind, K8sResourceKind } from '@console/internal/module/k8s';\nimport { RowRendererProps } from './multi-column-field/MultiColumnFieldRow';\n\nexport interface FieldProps {\n name: string;\n label?: React.ReactNode;\n helpText?: React.ReactNode;\n helpTextInvalid?: React.ReactNode;\n required?: boolean;\n style?: React.CSSProperties;\n isReadOnly?: boolean;\n className?: string;\n isDisabled?: boolean;\n validated?: ValidatedOptions;\n dataTest?: string;\n}\n\nexport interface DroppableFileInputFieldProps extends FieldProps {\n onChange?: (fileData: string) => void;\n}\nexport interface BaseInputFieldProps extends FieldProps {\n type?: TextInputTypes;\n placeholder?: string;\n onChange?: (event) => void;\n onBlur?: (event) => void;\n autoComplete?: string;\n}\n\nexport interface GroupInputProps extends BaseInputFieldProps {\n beforeInput?: React.ReactNode;\n afterInput?: React.ReactNode;\n groupTextType?: GroupTextType;\n}\n\nexport interface TextAreaProps extends FieldProps {\n placeholder?: string;\n onChange?: (event) => void;\n onBlur?: (event) => void;\n rows?: number;\n resizeOrientation?: 'vertical' | 'horizontal' | 'both';\n}\n\nexport enum GroupTextType {\n TextInput = 'text',\n TextArea = 'textArea',\n}\n\nexport interface CheckboxFieldProps extends FieldProps {\n formLabel?: string;\n value?: string;\n onChange?: (val: boolean) => void;\n}\n\nexport interface SearchInputFieldProps extends BaseInputFieldProps {\n onSearch: (searchTerm: string) => void;\n}\n\nexport interface DropdownFieldProps extends FieldProps {\n items?: object;\n selectedKey?: string;\n title?: React.ReactNode;\n fullWidth?: boolean;\n disabled?: boolean;\n autocompleteFilter?: (text: string, item: object, key?: string) => boolean;\n onChange?: (value: string) => void;\n placeholder?: string;\n}\n\nexport type FormSelectFieldOption<T = any> = {\n label: string;\n value: T;\n isPlaceholder?: boolean;\n isDisabled?: boolean;\n};\n\nexport type FormSelectFieldProps = FieldProps & {\n isDisabled?: boolean;\n options: FormSelectFieldOption[];\n onChange?: (selectedValue: any) => void;\n};\n\nexport interface EnvironmentFieldProps extends FieldProps {\n obj: K8sResourceKind;\n envs?: (NameValuePair | NameValueFromPair)[];\n}\n\nexport interface ResourceLimitFieldProps extends FieldProps {\n unitName: string;\n unitOptions: object;\n fullWidth?: boolean;\n}\n\nexport interface MultiColumnFieldProps extends FieldProps {\n addLabel?: string;\n emptyValues: { [name: string]: string | boolean | string[] };\n emptyMessage?: string;\n headers: ({ name: string; required: boolean } | string)[];\n complexFields?: boolean[];\n children?: React.ReactNode;\n spans?: gridItemSpanValueShape[];\n rowRenderer?: (row: RowRendererProps) => React.ReactNode;\n disableDeleteRow?: boolean;\n tooltipDeleteRow?: string;\n disableAddRow?: boolean;\n tooltipAddRow?: string;\n}\n\nexport interface CodeEditorFieldProps extends FieldProps {\n model?: K8sKind;\n minHeight?: string;\n language?: string;\n schema?: JSONSchema7;\n showSamples: boolean;\n showShortcuts?: boolean;\n showMiniMap?: boolean;\n onSave?: () => void;\n}\n\nexport interface NameValuePair {\n name: string;\n value: string;\n}\n\nexport interface NameValueFromPair {\n name: string;\n valueFrom: ConfigMapKeyRef | SecretKeyRef;\n}\n\nexport interface ConfigMapKeyRef {\n configMapKeyRef: {\n key: string;\n name: string;\n };\n}\n\nexport interface SecretKeyRef {\n secretKeyRef: {\n key: string;\n name: string;\n };\n}\n\nexport interface RadioButtonFieldProps extends FieldProps {\n value: React.ReactText;\n description?: React.ReactNode;\n onChange?: (value: React.ReactText) => void;\n isChecked?: boolean;\n}\n\nexport interface RadioGroupFieldProps extends FieldProps {\n isInline?: boolean;\n labelIcon?: React.ReactElement;\n options: RadioGroupOption[];\n onChange?: (value: React.ReactText) => void;\n}\n\nexport interface RadioGroupOption {\n value: React.ReactText;\n label: React.ReactNode;\n isDisabled?: boolean;\n isChecked?: boolean;\n children?: React.ReactNode;\n activeChildren?: React.ReactElement;\n}\n\nexport interface SelectInputOption {\n value: string;\n label?: string;\n description?: string;\n disabled?: boolean;\n}\n\nexport interface SelectInputFieldProps extends FieldProps {\n ariaLabel?: string;\n options: SelectInputOption[];\n variant?: SelectVariantDeprecated;\n placeholderText?: React.ReactNode;\n isCreatable?: boolean;\n isDisabled?: boolean;\n hasOnCreateOption?: boolean;\n isInputValuePersisted?: boolean;\n noResultsFoundText?: string;\n toggleOnSelection?: boolean;\n hideClearButton?: boolean;\n onChange?: (selection: string) => void;\n getLabelFromValue?: (value: string) => string;\n}\n","import * as React from 'react';\nimport { ChartDonut } from '@patternfly/react-charts';\nimport { Tooltip } from '@patternfly/react-core';\nimport * as _ from 'lodash';\nimport { podColor, AllPodStatus } from '../../constants';\nimport { useForceUpdate } from '../../hooks/useForceUpdate';\nimport { ExtPodKind } from '../../types';\nimport { calculateRadius, podStatus, getPodStatus } from '../../utils/pod-utils';\n\nimport './PodStatus.scss';\n\nconst ANIMATION_DURATION = 350;\nconst MAX_POD_TITLE_LENGTH = 14;\n\ntype PodData = {\n x: string;\n y: number;\n};\n\ninterface PodStatusProps {\n innerRadius?: number;\n outerRadius?: number;\n size?: number;\n standalone?: boolean;\n x?: number;\n y?: number;\n data: ExtPodKind[];\n showTooltip?: boolean;\n title?: string;\n titleComponent?: React.ReactElement;\n subTitle?: string;\n subTitleComponent?: React.ReactElement;\n}\n\nconst { podStatusInnerRadius, podStatusOuterRadius } = calculateRadius(130); // default value of size is 130\n\nconst podStatusIsNumeric = (podStatusValue: string) => {\n return (\n podStatusValue !== AllPodStatus.ScaledTo0 &&\n podStatusValue !== AllPodStatus.AutoScaledTo0 &&\n podStatusValue !== AllPodStatus.Idle &&\n podStatusValue !== AllPodStatus.ScalingUp\n );\n};\n\nconst PodStatus: React.FC<PodStatusProps> = ({\n innerRadius = podStatusInnerRadius,\n outerRadius = podStatusOuterRadius,\n x,\n y,\n size = 130,\n standalone = false,\n showTooltip = true,\n title,\n subTitle = '',\n titleComponent,\n subTitleComponent,\n data,\n}) => {\n const ref = React.useRef();\n const [updateOnEnd, setUpdateOnEnd] = React.useState<boolean>(false);\n const forceUpdate = useForceUpdate();\n const prevVData = React.useRef<PodData[]>(null);\n\n const vData = React.useMemo(() => {\n const updateVData: PodData[] = podStatus.map((pod) => ({\n x: pod,\n y: _.sumBy(data, (d) => +(getPodStatus(d) === pod)) || 0,\n }));\n\n if (_.isEmpty(data)) {\n _.update(\n updateVData,\n `[${_.findKey(updateVData, { x: AllPodStatus.ScaledTo0 })}]['y']`,\n () => 1,\n );\n }\n\n const prevDataPoints = _.size(_.filter(prevVData.current, (nextData) => nextData.y !== 0));\n const dataPoints = _.size(_.filter(updateVData, (nextData) => nextData.y !== 0));\n setUpdateOnEnd(dataPoints === 1 && prevDataPoints > 1);\n\n if (!_.isEqual(prevVData.current, updateVData)) {\n prevVData.current = updateVData;\n return updateVData;\n }\n return prevVData.current;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data]);\n const truncTitle = title ? _.truncate(title, { length: MAX_POD_TITLE_LENGTH }) : undefined;\n const truncSubTitle = subTitle\n ? _.truncate(subTitle, { length: MAX_POD_TITLE_LENGTH })\n : undefined;\n const chartDonut = React.useMemo(() => {\n return (\n <ChartDonut\n ariaTitle={`${title}${subTitle && ` ${subTitle}`}`}\n animate={{\n duration: prevVData.current ? ANIMATION_DURATION : 0,\n onEnd: updateOnEnd ? forceUpdate : undefined,\n }}\n standalone={standalone}\n innerRadius={innerRadius}\n radius={outerRadius}\n groupComponent={x && y ? <g transform={`translate(${x}, ${y})`} /> : undefined}\n data={vData}\n height={size}\n width={size}\n title={truncTitle}\n titleComponent={titleComponent}\n subTitleComponent={subTitleComponent}\n subTitle={truncSubTitle}\n allowTooltip={false}\n labels={() => null}\n padAngle={({ datum }) => (datum.y > 0 ? 2 : 0)}\n style={{\n data: {\n fill: ({ datum }) => podColor[datum.x],\n stroke: ({ datum }) =>\n !podStatusIsNumeric(datum.x) && datum.y > 0 ? '#BBBBBB' : 'none',\n strokeWidth: 1,\n },\n }}\n />\n );\n }, [\n forceUpdate,\n innerRadius,\n outerRadius,\n size,\n standalone,\n subTitle,\n title,\n truncSubTitle,\n subTitleComponent,\n truncTitle,\n titleComponent,\n updateOnEnd,\n vData,\n x,\n y,\n ]);\n\n if (!vData) {\n return null;\n }\n\n if (showTooltip) {\n const tipContent = (\n <div className=\"odc-pod-status-tooltip\">\n {vData.map((d) => {\n return d.y > 0 ? (\n <div key={d.x} className=\"odc-pod-status-tooltip__content\">\n <span\n className=\"odc-pod-status-tooltip__status-box\"\n style={{ background: podColor[d.x] }}\n />\n {podStatusIsNumeric(d.x) && (\n <span key={3} className=\"odc-pod-status-tooltip__status-count\">\n {`${Math.round(d.y)}`}\n </span>\n )}\n {d.x}\n </div>\n ) : null;\n })}\n </div>\n );\n return (\n <Tooltip triggerRef={ref} content={tipContent}>\n <g ref={ref}>{chartDonut}</g>\n </Tooltip>\n );\n }\n return chartDonut;\n};\n\nexport default React.memo((props: PodStatusProps) => <PodStatus {...props} />);\n","import * as React from 'react';\nimport { DraggableEvent } from 'react-draggable';\nimport { CSSTransition } from 'react-transition-group';\nimport DraggableCoreIFrameFix from './DraggableCoreIFrameFix';\nimport './Drawer.scss';\n\ntype DrawerProps = {\n /**\n * Controlled height of the drawer.\n * Should be set when used as controlled component with onChange callback.\n */\n height?: number;\n /**\n * Default Value: 300\n * Uncontrolled default height of the drawer.\n */\n defaultHeight?: number;\n /**\n * Toggles controlled open state.\n */\n open?: boolean;\n /**\n * Default Value: true\n * Uncontrolled open state of the drawer on first render.\n */\n defaultOpen?: boolean;\n /**\n * Maximum height drawer can be resized to.\n */\n maxHeight?: number | string;\n /**\n * Set whether the drawer is resizable or not.\n */\n resizable?: boolean;\n /**\n * Content for the Header of drawer\n */\n header?: React.ReactNode;\n /**\n * This callback is invoked while resizing the drawer.\n * @param open boolean: false when the drawer reached minimum height (minimized state)\n * @param height number: Height of the drawer while resizing\n */\n onChange?: (open: boolean, height: number) => void;\n};\n\nconst useSize = <T extends HTMLElement>(): [number, (element: T) => void] => {\n const [height, setHeight] = React.useState<number>(0);\n\n const callback = React.useCallback((element: T): void => {\n if (element) {\n const bb = element.getBoundingClientRect();\n setHeight(bb.height);\n }\n }, []);\n return [height, callback];\n};\n\n// get the pageX value from a mouse or touch event\nconst getPageY = (e: DraggableEvent): number =>\n (e as MouseEvent).pageY ?? (e as TouchEvent).touches?.[0]?.pageY;\n\nconst Drawer: React.FC<DrawerProps> = ({\n children,\n defaultHeight = 300,\n height,\n maxHeight = '100%',\n open,\n defaultOpen = true,\n resizable = false,\n header,\n onChange,\n}) => {\n const drawerRef = React.useRef<HTMLDivElement>();\n const [heightState, setHeightState] = React.useState(defaultHeight);\n const [openState, setOpenState] = React.useState(defaultOpen);\n const lastObservedHeightRef = React.useRef<number>();\n const startRef = React.useRef<number>();\n const [minHeight, headerRef] = useSize<HTMLDivElement>();\n const minimumHeight = minHeight ?? 0;\n\n // merge controlled and uncontrolled states\n const currentOpen = open ?? openState;\n const currentHeight = height ?? heightState;\n\n const setHeight = (drawerHeight: number, forceOpen?: boolean) => {\n const newHeight = Math.max(drawerHeight, minimumHeight);\n const newOpen = forceOpen ?? newHeight > minimumHeight;\n setHeightState(newHeight);\n setOpenState(newOpen);\n if (onChange) {\n onChange(newOpen, newHeight);\n }\n };\n\n const handleDrag = (e: DraggableEvent) => {\n setHeight(startRef.current - getPageY(e));\n };\n\n const handleResizeStart = (e: DraggableEvent) => {\n e.preventDefault();\n lastObservedHeightRef.current = currentHeight;\n // always start with actual drawer height\n const drawerHeight = drawerRef.current?.offsetHeight || currentHeight;\n startRef.current = drawerHeight + getPageY(e);\n if (drawerHeight !== currentHeight) {\n setHeight(drawerHeight);\n }\n };\n\n const handleResizeStop = () => {\n if (currentHeight <= minimumHeight) {\n setHeight(lastObservedHeightRef.current, false);\n }\n };\n\n const draggable = resizable && (\n <DraggableCoreIFrameFix\n onDrag={handleDrag}\n onStart={handleResizeStart}\n onStop={handleResizeStop}\n >\n <div className=\"ocs-drawer__drag-handle\" />\n </DraggableCoreIFrameFix>\n );\n return (\n <CSSTransition appear in timeout={225} classNames=\"ocs-drawer\">\n <div\n ref={drawerRef}\n className=\"ocs-drawer\"\n style={{\n height: currentOpen ? currentHeight : minimumHeight,\n maxHeight,\n minHeight: minimumHeight,\n }}\n >\n {draggable}\n <div ref={headerRef} className=\"ocs-drawer__header\">\n {header}\n </div>\n <div className=\"ocs-drawer__body\">{children}</div>\n </div>\n </CSSTransition>\n );\n};\n\nexport default Drawer;\n","export { default as VirtualizedGrid } from './VirtualizedGrid';\n","import * as React from 'react';\nimport { Alert, AlertGroup, AlertActionCloseButton, AlertActionLink } from '@patternfly/react-core';\nimport ToastContext, { ToastOptions, ToastContextType } from './ToastContext';\n\nconst ToastProvider: React.FC = ({ children }) => {\n const [toasts, setToasts] = React.useState<ToastOptions[]>([]);\n\n const removeToast = React.useCallback((id: string) => {\n setToasts((state) => {\n const index = state.findIndex((t) => t.id === id);\n if (index !== -1) {\n const toast = state[index];\n if (toast.onRemove) {\n toast.onRemove(toast.id);\n }\n return [...state.slice(0, index), ...state.slice(index + 1, state.length)];\n }\n return state;\n });\n }, []);\n\n const addToast = React.useMemo(() => {\n let counter = 0;\n return (toast: ToastOptions) => {\n const clone: ToastOptions = {\n id: `toast-${++counter}`,\n ...toast,\n };\n setToasts((state) => {\n const index = state.findIndex((t) => t.id === clone.id);\n if (index !== -1) {\n return [...state.slice(0, index), clone, ...state.slice(index + 1, state.length)];\n }\n return [...state, clone];\n });\n return clone.id;\n };\n }, []);\n\n const controller: ToastContextType = React.useMemo<ToastContextType>(\n () => ({\n addToast,\n removeToast,\n }),\n [addToast, removeToast],\n );\n\n return (\n <ToastContext.Provider value={controller}>\n {children}\n {toasts.length ? (\n <AlertGroup appendTo={() => document.body} isToast>\n {toasts.map((toast) => (\n <Alert\n key={toast.id}\n isLiveRegion\n title={toast.title}\n variant={toast.variant}\n timeout={toast.timeout}\n onTimeout={() => removeToast(toast.id)}\n data-test={toast.dataTest || `${toast.title} alert`}\n actionClose={\n toast.dismissible ? (\n <AlertActionCloseButton\n onClose={() => {\n toast.onClose && toast.onClose();\n removeToast(toast.id);\n }}\n />\n ) : undefined\n }\n actionLinks={\n toast.actions?.length > 0 ? (\n <>\n {toast.actions.map((action) => (\n <AlertActionLink\n key={action.label}\n onClick={() => {\n if (action.dismiss) {\n removeToast(toast.id);\n }\n action.callback();\n }}\n component={action.component}\n data-test={action.dataTest || 'toast-action'}\n >\n {action.label}\n </AlertActionLink>\n ))}\n </>\n ) : undefined\n }\n >\n {toast.content}\n </Alert>\n ))}\n </AlertGroup>\n ) : null}\n </ToastContext.Provider>\n );\n};\nexport default ToastProvider;\n","import * as React from 'react';\nimport { VerticalTabs, VerticalTabsTab } from '@patternfly/react-catalog-view-extension';\nimport * as cx from 'classnames';\nimport * as _ from 'lodash';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { isModifiedEvent } from '@console/shared/src/utils';\nimport { getURLWithParams } from '../utils/catalog-utils';\nimport { hasActiveDescendant, isActiveTab } from '../utils/category-utils';\nimport { CatalogCategory, CatalogQueryParams } from '../utils/types';\n\ntype CatalogCategoriesProp = {\n categories: CatalogCategory[];\n categorizedIds: Record<string, string[]>;\n selectedCategory: string;\n onSelectCategory: (category: string) => void;\n};\n\nconst CatalogCategories: React.FC<CatalogCategoriesProp> = ({\n categories,\n categorizedIds,\n selectedCategory,\n onSelectCategory,\n}) => {\n const activeTab = _.has(categories, selectedCategory);\n\n const renderTabs = (\n category: CatalogCategory & { numItems?: number },\n selectedCategoryID: string,\n toplevelCategory: boolean,\n ) => {\n if (!categorizedIds[category.id]) return null;\n\n const { id, label, subcategories, numItems } = category;\n const active = id === selectedCategory;\n\n const tabClasses = cx('text-capitalize', { 'co-catalog-tab__empty': !numItems });\n\n return (\n <VerticalTabsTab\n key={id}\n active={active}\n className={tabClasses}\n hasActiveDescendant={hasActiveDescendant(selectedCategory, category)}\n shown={toplevelCategory}\n data-test={`tab ${id}`}\n component={() => (\n <Link\n to={getURLWithParams(CatalogQueryParams.CATEGORY, id)}\n onClick={(e) => {\n if (isModifiedEvent(e)) return;\n e.preventDefault();\n onSelectCategory(id);\n }}\n >\n {label}\n </Link>\n )}\n >\n {subcategories && (\n <VerticalTabs restrictTabs activeTab={isActiveTab(selectedCategoryID, category)}>\n {_.map(subcategories, (subcategory) =>\n renderTabs(subcategory, selectedCategoryID, false),\n )}\n </VerticalTabs>\n )}\n </VerticalTabsTab>\n );\n };\n\n return (\n <VerticalTabs restrictTabs activeTab={activeTab} data-test=\"catalog-categories\">\n {_.map(categories, (category) => renderTabs(category, selectedCategory, true))}\n </VerticalTabs>\n );\n};\n\nexport default CatalogCategories;\n","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/catalog-icon.svg\";","import * as React from 'react';\nimport {\n Button,\n EmptyState,\n EmptyStateBody,\n EmptyStateIcon,\n EmptyStateVariant,\n EmptyStateActions,\n EmptyStateHeader,\n EmptyStateFooter,\n} from '@patternfly/react-core';\nimport { SearchIcon } from '@patternfly/react-icons/dist/esm/icons/search-icon';\nimport { useTranslation } from 'react-i18next';\n\ntype CatalogEmptyStateProps = {\n onClear: () => void;\n};\n\nconst CatalogEmptyState: React.FC<CatalogEmptyStateProps> = ({ onClear }) => {\n const { t } = useTranslation();\n return (\n <EmptyState variant={EmptyStateVariant.full}>\n <EmptyStateHeader\n titleText={<>{t('console-shared~No results found')}</>}\n icon={<EmptyStateIcon icon={SearchIcon} />}\n headingLevel=\"h2\"\n />\n <EmptyStateBody>\n {t(\n 'console-shared~No results match the filter criteria. Remove filters or clear all filters to show results.',\n )}\n </EmptyStateBody>\n <EmptyStateFooter>\n <EmptyStateActions>\n <Button variant=\"link\" onClick={onClear} data-test-id=\"catalog-clear-filters\">\n {t('console-shared~Clear all filters')}\n </Button>\n </EmptyStateActions>\n </EmptyStateFooter>\n </EmptyState>\n );\n};\n\nexport default CatalogEmptyState;\n","import * as React from 'react';\nimport { Title } from '@patternfly/react-core';\nimport * as _ from 'lodash';\nimport { CatalogItem } from '@console/dynamic-plugin-sdk/src/extensions';\nimport { VirtualizedGrid } from '../../virtualized-grid';\n\ntype CatalogGridProps = {\n items: CatalogItem[] | { [key: string]: CatalogItem[] };\n renderTile: (item: CatalogItem) => React.ReactNode;\n isGrouped: boolean;\n};\n\nconst CatalogGrid: React.FC<CatalogGridProps> = ({ items, renderTile, isGrouped }) => {\n const renderGroupHeader = (heading) => (\n <Title className=\"co-catalog-page__group-title\" headingLevel=\"h2\" size=\"lg\">\n {heading} ({_.size(items[heading])})\n </Title>\n );\n\n return (\n <div className=\"co-catalog-page__grid\">\n <VirtualizedGrid\n items={items}\n renderCell={renderTile}\n renderHeader={renderGroupHeader}\n isItemsGrouped={isGrouped}\n />\n </div>\n );\n};\n\nexport default CatalogGrid;\n","import * as React from 'react';\nimport { SearchInput } from '@patternfly/react-core';\nimport * as _ from 'lodash';\nimport * as ReactDOM from 'react-dom';\nimport { useTranslation } from 'react-i18next';\nimport { Dropdown } from '@console/internal/components/utils';\nimport { NO_GROUPING } from '../utils/category-utils';\nimport { CatalogSortOrder, CatalogStringMap } from '../utils/types';\n\ntype CatalogToolbarProps = {\n title: string;\n totalItems: number;\n searchKeyword: string;\n sortOrder: CatalogSortOrder;\n groupings: CatalogStringMap;\n activeGrouping: string;\n onGroupingChange: (grouping: string) => void;\n onSearchKeywordChange: (searchKeyword: string) => void;\n onSortOrderChange: (sortOrder: CatalogSortOrder) => void;\n};\n\n// TODO: update to use inputRef on SearchInput once https://github.com/patternfly/patternfly-react/issues/5168 is fixed.\nconst CatalogToolbar = React.forwardRef<HTMLInputElement, CatalogToolbarProps>(\n (\n {\n title,\n totalItems,\n searchKeyword,\n sortOrder,\n groupings,\n activeGrouping,\n onGroupingChange,\n onSearchKeywordChange,\n onSortOrderChange,\n },\n toolbarRef,\n ) => {\n const { t } = useTranslation();\n const inputRef = React.useRef<HTMLDivElement>();\n\n const catalogSortItems = {\n [CatalogSortOrder.ASC]: t('console-shared~A-Z'),\n [CatalogSortOrder.DESC]: t('console-shared~Z-A'),\n };\n\n const showGrouping = !_.isEmpty(groupings);\n\n const catalogGroupItems = {\n ...groupings,\n [NO_GROUPING]: t('console-shared~None'),\n };\n\n React.useImperativeHandle(toolbarRef, () => {\n // TODO: Remove this hack once https://github.com/patternfly/patternfly-react/issues/5168 is fixed.\n // eslint-disable-next-line react/no-find-dom-node\n const toolbarDOMNode = ReactDOM.findDOMNode(inputRef.current) as HTMLDivElement;\n return toolbarDOMNode.querySelector('.pf-v5-c-search-input__text-input') as HTMLInputElement;\n });\n\n return (\n <div className=\"co-catalog-page__header\">\n <div className=\"co-catalog-page__heading text-capitalize\">{title}</div>\n <div className=\"co-catalog-page__filter\">\n <div ref={inputRef} className=\"co-catalog-page__searchfilter\">\n <SearchInput\n className=\"co-catalog-page__input\"\n data-test=\"search-catalog\"\n type=\"text\"\n placeholder={t('console-shared~Filter by keyword...')}\n value={searchKeyword}\n onChange={(event, text) => onSearchKeywordChange(text)}\n onClear={() => onSearchKeywordChange('')}\n aria-label={t('console-shared~Filter by keyword...')}\n />\n <Dropdown\n className=\"co-catalog-page__sort\"\n items={catalogSortItems}\n title={catalogSortItems[sortOrder]}\n onChange={onSortOrderChange}\n />\n {showGrouping && (\n <Dropdown\n className=\"co-catalog-page__btn-group__group-by\"\n menuClassName=\"dropdown-menu--text-wrap\"\n items={catalogGroupItems}\n onChange={onGroupingChange}\n titlePrefix={t('console-shared~Group by')}\n title={catalogGroupItems[activeGrouping]}\n />\n )}\n </div>\n <div className=\"co-catalog-page__num-items\">\n {t('console-shared~{{totalItems}} items', { totalItems })}\n </div>\n </div>\n </div>\n );\n },\n);\n\nexport default CatalogToolbar;\n","import * as React from 'react';\nimport { VerticalTabs } from '@patternfly/react-catalog-view-extension';\nimport { Title } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { Link, useLocation } from 'react-router-dom-v5-compat';\nimport { SyncMarkdownView } from '@console/internal/components/markdown-view';\nimport { FieldLevelHelp } from '@console/internal/components/utils';\nimport { CatalogQueryParams, CatalogType, CatalogTypeCounts } from '../utils/types';\n\ninterface CatalogTypeSelectorProps {\n catalogTypes: CatalogType[];\n catalogTypeCounts: CatalogTypeCounts;\n}\n\nconst CatalogTypeSelector: React.FC<CatalogTypeSelectorProps> = ({\n catalogTypes,\n catalogTypeCounts,\n}) => {\n const { t } = useTranslation();\n const { pathname, search } = useLocation();\n\n const typeDescriptions = React.useMemo(\n () =>\n catalogTypes.map(\n (type) =>\n type.description &&\n catalogTypeCounts[type.value] > 0 && (\n <SyncMarkdownView key={type.value} content={type.description} inline />\n ),\n ),\n [catalogTypes, catalogTypeCounts],\n );\n\n return (\n <>\n <Title headingLevel=\"h4\" style={{ marginLeft: '14px' }}>\n {t('console-shared~Type')}\n <FieldLevelHelp>{typeDescriptions}</FieldLevelHelp>\n </Title>\n <VerticalTabs data-test=\"catalog-types\">\n {catalogTypes.map((type) => {\n const { value, label } = type;\n const typeCount = catalogTypeCounts[value];\n const queryParams = new URLSearchParams(search);\n queryParams.set(CatalogQueryParams.TYPE, type.value);\n\n const to = {\n pathname,\n search: `?${queryParams.toString()}`,\n };\n\n return typeCount > 0 ? (\n <li key={value} className=\"vertical-tabs-pf-tab\" data-test={`tab ${value}`}>\n <Link to={to}>{`${label} (${typeCount})`}</Link>\n </li>\n ) : null;\n })}\n </VerticalTabs>\n </>\n );\n};\n\nexport default CatalogTypeSelector;\n","import * as React from 'react';\nimport * as cx from 'classnames';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { CatalogItem } from '@console/dynamic-plugin-sdk/src/extensions';\nimport { isModalOpen } from '@console/internal/components/modals';\nimport { useQueryParams } from '../../../hooks/useQueryParams';\nimport { setURLParams, updateURLParams, getCatalogTypeCounts } from '../utils/catalog-utils';\nimport {\n categorize,\n findActiveCategory,\n ALL_CATEGORY,\n OTHER_CATEGORY,\n NO_GROUPING,\n} from '../utils/category-utils';\nimport {\n filterByAttributes,\n filterByCategory,\n filterBySearchKeyword,\n getActiveFilters,\n getFilterGroupCounts,\n getFilterSearchParam,\n} from '../utils/filter-utils';\nimport {\n CatalogCategory,\n CatalogFilterCounts,\n CatalogFilterGroupMap,\n CatalogFilters as FiltersType,\n CatalogQueryParams,\n CatalogSortOrder,\n CatalogStringMap,\n CatalogType,\n CatalogTypeCounts,\n} from '../utils/types';\nimport CatalogCategories from './CatalogCategories';\nimport CatalogEmptyState from './CatalogEmptyState';\nimport CatalogFilters from './CatalogFilters';\nimport CatalogGrid from './CatalogGrid';\nimport CatalogToolbar from './CatalogToolbar';\nimport CatalogTypeSelector from './CatalogTypeSelector';\n\ntype CatalogViewProps = {\n items: CatalogItem[];\n catalogType: string;\n catalogTypes: CatalogType[];\n categories?: CatalogCategory[];\n filters: FiltersType;\n filterGroups: string[];\n filterGroupMap: CatalogFilterGroupMap;\n groupings: CatalogStringMap;\n renderTile: (item: CatalogItem) => React.ReactNode;\n hideSidebar?: boolean;\n};\n\nconst CatalogView: React.FC<CatalogViewProps> = ({\n items,\n catalogType,\n catalogTypes,\n categories,\n filters,\n filterGroups,\n filterGroupMap,\n groupings,\n renderTile,\n hideSidebar,\n}) => {\n const { t } = useTranslation();\n const queryParams = useQueryParams();\n const activeCategoryId = queryParams.get(CatalogQueryParams.CATEGORY) ?? ALL_CATEGORY;\n const activeSearchKeyword = queryParams.get(CatalogQueryParams.KEYWORD) ?? '';\n const activeGrouping = queryParams.get(CatalogQueryParams.GROUPING) ?? NO_GROUPING;\n const sortOrder =\n (queryParams.get(CatalogQueryParams.SORT_ORDER) as CatalogSortOrder) ?? CatalogSortOrder.ASC;\n const activeFilters = React.useMemo(() => {\n const attributeFilters = {};\n\n _.each(filterGroups, (filterGroup) => {\n const attributeFilterParam = queryParams.get(filterGroup);\n try {\n _.set(attributeFilters, filterGroup, JSON.parse(attributeFilterParam));\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('could not update filters from url params: could not parse search params', e);\n }\n });\n\n return getActiveFilters(attributeFilters, filters);\n }, [filterGroups, filters, queryParams]);\n\n const [filterGroupsShowAll, setFilterGroupsShowAll] = React.useState<Record<string, boolean>>({});\n const [filterGroupCounts, setFilterGroupCounts] = React.useState<CatalogFilterCounts>({});\n const [catalogTypeCounts, setCatalogTypeCounts] = React.useState<CatalogTypeCounts>({});\n\n const isGrouped = _.has(groupings, activeGrouping);\n\n const catalogToolbarRef = React.useRef<HTMLInputElement>();\n\n const itemsSorter = React.useCallback(\n (itemsToSort) => _.orderBy(itemsToSort, ({ name }) => name.toLowerCase(), [sortOrder]),\n [sortOrder],\n );\n\n const clearFilters = React.useCallback(() => {\n const params = new URLSearchParams();\n catalogType && items.length > 0 && params.set('catalogType', catalogType);\n setURLParams(params);\n\n // Don't take focus if a modal was opened while the page was loading.\n if (!isModalOpen()) {\n // this doesn't work right now because of issue with PF SearchInput\n catalogToolbarRef.current && catalogToolbarRef.current.focus({ preventScroll: true });\n }\n }, [catalogType, items.length]);\n\n const handleCategoryChange = (categoryId) => {\n updateURLParams(CatalogQueryParams.CATEGORY, categoryId);\n };\n\n const handleFilterChange = React.useCallback(\n (filterType, id, value) => {\n const updatedFilters = _.set(activeFilters, [filterType, id, 'active'], value);\n updateURLParams(filterType, getFilterSearchParam(updatedFilters[filterType]));\n },\n [activeFilters],\n );\n\n const handleSearchKeywordChange = React.useCallback((searchKeyword) => {\n updateURLParams(CatalogQueryParams.KEYWORD, searchKeyword);\n }, []);\n\n const handleGroupingChange = React.useCallback((grouping) => {\n updateURLParams(CatalogQueryParams.GROUPING, grouping);\n }, []);\n\n const handleSortOrderChange = React.useCallback((order) => {\n updateURLParams(CatalogQueryParams.SORT_ORDER, order);\n }, []);\n\n const handleShowAllToggle = React.useCallback((groupName) => {\n setFilterGroupsShowAll((showAll) => {\n const updatedShowAll = _.clone(showAll);\n _.set(updatedShowAll, groupName, !(showAll[groupName] ?? false));\n return updatedShowAll;\n });\n }, []);\n\n const catalogCategories = React.useMemo<CatalogCategory[]>(() => {\n const allCategory = { id: ALL_CATEGORY, label: t('console-shared~All items') };\n const otherCategory = { id: OTHER_CATEGORY, label: t('console-shared~Other') };\n return [allCategory, ...(categories ?? []), otherCategory];\n }, [categories, t]);\n\n const categorizedIds = React.useMemo(() => categorize(items, catalogCategories), [\n catalogCategories,\n items,\n ]);\n\n const activeCategory = React.useMemo(\n () =>\n findActiveCategory(activeCategoryId, catalogCategories) ||\n findActiveCategory(ALL_CATEGORY, catalogCategories),\n [activeCategoryId, catalogCategories],\n );\n\n const filteredItems: CatalogItem[] = React.useMemo(() => {\n const filteredByCategoryItems = filterByCategory(items, activeCategoryId, categorizedIds);\n const filteredBySearchItems = filterBySearchKeyword(\n filteredByCategoryItems,\n activeSearchKeyword,\n );\n const filteredByAttributes = filterByAttributes(filteredBySearchItems, activeFilters);\n\n const filterCounts = getFilterGroupCounts(filteredBySearchItems, activeFilters, filterGroups);\n setFilterGroupCounts(filterCounts);\n\n const typeCounts = getCatalogTypeCounts(filteredBySearchItems, catalogTypes);\n setCatalogTypeCounts(typeCounts);\n\n return itemsSorter(filteredByAttributes);\n }, [\n activeCategoryId,\n activeFilters,\n activeSearchKeyword,\n catalogTypes,\n categorizedIds,\n filterGroups,\n items,\n itemsSorter,\n ]);\n\n const totalItems = filteredItems.length;\n\n const showCategories = Object.keys(categorizedIds ?? {}).length > 2;\n\n const showFilters = React.useMemo(\n () =>\n filterGroups.length > 0 &&\n !_.isEmpty(activeFilters) &&\n Object.values(activeFilters).some((filterGroup) => Object.keys(filterGroup).length > 0),\n [activeFilters, filterGroups.length],\n );\n\n const showTypeSelector = React.useMemo(\n () =>\n !catalogType &&\n catalogTypes?.length > 1 &&\n Object.values(catalogTypeCounts).some((count) => count),\n [catalogType, catalogTypeCounts, catalogTypes],\n );\n\n const showSidebar = !hideSidebar && (showCategories || showFilters || showTypeSelector);\n\n const catalogItems = React.useMemo(() => {\n if (!isGrouped) return filteredItems;\n\n return _.groupBy(filteredItems, (item) => item.attributes?.[activeGrouping]) as {\n [key: string]: CatalogItem[];\n };\n }, [activeGrouping, filteredItems, isGrouped]);\n\n React.useEffect(() => {\n catalogToolbarRef.current && catalogToolbarRef.current.focus({ preventScroll: true });\n }, []);\n\n return (\n <div className={cx('co-catalog-page', { 'co-catalog-page--with-sidebar': showSidebar })}>\n {showSidebar && (\n <div className=\"co-catalog-page__tabs\">\n {showCategories && (\n <CatalogCategories\n categories={catalogCategories}\n categorizedIds={categorizedIds}\n selectedCategory={activeCategoryId}\n onSelectCategory={handleCategoryChange}\n />\n )}\n {showTypeSelector && (\n <CatalogTypeSelector\n catalogTypes={catalogTypes}\n catalogTypeCounts={catalogTypeCounts}\n />\n )}\n {showFilters && (\n <CatalogFilters\n activeFilters={activeFilters}\n filterGroupCounts={filterGroupCounts}\n filterGroupMap={filterGroupMap}\n filterGroupsShowAll={filterGroupsShowAll}\n onShowAllToggle={handleShowAllToggle}\n onFilterChange={handleFilterChange}\n />\n )}\n </div>\n )}\n <div className=\"co-catalog-page__content\">\n <CatalogToolbar\n ref={catalogToolbarRef}\n title={activeCategory.label}\n totalItems={totalItems}\n searchKeyword={activeSearchKeyword}\n sortOrder={sortOrder}\n groupings={groupings}\n activeGrouping={activeGrouping}\n onGroupingChange={handleGroupingChange}\n onSortOrderChange={handleSortOrderChange}\n onSearchKeywordChange={handleSearchKeywordChange}\n />\n {totalItems > 0 ? (\n <CatalogGrid items={catalogItems} renderTile={renderTile} isGrouped={isGrouped} />\n ) : (\n <CatalogEmptyState onClear={clearFilters} />\n )}\n </div>\n </div>\n );\n};\n\nexport default CatalogView;\n","import * as React from 'react';\nimport { CatalogItemHeader } from '@patternfly/react-catalog-view-extension';\nimport { Split, SplitItem } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { CatalogItem } from '@console/dynamic-plugin-sdk/src/extensions';\nimport { ServiceBindingDeprecationAlertForModals } from '@console/service-binding-plugin/src/components/service-binding-utils/ServiceBindingAlerts';\nimport { Modal } from '../../modal';\nimport CatalogBadges from '../CatalogBadges';\nimport useCtaLink from '../hooks/useCtaLink';\nimport { getIconProps } from '../utils/catalog-utils';\nimport CatalogDetailsPanel from './CatalogDetailsPanel';\n\nimport './CatalogDetailsModal.scss';\n\ntype CatalogDetailsModalProps = {\n item: CatalogItem;\n onClose: () => void;\n};\n\nconst CatalogDetailsModal: React.FC<CatalogDetailsModalProps> = ({ item, onClose }) => {\n const { t } = useTranslation();\n const [to, label] = useCtaLink(item?.cta);\n\n if (!item) {\n return null;\n }\n\n const { name, title, badges, tags } = item;\n\n const provider = item.provider\n ? t('console-shared~Provided by {{provider}}', { provider: item.provider })\n : null;\n\n const vendor = <div>{provider}</div>;\n const isBindable = tags?.includes('bindable');\n\n const modalHeader = (\n <>\n <CatalogItemHeader\n className=\"co-catalog-page__overlay-header\"\n title={title || name}\n vendor={vendor}\n {...getIconProps(item)}\n />\n <Split className=\"odc-catalog-details-modal__header\">\n <SplitItem>\n {to && (\n <div className=\"co-catalog-page__overlay-actions\">\n <Link\n className=\"pf-v5-c-button pf-m-primary co-catalog-page__overlay-action\"\n to={to}\n role=\"button\"\n onClick={onClose}\n >\n {label}\n </Link>\n </div>\n )}\n </SplitItem>\n <SplitItem>{badges?.length > 0 ? <CatalogBadges badges={badges} /> : undefined}</SplitItem>\n </Split>\n </>\n );\n\n return (\n <Modal\n className=\"co-catalog-page__overlay co-catalog-page__overlay--right\"\n header={modalHeader}\n isOpen={!!item}\n onClose={onClose}\n title={item.name}\n aria-label={item.name}\n >\n {isBindable && (\n <div className=\"odc-catalog-details-modal__sbo_alert\">\n <ServiceBindingDeprecationAlertForModals />\n </div>\n )}\n <CatalogDetailsPanel item={item} />\n </Modal>\n );\n};\n\nexport default CatalogDetailsModal;\n","import { useQueryParams } from '../../../hooks/useQueryParams';\nimport { CatalogQueryParams } from '../utils/types';\n\nconst useCtaLink = (cta: { label: string; href?: string }): [string, string] => {\n const queryParams = useQueryParams();\n\n if (!cta) {\n return [null, null];\n }\n\n const { href, label } = cta;\n\n if (!href) {\n return [null, label];\n }\n\n const [url, params] = href.split('?');\n\n Object.values(CatalogQueryParams).map((q) => queryParams.delete(q)); // don't pass along catalog specific query params\n\n const to = params\n ? `${url}?${params}${queryParams.toString() !== '' ? `&${queryParams.toString()}` : ''}`\n : `${url}?${queryParams.toString()}`;\n\n return [to, label];\n};\n\nexport default useCtaLink;\n","import * as React from 'react';\nimport { PropertiesSidePanel, PropertyItem } from '@patternfly/react-catalog-view-extension';\nimport { Stack, StackItem } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { CatalogItem } from '@console/dynamic-plugin-sdk/src/extensions';\nimport { ExternalLink, SectionHeading, Timestamp } from '@console/internal/components/utils';\nimport { customPropertyPresent } from '../utils';\n\ntype CatalogDetailsPanelProps = {\n item: CatalogItem;\n};\n\nconst CatalogDetailsPanel: React.FC<CatalogDetailsPanelProps> = ({ item }) => {\n const { t } = useTranslation();\n const { description, provider, creationTimestamp, supportUrl, documentationUrl, details } = item;\n const created = Date.parse(creationTimestamp) ? (\n <Timestamp timestamp={creationTimestamp} />\n ) : (\n creationTimestamp\n );\n const notAvailable = (\n <span className=\"properties-side-panel-pf-property-label\">{t('console-shared~N/A')}</span>\n );\n const providerLabel = t('console-shared~Provider');\n const createdAtLabel = t('console-shared~Created at');\n const supportLabel = t('console-shared~Support');\n const documentationLabel = t('console-shared~Documentation');\n\n return (\n <div className=\"modal-body modal-body-border\">\n <div className=\"modal-body-content\">\n <div className=\"co-catalog-page__overlay-body\">\n <PropertiesSidePanel>\n {details?.properties\n ?.filter((property) => !property?.isHidden)\n ?.map((property) => (\n <PropertyItem\n key={property.label}\n label={property.label}\n value={property.value || notAvailable}\n />\n ))}\n {!customPropertyPresent(details, providerLabel) && (\n <PropertyItem label={providerLabel} value={provider || notAvailable} />\n )}\n {!customPropertyPresent(details, createdAtLabel) && (\n <PropertyItem label={createdAtLabel} value={created || notAvailable} />\n )}\n {!customPropertyPresent(details, supportLabel) && (\n <PropertyItem\n label={supportLabel}\n value={\n supportUrl ? (\n <ExternalLink href={supportUrl} text={t('console-shared~Get support')} />\n ) : (\n notAvailable\n )\n }\n />\n )}\n {!customPropertyPresent(details, documentationLabel) && (\n <PropertyItem\n label={documentationLabel}\n value={\n documentationUrl ? (\n <ExternalLink\n href={documentationUrl}\n text={t('console-shared~Refer documentation')}\n />\n ) : (\n notAvailable\n )\n }\n />\n )}\n </PropertiesSidePanel>\n {(details?.descriptions?.length || description) && (\n <div className=\"co-catalog-page__overlay-description\">\n <Stack hasGutter>\n {!details?.descriptions?.[0]?.label && (\n <SectionHeading text={t('console-shared~Description')} />\n )}\n {!details?.descriptions?.length && description && <p>{description}</p>}\n {details?.descriptions?.map((desc, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <StackItem key={index}>\n {desc.label && <SectionHeading text={desc.label} />}\n {desc.value}\n </StackItem>\n ))}\n </Stack>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default CatalogDetailsPanel;\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport { useResolvedExtensions, ResolvedExtension } from '@console/dynamic-plugin-sdk';\nimport {\n CatalogItemFilter,\n CatalogItemProvider,\n CatalogItemType,\n CatalogItemMetadataProvider,\n CatalogItemTypeMetadata,\n isCatalogItemFilter,\n isCatalogItemProvider,\n isCatalogItemType,\n isCatalogItemTypeMetadata,\n isCatalogItemMetadataProvider,\n} from '@console/dynamic-plugin-sdk/src/extensions';\n\nconst useCatalogExtensions = (\n catalogId: string,\n catalogType?: string,\n): [\n ResolvedExtension<CatalogItemType>[],\n ResolvedExtension<CatalogItemProvider>[],\n ResolvedExtension<CatalogItemFilter>[],\n ResolvedExtension<CatalogItemMetadataProvider>[],\n boolean,\n] => {\n const [itemTypeExtensions, itemTypesResolved] = useResolvedExtensions<CatalogItemType>(\n React.useCallback(\n (e): e is CatalogItemType =>\n isCatalogItemType(e) && (!catalogType || e.properties.type === catalogType),\n [catalogType],\n ),\n );\n\n const [typeMetadataExtensions, itemTypeMetadataResolved] = useResolvedExtensions<\n CatalogItemTypeMetadata\n >(\n React.useCallback(\n (e): e is CatalogItemTypeMetadata =>\n isCatalogItemTypeMetadata(e) && (!catalogType || e.properties.type === catalogType),\n [catalogType],\n ),\n );\n\n const [catalogProviderExtensions, providersResolved] = useResolvedExtensions<CatalogItemProvider>(\n React.useCallback(\n (e): e is CatalogItemProvider =>\n isCatalogItemProvider(e) &&\n _.castArray(e.properties.catalogId).includes(catalogId) &&\n (!catalogType || e.properties.type === catalogType),\n [catalogId, catalogType],\n ),\n );\n\n const [itemFilterExtensions, filtersResolved] = useResolvedExtensions<CatalogItemFilter>(\n React.useCallback(\n (e): e is CatalogItemFilter =>\n isCatalogItemFilter(e) &&\n _.castArray(e.properties.catalogId).includes(catalogId) &&\n (!catalogType || e.properties.type === catalogType),\n [catalogId, catalogType],\n ),\n );\n\n const [metadataProviderExtensions, metadataProvidersResolved] = useResolvedExtensions<\n CatalogItemMetadataProvider\n >(\n React.useCallback(\n (e): e is CatalogItemMetadataProvider =>\n isCatalogItemMetadataProvider(e) &&\n _.castArray(e.properties.catalogId).includes(catalogId) &&\n (!catalogType || e.properties.type === catalogType),\n [catalogId, catalogType],\n ),\n );\n\n const catalogTypeExtensions = React.useMemo<ResolvedExtension<CatalogItemType>[]>(\n () =>\n (catalogType\n ? itemTypeExtensions.filter((e) => e.properties.type === catalogType)\n : itemTypeExtensions\n ).map((e) => {\n const metadataExts = typeMetadataExtensions.filter(\n (em) => e.properties.type === em.properties.type,\n );\n if (metadataExts.length > 0) {\n return Object.assign({}, e, {\n properties: {\n ...e.properties,\n filters: [\n ...(e.properties.filters ?? []),\n ..._.flatten(metadataExts.map((em) => em.properties.filters).filter((x) => x)),\n ],\n groupings: [\n ...(e.properties.groupings ?? []),\n ..._.flatten(metadataExts.map((em) => em.properties.groupings).filter((x) => x)),\n ],\n },\n });\n }\n return e;\n }),\n [catalogType, itemTypeExtensions, typeMetadataExtensions],\n );\n\n catalogProviderExtensions.sort((a, b) => {\n const p1 = a.properties.priority ?? 0;\n const p2 = b.properties.priority ?? 0;\n return p1 - p2;\n });\n\n const catalogFilterExtensions = catalogType\n ? itemFilterExtensions.filter((e) => e.properties.type === catalogType)\n : itemFilterExtensions;\n\n const catalogMetadataProviderExtensions = catalogType\n ? metadataProviderExtensions.filter((e) => e.properties.type === catalogType)\n : metadataProviderExtensions;\n\n return [\n catalogTypeExtensions,\n catalogProviderExtensions,\n catalogFilterExtensions,\n catalogMetadataProviderExtensions,\n providersResolved &&\n filtersResolved &&\n itemTypesResolved &&\n itemTypeMetadataResolved &&\n metadataProvidersResolved,\n ];\n};\n\nexport default useCatalogExtensions;\n","import * as React from 'react';\nimport {\n CatalogTileBadge,\n CatalogTile as PfCatalogTile,\n} from '@patternfly/react-catalog-view-extension';\nimport { Badge } from '@patternfly/react-core';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { CatalogItem } from '@console/dynamic-plugin-sdk/src/extensions';\nimport { history } from '@console/internal/components/utils';\nimport { isModifiedEvent } from '../../utils';\nimport CatalogBadges from './CatalogBadges';\nimport { getIconProps } from './utils/catalog-utils';\nimport { CatalogType } from './utils/types';\n\nimport './CatalogTile.scss';\n\ntype CatalogTileProps = {\n item: CatalogItem;\n catalogTypes: CatalogType[];\n onClick?: (item: CatalogItem) => void;\n href?: string;\n};\n\nconst CatalogTile: React.FC<CatalogTileProps> = ({ item, catalogTypes, onClick, href }) => {\n const { t } = useTranslation();\n const { uid, name, title, provider, description, type, typeLabel, badges } = item;\n const vendor = provider ? t('console-shared~Provided by {{provider}}', { provider }) : null;\n const catalogType = _.find(catalogTypes, ['value', type]);\n\n const typeBadges = [\n <CatalogTileBadge>\n <Badge isRead>{typeLabel ?? catalogType?.label}</Badge>\n </CatalogTileBadge>,\n ];\n\n const isDescriptionReactElement = React.isValidElement(description);\n return (\n <PfCatalogTile\n id={uid}\n className=\"odc-catalog-tile co-catalog-tile\"\n onClick={(e: React.MouseEvent<HTMLElement>) => {\n if (isModifiedEvent(e)) return;\n e.preventDefault();\n if (onClick) {\n onClick(item);\n } else if (href) {\n history.push(href);\n }\n }}\n href={href}\n title={title || name}\n badges={typeBadges}\n vendor={vendor}\n description={isDescriptionReactElement ? undefined : description}\n data-test={`${type}-${name}`}\n {...getIconProps(item)}\n >\n {isDescriptionReactElement ? description : undefined}\n {badges?.length > 0 ? <CatalogBadges badges={badges} /> : undefined}\n </PfCatalogTile>\n );\n};\n\nexport default React.memo(CatalogTile);\n","import * as React from 'react';\nimport { Button } from '@patternfly/react-core';\nimport { getLastLanguage } from '@console/app/src/components/user-preferences/language/getLastLanguage';\n\nexport interface ProgressiveListFooterProps {\n items: string[];\n onShowItem: (item: string) => void;\n Footer: (children) => React.ReactElement;\n}\n\nconst ProgressiveListFooter: React.FC<ProgressiveListFooterProps> = ({\n items,\n onShowItem,\n Footer,\n}) => {\n if (!items || items.length === 0) {\n return null;\n }\n\n const formattedString = new Intl.ListFormat(getLastLanguage() || 'en', {\n style: 'long',\n type: 'conjunction',\n }).format(items);\n\n let lastIdx = 0;\n let lastLen = 0;\n\n return (\n <Footer>\n <>\n {items.map((item) => {\n const currentIdx = formattedString.indexOf(item);\n const element = (\n <React.Fragment key={item}>\n {formattedString.slice(lastIdx + lastLen, currentIdx)}\n <Button variant=\"link\" isInline onClick={() => onShowItem(item)}>\n {item}\n </Button>\n </React.Fragment>\n );\n\n lastIdx = currentIdx;\n lastLen = item.length;\n\n return element;\n })}\n </>\n </Footer>\n );\n};\n\nexport default ProgressiveListFooter;\n","import * as React from 'react';\n\nimport './ProgressiveListItem.scss';\n\nexport interface ProgressiveListItemProps {\n name: string;\n}\n\nconst ProgressiveListItem: React.FC<ProgressiveListItemProps> = ({ children }) => {\n const element = React.useRef<HTMLDivElement>();\n React.useEffect(() => {\n element.current.scrollIntoView({ behavior: 'smooth' });\n }, []);\n return (\n <div ref={element} className=\"ocs-progressive-list-section\">\n {children}\n </div>\n );\n};\n\nexport default ProgressiveListItem;\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useQuickStartContext } from '@console/shared/src/hooks/useQuickStartContext';\nimport { getProcessedResourceBundle } from '../../quick-starts/utils/quick-start-context';\nimport { LAST_LANGUAGE_LOCAL_STORAGE_KEY } from './const';\nimport { getLastLanguage } from './getLastLanguage';\n\nexport const useLanguage = (preferredLanguage: string, preferredLanguageLoaded: boolean) => {\n const { i18n } = useTranslation();\n const { setResourceBundle } = useQuickStartContext();\n\n React.useEffect(() => {\n const onLanguageChange = (lng: string) => {\n if (setResourceBundle) {\n // Update language resource of quick starts components\n const resourceBundle = i18n.getResourceBundle(lng, 'console-app');\n const processedBundle = getProcessedResourceBundle(resourceBundle, lng);\n setResourceBundle(processedBundle, lng);\n }\n };\n const preferredLanguageInStorage: string = getLastLanguage();\n\n i18n.on('languageChanged', onLanguageChange);\n\n if (preferredLanguageLoaded && preferredLanguage !== preferredLanguageInStorage) {\n if (preferredLanguage) {\n localStorage.setItem(LAST_LANGUAGE_LOCAL_STORAGE_KEY, preferredLanguage);\n i18n.changeLanguage(preferredLanguage);\n } else {\n preferredLanguageInStorage && localStorage.removeItem(LAST_LANGUAGE_LOCAL_STORAGE_KEY);\n }\n }\n\n return () => {\n i18n.off('languageChanged', onLanguageChange);\n };\n }, [i18n, preferredLanguage, preferredLanguageLoaded, setResourceBundle]);\n};\n","import * as React from 'react';\nimport {\n QuickStartContextValues,\n getDefaultQuickStartState,\n QuickStartStatus,\n QuickStartTaskStatus,\n getTaskStatusKey,\n} from '@patternfly/quickstarts';\nimport Pseudo from 'i18next-pseudo';\nimport { useTranslation } from 'react-i18next';\nimport {\n MarkdownExecuteSnippet,\n useInlineExecuteCommandShowdownExtension,\n useMultilineExecuteCommandShowdownExtension,\n} from '@console/shared';\nimport { useTelemetry } from '@console/shared/src/hooks/useTelemetry';\nimport { useUserSettings } from '@console/shared/src/hooks/useUserSettings';\nimport { getLastLanguage } from '../../user-preferences/language/getLastLanguage';\n\nexport { QuickStartContext, QuickStartContextProvider } from '@patternfly/quickstarts';\n\nexport const getProcessedResourceBundle = (resourceBundle, lng) => {\n const params = new URLSearchParams(window.location.search);\n const pseudolocalizationEnabled = params.get('pseudolocalization') === 'true';\n\n const language = lng || getLastLanguage() || 'en';\n let consoleBundle = resourceBundle;\n if (pseudolocalizationEnabled && language === 'en') {\n consoleBundle = {};\n const pseudo = new Pseudo({ enabled: true, wrapped: true });\n Object.keys(resourceBundle).forEach((key) => {\n consoleBundle[key] = pseudo.process(resourceBundle[key], '', {}, { language });\n });\n }\n\n return consoleBundle;\n};\n\nconst QUICKSTART_REDUX_STATE_LOCAL_STORAGE_KEY = 'bridge/quick-start-redux-state';\n\nconst getInitialState = () =>\n localStorage.getItem(QUICKSTART_REDUX_STATE_LOCAL_STORAGE_KEY)\n ? JSON.parse(localStorage.getItem(QUICKSTART_REDUX_STATE_LOCAL_STORAGE_KEY))\n : {};\n\nconst QUICK_START_KEY = 'console.quickstart';\nconst ACTIVE_QUICK_START_ID_KEY = `${QUICK_START_KEY}.active`;\nconst ALL_QUICK_START_STATE_KEY = `${QUICK_START_KEY}.allStates`;\n\nconst useActiveQuickStartId = () =>\n useUserSettings<string>(ACTIVE_QUICK_START_ID_KEY, getInitialState()?.activeQuickStartId ?? '');\nconst useAllQuickStartStates = () =>\n useUserSettings(ALL_QUICK_START_STATE_KEY, getInitialState()?.allQuickStartStates ?? {});\n\nexport const useValuesForQuickStartContext = (): QuickStartContextValues => {\n const { i18n } = useTranslation();\n const [activeQuickStartID, setActiveQuickStartID] = useActiveQuickStartId();\n const [allQuickStartStates, setAllQuickStartStates] = useAllQuickStartStates();\n const fireTelemetryEvent = useTelemetry();\n const inlineExecuteCommandShowdownExtension = useInlineExecuteCommandShowdownExtension();\n const multilineExecuteCommandShowdownExtension = useMultilineExecuteCommandShowdownExtension();\n\n const startQuickStart = React.useCallback(\n (quickStartId: string, totalTasks?: number) => {\n setActiveQuickStartID((id) => {\n if (!id || id !== quickStartId) {\n return quickStartId;\n }\n return id;\n });\n setAllQuickStartStates((qs) => {\n if (qs.hasOwnProperty(quickStartId)) {\n return {\n ...qs,\n [quickStartId]: { ...qs[quickStartId], status: QuickStartStatus.IN_PROGRESS },\n };\n }\n return {\n ...qs,\n [quickStartId]: getDefaultQuickStartState(totalTasks, QuickStartStatus.IN_PROGRESS),\n };\n });\n fireTelemetryEvent('Quick Start Initiated', {\n id: quickStartId,\n type: 'start',\n });\n },\n [setActiveQuickStartID, setAllQuickStartStates, fireTelemetryEvent],\n );\n\n const restartQuickStart = React.useCallback(\n (quickStartId: string, totalTasks: number) => {\n setActiveQuickStartID((id) => {\n if (!id || id !== quickStartId) {\n return quickStartId;\n }\n return id;\n });\n setAllQuickStartStates((qs) => ({\n ...qs,\n [quickStartId]: getDefaultQuickStartState(totalTasks, QuickStartStatus.NOT_STARTED),\n }));\n fireTelemetryEvent('Quick Start Initiated', {\n id: quickStartId,\n type: 'restart',\n });\n },\n [setActiveQuickStartID, setAllQuickStartStates, fireTelemetryEvent],\n );\n\n const nextStep = React.useCallback(\n (totalTasks: number) => {\n if (!activeQuickStartID) return;\n\n setAllQuickStartStates((qs) => {\n const quickStart = qs[activeQuickStartID];\n const status = quickStart?.status;\n const taskNumber = quickStart?.taskNumber;\n\n let updatedStatus;\n let updatedTaskNumber;\n let updatedTaskStatus;\n\n if (status === QuickStartStatus.NOT_STARTED) {\n fireTelemetryEvent('Quick Start Initiated', {\n id: activeQuickStartID,\n type: 'start',\n });\n updatedStatus = QuickStartStatus.IN_PROGRESS;\n } else if (status === QuickStartStatus.IN_PROGRESS && taskNumber === totalTasks - 1) {\n fireTelemetryEvent('Quick Start Completed', {\n id: activeQuickStartID,\n });\n updatedStatus = QuickStartStatus.COMPLETE;\n }\n\n if (taskNumber < totalTasks && !updatedTaskStatus) {\n updatedTaskNumber = taskNumber + 1;\n }\n const markInitialStepVisited =\n updatedTaskNumber > -1 &&\n quickStart[getTaskStatusKey(updatedTaskNumber)] === QuickStartTaskStatus.INIT\n ? QuickStartTaskStatus.VISITED\n : quickStart[getTaskStatusKey(updatedTaskNumber)];\n const newState = {\n ...qs,\n [activeQuickStartID]: {\n ...quickStart,\n ...(updatedStatus ? { status: updatedStatus } : {}),\n ...(updatedTaskNumber > -1\n ? {\n taskNumber: updatedTaskNumber,\n [getTaskStatusKey(updatedTaskNumber)]: markInitialStepVisited,\n }\n : {}),\n ...(updatedTaskStatus ? { [getTaskStatusKey(taskNumber)]: updatedTaskStatus } : {}),\n },\n };\n return newState;\n });\n },\n [activeQuickStartID, setAllQuickStartStates, fireTelemetryEvent],\n );\n\n const language = getLastLanguage() || 'en';\n const resourceBundle = i18n.getResourceBundle(language, 'console-app');\n const processedResourceBundle = getProcessedResourceBundle(resourceBundle, language);\n\n // https://github.com/i18next/i18next-parser#caveats\n // Need to reference the t() function here for all the keys used in the quickstarts library\n // so that the i18n-parser can find them, and keep them in sync with the locale json file.\n // Changes made in this comment block take effect after `yarn i18n` is run.\n // const resources = [\n // t('console-app~Quick Starts'),\n // t('console-app~No results found'),\n // t('console-app~No results match the filter criteria. Remove filters or clear all filters to show results.'),\n // t('console-app~Clear all filters'),\n // t('console-app~Complete ({{statusCount, number}})'),\n // t('console-app~In progress ({{statusCount, number}})'),\n // t('console-app~Not started ({{statusCount, number}})'),\n // t('console-app~Filter by keyword...'),\n // t('console-app~Select filter'),\n // t('console-app~Status'),\n // t('console-app~{{count, number}} item', { count: 0 }),\n // t('console-app~Prerequisites ({{totalPrereqs}})'),\n // t('console-app~View Prerequisites ({{totalPrereqs}})'),\n // t('console-app~Prerequisites'),\n // t('console-app~Show prerequisites'),\n // t('console-app~Complete'),\n // t('console-app~In progress'),\n // t('console-app~Not started'),\n // t('console-app~{{duration, number}} minutes'),\n // t('console-app~{{type}} • {{duration, number}} minutes'),\n // t('console-app~One or more verifications did not pass during this quick start. Revisit the tasks or the help links, and then try again.'),\n // t('console-app~Start {{nextQSDisplayName}} quick start'),\n // t('console-app~Start'),\n // t('console-app~Continue'),\n // t('console-app~Next'),\n // t('console-app~Close'),\n // t('console-app~Back'),\n // t('console-app~Restart'),\n // t('console-app~In this quick start, you will complete {{count, number}} task', { count: 0 }),\n // t('console-app~{{taskIndex, number}}'),\n // t('console-app~Check your work'),\n // t('console-app~Yes'),\n // t('console-app~No'),\n // t('console-app~{{index, number}} of {{tasks, number}}'),\n // t('console-app~Leave quick start?'),\n // t('console-app~Cancel'),\n // t('console-app~Leave'),\n // t('console-app~Your progress will be saved.'),\n // t('console-app~Not available'),\n // t('console-app~Copy to clipboard'),\n // t('console-app~Successfully copied to clipboard!'),\n // t('console-app~Type'),\n // t('console-app~No {{label}} found'),\n // t('console-app~Not found'),\n // ];\n return {\n useLegacyHeaderColors: true,\n language,\n resourceBundle: processedResourceBundle,\n activeQuickStartID,\n allQuickStartStates,\n setActiveQuickStartID,\n setAllQuickStartStates,\n startQuickStart,\n restartQuickStart,\n nextStep,\n footer: {\n show: false,\n },\n markdown: {\n extensions: [inlineExecuteCommandShowdownExtension, multilineExecuteCommandShowdownExtension],\n renderExtension: (docContext: HTMLDocument, rootSelector: string) => (\n <>\n <MarkdownExecuteSnippet docContext={docContext} rootSelector={rootSelector} />\n </>\n ),\n },\n };\n};\n","export * from './useHideLightspeed';\n","export type UtilsConfig = {\n /**\n * Resource fetch implementation provided by the host application.\n *\n * Applications must validate the response before resolving the Promise.\n *\n * If the request cannot be completed successfully, the Promise should be rejected\n * with an appropriate error.\n */\n appFetch: (url: string, options?: RequestInit) => Promise<Response>;\n};\n\nlet config: UtilsConfig | undefined;\n\n/**\n * Set the {@link UtilsConfig} reference.\n *\n * This must be done before using any of the Kubernetes utilities.\n */\nexport const setUtilsConfig = (c: UtilsConfig) => {\n if (config !== undefined) {\n throw new Error('setUtilsConfig has already been called');\n }\n\n config = Object.freeze({ ...c });\n};\n\n/**\n * Get the {@link UtilsConfig} reference.\n *\n * Throws an error if the reference isn't already set.\n */\nexport const getUtilsConfig = (): UtilsConfig => {\n if (config === undefined) {\n throw new Error('setUtilsConfig has not been called');\n }\n\n return config;\n};\n","export const k8sBasePath = `${window.SERVER_FLAGS.basePath}api/kubernetes`;\n","import * as React from 'react';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useSelector } from 'react-redux';\nimport { K8sModel } from '../../../api/common-types';\nimport { OpenShiftReduxRootState } from './k8s-watch-types';\n\n/**\n * Wait until internal models (CRDs) are loaded.\n *\n * Note: When loading is 'in flight' (in progress) when the component\n * that uses this hook is mounted, this hook waits until this is resolved, too.\n */\nexport const useModelsLoaded = (): boolean => {\n const ref = React.useRef(false);\n const loaded = useSelector<OpenShiftReduxRootState, K8sModel>(({ k8s }) =>\n k8s.getIn(['RESOURCES', 'loaded']),\n );\n const inFlight = useSelector<OpenShiftReduxRootState, K8sModel>(({ k8s }) =>\n k8s.getIn(['RESOURCES', 'inFlight']),\n );\n\n if (!ref.current && loaded && !inFlight) {\n ref.current = true;\n }\n return ref.current;\n};\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ErrorBoundaryFallbackProps } from '@console/dynamic-plugin-sdk';\nimport { CopyToClipboard } from '@console/internal/components/utils/copy-to-clipboard';\n\nconst ErrorDetailsBlock: React.FC<ErrorBoundaryFallbackProps> = (props) => {\n const { t } = useTranslation();\n return (\n <>\n <h3 className=\"co-section-heading-tertiary\">{props.title}</h3>\n <div className=\"form-group\">\n <label htmlFor=\"description\">{t('console-shared~Description:')}</label>\n <p>{props.errorMessage}</p>\n </div>\n <div className=\"form-group\">\n <label htmlFor=\"componentTrace\">{t('console-shared~Component trace:')}</label>\n <div className=\"co-copy-to-clipboard__stacktrace-width-height\">\n <CopyToClipboard value={props.componentStack.trim()} />\n </div>\n </div>\n <div className=\"form-group\">\n <label htmlFor=\"stackTrace\">{t('console-shared~Stack trace:')}</label>\n <div className=\"co-copy-to-clipboard__stacktrace-width-height\">\n <CopyToClipboard value={props.stack.trim()} />\n </div>\n </div>\n </>\n );\n};\n\nexport default ErrorDetailsBlock;\n","import * as _ from 'lodash-es';\nimport i18next from 'i18next';\n\nimport { ContainerSpec, ContainerStatus, PodKind } from './';\n\n// Parses the state from k8s container info field of a pod.\n// Returned object will always have a 'label' property,\n// but existence of other properties vary depending on the state.\nexport const getContainerState = (containerStatus: ContainerStatus): any => {\n const state: any = {\n label: 'Unknown',\n };\n if (!containerStatus || !containerStatus.state) {\n return state;\n }\n\n const keys = Object.keys(containerStatus.state);\n if (_.isEmpty(keys)) {\n return state;\n }\n\n const stateKey = keys[0];\n _.assign(state, containerStatus.state[stateKey]);\n state.label = _.startCase(stateKey);\n state.value = stateKey;\n return state;\n};\n\nexport const getContainerStatus = (pod: PodKind, containerName: string): ContainerStatus => {\n const statuses: ContainerStatus[] = _.get(pod, 'status.containerStatuses');\n const initStatuses: ContainerStatus[] = _.get(pod, 'status.initContainerStatuses');\n const identity = (s: ContainerStatus) => s.name === containerName;\n return _.find(statuses, identity) || _.find(initStatuses, identity);\n};\n\nexport const getContainerRestartCount = (status: ContainerStatus): number =>\n status?.restartCount ?? 0;\n\nconst getPullPolicy = (container: ContainerSpec) => {\n const pullPolicy = {\n Always: {\n id: 'Always',\n label: i18next.t('public~Always pull'),\n description: i18next.t(\n 'public~Pull down a new copy of the container image whenever a new pod is created.',\n ),\n default: true,\n },\n IfNotPresent: {\n id: 'IfNotPresent',\n label: i18next.t('public~Pull if needed'),\n description: i18next.t('public~If the container isn’t available locally, pull it down.'),\n },\n Never: {\n id: 'Never',\n label: i18next.t('public~Never pull'),\n description: i18next.t(\n \"public~Don't pull down a container image. If the correct container image doesn't exist locally, the pod will fail to start correctly.\",\n ),\n },\n };\n\n return pullPolicy[container?.imagePullPolicy];\n};\n\nexport const getPullPolicyLabel = (container: ContainerSpec): string => {\n return getPullPolicy(container)?.label || '';\n};\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport { connect } from 'react-redux';\nimport { Map as ImmutableMap, Set as ImmutableSet } from 'immutable';\nimport * as classNames from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport { ResourceIcon } from './utils';\nimport { K8sKind, K8sResourceKindReference, modelFor, referenceForModel } from '../module/k8s';\nimport { DiscoveryResources } from '@console/dynamic-plugin-sdk/src/api/common-types';\nimport {\n Select as SelectDeprecated,\n SelectGroup as SelectGroupDeprecated,\n SelectOption as SelectOptionDeprecated,\n SelectVariant as SelectVariantDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { useUserSettings } from '@console/shared/src';\nimport { Divider, Tooltip } from '@patternfly/react-core';\nimport CloseButton from '@console/shared/src/components/close-button';\n\nconst RECENT_SEARCH_ITEMS = 5;\n\n// Blacklist known duplicate resources.\nconst blacklistGroups = ImmutableSet([\n // Prefer rbac.authorization.k8s.io/v1, which has the same resources.\n 'authorization.openshift.io',\n]);\n\nconst blacklistResources = ImmutableSet([\n // Prefer core/v1\n 'events.k8s.io/v1beta1.Event',\n]);\n\nconst ResourceListDropdown_: React.SFC<ResourceListDropdownProps> = (props) => {\n const { selected, onChange, recentList, allModels, groupToVersionMap, className } = props;\n const { t } = useTranslation();\n\n const [isOpen, setOpen] = React.useState(false);\n const [clearItems, setClearItems] = React.useState(false);\n\n const [recentSelected, setRecentSelected] = useUserSettings<string>(\n 'console.search.recentlySearched',\n '[]',\n true,\n );\n\n const [selectedOptions, setSelectedOptions] = React.useState(selected);\n\n const filterGroupVersionKind = (resourceList: string[]): string[] => {\n return resourceList.filter((resource) => {\n const parts = resource.split('~');\n return parts.length === 3 && parts.every((part) => part.trim() !== '');\n });\n };\n\n const recentSelectedList = (data: string[] | string): string[] => {\n return (\n (data &&\n data !== '[]' &&\n data !== 'undefined' &&\n JSON.parse(_.isString(data) ? data : JSON.stringify(data))) ??\n []\n );\n };\n\n const resources = allModels\n .filter(({ apiGroup, apiVersion, kind, verbs }) => {\n // Remove blacklisted items.\n if (\n blacklistGroups.has(apiGroup) ||\n blacklistResources.has(`${apiGroup}/${apiVersion}.${kind}`)\n ) {\n return false;\n }\n\n // Only show resources that can be listed.\n if (!_.isEmpty(verbs) && !_.includes(verbs, 'list')) {\n return false;\n }\n\n // Only show preferred version for resources in the same API group.\n const preferred = (m: K8sKind) =>\n groupToVersionMap?.[m.apiGroup]?.preferredVersion === m.apiVersion;\n\n const sameGroupKind = (m: K8sKind) =>\n m.kind === kind && m.apiGroup === apiGroup && m.apiVersion !== apiVersion;\n\n return !allModels.find((m) => sameGroupKind(m) && preferred(m));\n })\n .toOrderedMap()\n .sortBy(({ kind, apiGroup }) => `${kind} ${apiGroup}`);\n\n // Track duplicate names so we know when to show the group.\n const kinds = resources.groupBy((m) => m.kind);\n const isDup = (kind) => kinds.get(kind).size > 1;\n\n React.useEffect(() => {\n setSelectedOptions(selected);\n !_.isEmpty(selected) &&\n setRecentSelected(\n JSON.stringify(\n _.union(\n !clearItems ? filterGroupVersionKind(selected.reverse()) : [],\n recentSelectedList(recentSelected),\n ),\n ),\n );\n setClearItems(false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selected, setRecentSelected]);\n\n const onClear = () => {\n setSelectedOptions([]);\n setClearItems(true);\n setRecentSelected(JSON.stringify([]));\n };\n\n const items = resources\n .map((model: K8sKind) => (\n <SelectOptionDeprecated\n key={referenceForModel(model)}\n value={referenceForModel(model)}\n data-filter-text={`${model.abbr}${model.labelKey ? t(model.labelKey) : model.kind}`}\n >\n <span className=\"co-resource-item\">\n <span className=\"co-resource-icon--fixed-width\">\n <ResourceIcon kind={referenceForModel(model)} />\n </span>\n <span className=\"co-resource-item__resource-name\">\n <span>\n {model.labelKey ? t(model.labelKey) : model.kind}\n {model.badge && model.badge === 'Tech Preview' && (\n <span className=\"co-resource-item__tech-dev-preview\">\n {t('public~Tech Preview')}\n </span>\n )}\n </span>\n {isDup(model.kind) && (\n <div className=\"co-resource-item__resource-api text-muted co-truncate co-nowrap small\">\n {model.apiGroup || 'core'}/{model.apiVersion}\n </div>\n )}\n </span>\n </span>\n </SelectOptionDeprecated>\n ))\n .toArray();\n\n const recentSearches: JSX.Element[] =\n !_.isEmpty(recentSelectedList(recentSelected)) &&\n recentSelectedList(recentSelected)\n .splice(0, RECENT_SEARCH_ITEMS)\n .map((modelRef: K8sResourceKindReference) => {\n const model: K8sKind = resources.find((m) => referenceForModel(m) === modelRef);\n if (model) {\n return (\n <SelectOptionDeprecated\n key={modelRef}\n value={modelRef}\n data-filter-text={`${model.abbr}${model.labelKey ? t(model.labelKey) : model.kind}`}\n >\n <span className=\"co-resource-item\">\n <span className=\"co-resource-icon--fixed-width\">\n <ResourceIcon kind={modelRef} />\n </span>\n <span className=\"co-resource-item__resource-name\">\n <span>\n {model.labelKey ? t(model.labelKey) : model.kind}\n {model.badge && model.badge === 'Tech Preview' && (\n <span className=\"co-resource-item__tech-dev-preview\">\n {t('public~Tech Preview')}\n </span>\n )}\n </span>\n {isDup(model.kind) && (\n <div className=\"co-resource-item__resource-api text-muted co-truncate co-nowrap small\">\n {model.apiGroup || 'core'}/{model.apiVersion}\n </div>\n )}\n </span>\n </span>\n </SelectOptionDeprecated>\n );\n }\n return null;\n })\n .filter((item) => item !== null);\n\n const renderedOptions = () => {\n const options: JSX.Element[] = [];\n if (!_.isEmpty(recentSelectedList(recentSelected)) && !!recentList) {\n options.push(\n <Tooltip position=\"right\" content={t('public~Clear history')}>\n <CloseButton\n additionalClassName=\"co-select-group-close-button\"\n dataTestID=\"close-icon\"\n onClick={onClear}\n />\n </Tooltip>,\n );\n options.push(\n <SelectGroupDeprecated\n label={t('public~Recently used')}\n className=\"co-select-group-dismissible\"\n >\n {recentSearches}\n </SelectGroupDeprecated>,\n );\n options.push(<Divider key={3} className=\"co-select-group-divider\" />);\n }\n options.push(<SelectGroupDeprecated>{items}</SelectGroupDeprecated>);\n return options;\n };\n\n const onCustomFilter = (event: React.ChangeEvent<HTMLInputElement>) => {\n const filterText = event?.target.value.toLocaleLowerCase();\n if (filterText === null || filterText === '' || filterText === undefined) {\n if (!_.isEmpty(recentSelectedList(recentSelected)) && !!recentList) {\n return renderedOptions();\n }\n return items;\n }\n return items.filter((item) => {\n return item.props['data-filter-text'].toLowerCase().includes(filterText);\n });\n };\n\n const handleSelected = (event: React.MouseEvent | React.ChangeEvent, value: string) => {\n onChange(referenceForModel(modelFor(value)));\n };\n\n const onToggle = (_event, newOpenState: boolean) => {\n setOpen(newOpenState);\n };\n\n return (\n <SelectDeprecated\n variant={SelectVariantDeprecated.checkbox}\n onToggle={onToggle}\n onSelect={handleSelected}\n selections={selectedOptions}\n isOpen={isOpen}\n placeholderText={t('public~Resources')}\n inlineFilterPlaceholderText={t('public~Select Resource')}\n onFilter={onCustomFilter}\n hasInlineFilter\n customBadgeText={selected.length}\n className={classNames('co-type-selector', className)}\n maxHeight=\"60vh\"\n isGrouped\n >\n {renderedOptions()}\n </SelectDeprecated>\n );\n};\n\nconst resourceListDropdownStateToProps = ({ k8s }) => ({\n allModels: k8s.getIn(['RESOURCES', 'models']),\n groupToVersionMap: k8s.getIn(['RESOURCES', 'groupToVersionMap']),\n});\n\nexport const ResourceListDropdown = connect<ResourceListDropdownStateToProps>(\n resourceListDropdownStateToProps,\n)(ResourceListDropdown_);\n\nexport type ResourceListDropdownProps = ResourceListDropdownStateToProps & {\n selected: K8sResourceKindReference[];\n onChange: (value: string) => void;\n recentList?: boolean;\n className?: string;\n id?: string;\n};\n\ntype ResourceListDropdownStateToProps = {\n allModels: ImmutableMap<K8sResourceKindReference, K8sKind>;\n groupToVersionMap: DiscoveryResources['groupVersionMap'];\n};\n","import * as React from 'react';\nimport { MenuToggle, Popper } from '@patternfly/react-core';\nimport * as cx from 'classnames';\n\nconst NamespaceMenuToggle = (props: {\n disabled: boolean;\n menu: React.ReactElement;\n menuRef: React.RefObject<HTMLElement>;\n isOpen: boolean;\n shortCut?: string;\n title: string;\n onToggle: (state: boolean) => void;\n className?: string;\n}) => {\n const { menu, isOpen, shortCut, title, onToggle, disabled, menuRef, className } = props;\n\n const toggleRef = React.useRef(null);\n const containerRef = React.useRef(null);\n\n const handleMenuKeys = (event) => {\n if (\n shortCut &&\n event.key === shortCut &&\n event.target.nodeName !== 'INPUT' &&\n event.target.nodeName !== 'TEXTAREA' &&\n event.target.role !== 'textbox' &&\n event.target.role !== 'code'\n ) {\n onToggle(true);\n event.stopPropagation();\n event.preventDefault();\n }\n\n if (menuRef.current) {\n if (event.key === 'Escape') {\n onToggle(false);\n toggleRef.current.focus();\n }\n if (!menuRef.current?.contains(event.target) && event.key === 'Tab') {\n onToggle(false);\n }\n }\n };\n\n const handleMenuClick = (event) => {\n if (\n menuRef.current &&\n !menuRef.current?.contains(event.target) &&\n // Checking to see if user clicked on a favorite icon. This is needed because\n // if unfavoriting a item, PF removes the item from the DOM before\n // the click event is registered\n !event.target.closest?.('.pf-m-favorite') &&\n !toggleRef.current.contains(event.target)\n ) {\n onToggle(false);\n }\n };\n\n React.useEffect(() => {\n window.addEventListener('keyup', handleMenuKeys);\n window.addEventListener('click', handleMenuClick);\n return () => {\n window.removeEventListener('keyup', handleMenuKeys);\n window.removeEventListener('click', handleMenuClick);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // This needs to be run only on component mount/unmount\n\n const toggle = (\n <MenuToggle\n ref={toggleRef}\n onClick={() => onToggle(!isOpen)}\n isExpanded={isOpen}\n disabled={disabled}\n className={cx('co-namespace-dropdown__menu-toggle', className)}\n >\n {title}\n </MenuToggle>\n );\n\n return (\n <div ref={containerRef}>\n <Popper\n trigger={toggle}\n popper={menu}\n direction=\"down\"\n position=\"left\"\n appendTo={containerRef.current}\n isVisible={isOpen}\n enableFlip={false}\n />\n </div>\n );\n};\n\nexport default NamespaceMenuToggle;\n","import * as React from 'react';\n\ntype CloseModal = () => void;\n\ntype UnknownProps = { [key: string]: unknown };\nexport type ModalComponent<P = UnknownProps> = React.FC<P & { closeModal: CloseModal }>;\n\nexport type LaunchModal = <P = UnknownProps>(component: ModalComponent<P>, extraProps: P) => void;\n\ntype ModalContextValue = {\n launchModal: LaunchModal;\n closeModal: CloseModal;\n};\n\nexport const ModalContext = React.createContext<ModalContextValue>({\n launchModal: () => {},\n closeModal: () => {},\n});\n\nexport const ModalProvider: React.FC = ({ children }) => {\n const [isOpen, setOpen] = React.useState(false);\n const [Component, setComponent] = React.useState<ModalComponent>();\n const [componentProps, setComponentProps] = React.useState({});\n\n const launchModal = React.useCallback<LaunchModal>(\n (component, compProps) => {\n setComponent(() => component);\n setComponentProps(compProps);\n setOpen(true);\n },\n [setOpen, setComponent, setComponentProps],\n );\n const closeModal = React.useCallback<CloseModal>(() => setOpen(false), [setOpen]);\n\n return (\n <ModalContext.Provider value={{ launchModal, closeModal }}>\n {isOpen && !!Component && <Component {...componentProps} closeModal={closeModal} />}\n {children}\n </ModalContext.Provider>\n );\n};\n","import * as React from 'react';\nimport {\n Popover,\n Modal,\n ModalVariant,\n Button,\n Alert,\n Select,\n SelectOption,\n SelectList,\n MenuToggle,\n MenuToggleElement,\n} from '@patternfly/react-core';\nimport { OutlinedQuestionCircleIcon } from '@patternfly/react-icons';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router-dom-v5-compat';\nimport { CreateProjectModalProps } from '@console/dynamic-plugin-sdk/src';\nimport { ModalComponent } from '@console/dynamic-plugin-sdk/src/app/modal-support/ModalProvider';\nimport {\n SelectorInput,\n resourceObjPath,\n LoadingInline,\n // Dropdown,\n} from '@console/internal/components/utils';\nimport { NamespaceModel, NetworkPolicyModel } from '@console/internal/models';\nimport { k8sCreate, referenceFor } from '@console/internal/module/k8s';\n\nconst allow = 'allow';\nconst deny = 'deny';\n\nconst defaultDeny = {\n apiVersion: 'networking.k8s.io/v1',\n kind: 'NetworkPolicy',\n spec: {\n podSelector: null,\n },\n};\n\nexport const CreateNamespaceModal: ModalComponent<CreateProjectModalProps> = ({\n closeModal,\n onSubmit,\n}) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n\n const [inProgress, setInProgress] = React.useState(false);\n const [errorMessage, setErrorMessage] = React.useState('');\n const [networkPolicy, setNetworkPolicy] = React.useState(allow);\n const [name, setName] = React.useState('');\n const [labels, setLabels] = React.useState([]);\n\n const thenPromise = (res) => {\n setInProgress(false);\n setErrorMessage('');\n return res;\n };\n\n const catchError = (error) => {\n const err = error.message || t('console-shared~An error occurred. Please try again.');\n setInProgress(false);\n setErrorMessage(err);\n return Promise.reject(err);\n };\n\n const handlePromise = (promise) => {\n setInProgress(true);\n\n return promise.then(\n (res) => thenPromise(res),\n (error) => catchError(error),\n );\n };\n\n const createNamespace = () => {\n const namespace = {\n metadata: {\n name,\n labels: { ...SelectorInput.objectify(labels) },\n },\n };\n return k8sCreate(NamespaceModel, namespace);\n };\n\n const create = async () => {\n const namespace = await createNamespace();\n if (networkPolicy === deny) {\n const policy = Object.assign({}, defaultDeny, {\n metadata: { namespace: name, name: 'default-deny' },\n });\n await k8sCreate(NetworkPolicyModel, policy);\n }\n return namespace;\n };\n\n const submit = (event) => {\n event.preventDefault();\n handlePromise(create())\n .then((obj) => {\n closeModal();\n if (onSubmit) {\n onSubmit(obj);\n } else {\n navigate(resourceObjPath(obj, referenceFor(obj)));\n }\n })\n .catch((err) => {\n // eslint-disable-next-line no-console\n console.error(`Failed to create Namespace:`, err);\n });\n };\n\n const defaultNetworkPolicies = [\n {\n key: 'allow',\n value: t('console-shared~No restrictions'),\n },\n {\n key: 'deny',\n value: t('console-shared~Deny all inbound traffic'),\n },\n ];\n\n const selectOptions = defaultNetworkPolicies.map((option) => (\n <SelectOption key={option.key} value={option.value}>\n {option.value}\n </SelectOption>\n ));\n\n const [isOpen, setIsOpen] = React.useState(false);\n const defaultNetworkPolicy = defaultNetworkPolicies[0].value;\n const [selected, setSelected] = React.useState<string>(defaultNetworkPolicy);\n\n const onToggleClick = () => {\n setIsOpen(!isOpen);\n };\n\n const onSelect = (\n _event: React.MouseEvent<Element, MouseEvent> | undefined,\n value: string | number | undefined,\n ) => {\n setIsOpen(!isOpen);\n setSelected(value as string);\n if (value === defaultNetworkPolicy) {\n setNetworkPolicy(allow);\n } else {\n setNetworkPolicy(deny);\n }\n };\n\n const toggle = (toggleRef: React.Ref<MenuToggleElement>) => (\n <MenuToggle ref={toggleRef} onClick={onToggleClick} isExpanded={isOpen}>\n {selected}\n </MenuToggle>\n );\n\n const popoverText = () => {\n const nameFormat = t(\n \"console-shared~A Namespace name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').\",\n );\n const createNamespaceText = t(\n \"console-shared~You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'.\",\n );\n return (\n <>\n <p>{nameFormat}</p>\n <p>{createNamespaceText}</p>\n </>\n );\n };\n\n return (\n <Modal\n variant={ModalVariant.small}\n title={t('console-shared~Create Namespace')}\n isOpen\n onClose={closeModal}\n actions={[\n <Button\n type=\"submit\"\n variant=\"primary\"\n disabled={inProgress}\n onClick={submit}\n data-test=\"confirm-action\"\n id=\"confirm-action\"\n >\n {t('console-shared~Create')}\n </Button>,\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={inProgress}\n onClick={closeModal}\n data-test-id=\"modal-cancel-action\"\n >\n {t('console-shared~Cancel')}\n </Button>,\n ...(inProgress ? [<LoadingInline />] : []),\n ]}\n >\n <form onSubmit={submit} name=\"form\" className=\"modal-content\">\n <div className=\"form-group\">\n <label htmlFor=\"input-name\" className=\"control-label co-required\">\n {t('console-shared~Name')}\n </label>{' '}\n <Popover aria-label={t('console-shared~Naming information')} bodyContent={popoverText}>\n <Button\n className=\"co-button-help-icon\"\n variant=\"plain\"\n aria-label={t('console-shared~View naming information')}\n >\n <OutlinedQuestionCircleIcon />\n </Button>\n </Popover>\n <div className=\"modal-body__field\">\n <input\n id=\"input-name\"\n data-test=\"input-name\"\n name=\"name\"\n type=\"text\"\n className=\"pf-v5-c-form-control\"\n onChange={(e) => setName(e.target.value)}\n value={name || ''}\n required\n />\n </div>\n </div>\n <div className=\"form-group\">\n <label htmlFor=\"tags-input\" className=\"control-label\">\n {t('console-shared~Labels')}\n </label>\n <div className=\"modal-body__field\">\n <SelectorInput\n labelClassName=\"co-m-namespace\"\n onChange={(value) => setLabels(value)}\n tags={labels}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <label htmlFor=\"network-policy\" className=\"control-label\">\n {t('console-shared~Default network policy')}\n </label>\n <div className=\"modal-body__field \">\n <Select\n id=\"dropdown-selectbox\"\n isOpen={isOpen}\n selected={selected}\n onSelect={onSelect}\n onOpenChange={() => setIsOpen(isOpen)}\n toggle={toggle}\n shouldFocusToggleOnSelect\n >\n <SelectList>{selectOptions}</SelectList>\n </Select>\n </div>\n </div>\n {errorMessage && (\n <Alert\n isInline\n className=\"co-alert co-alert--scrollable\"\n variant=\"danger\"\n title={t('console-shared~An error occurred')}\n data-test=\"alert-error\"\n >\n <div className=\"co-pre-line\">{errorMessage}</div>\n </Alert>\n )}\n </form>\n </Modal>\n );\n};\n","import * as React from 'react';\nimport { Popover, Button, Modal, ModalVariant, Alert } from '@patternfly/react-core';\nimport OutlinedQuestionCircleIcon from '@patternfly/react-icons/dist/js/icons/outlined-question-circle-icon';\nimport { useTranslation } from 'react-i18next';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useDispatch } from 'react-redux';\nimport { useNavigate } from 'react-router-dom-v5-compat';\nimport {\n CreateProjectModal as CreateProjectModalExtension,\n CreateProjectModalProps,\n isCreateProjectModal,\n useResolvedExtensions,\n} from '@console/dynamic-plugin-sdk/src';\nimport { setFlag } from '@console/internal/actions/features';\nimport {\n documentationURLs,\n ExternalLink,\n getDocumentationURL,\n isManaged,\n resourceObjPath,\n LoadingInline,\n} from '@console/internal/components/utils';\nimport { ProjectRequestModel } from '@console/internal/models';\nimport { k8sCreate, referenceFor } from '@console/internal/module/k8s';\nimport { FLAGS } from '@console/shared';\nimport { ModalComponent } from 'packages/console-dynamic-plugin-sdk/src/app/modal-support/ModalProvider';\n\nconst DefaultCreateProjectModal: ModalComponent<CreateProjectModalProps> = ({\n closeModal,\n onSubmit,\n}) => {\n const navigate = useNavigate();\n const dispatch = useDispatch();\n const [inProgress, setInProgress] = React.useState(false);\n const [errorMessage, setErrorMessage] = React.useState('');\n const [name, setName] = React.useState('');\n const [displayName, setDisplayName] = React.useState('');\n const [description, setDescription] = React.useState('');\n const hideStartGuide = React.useCallback(\n () => dispatch(setFlag(FLAGS.SHOW_OPENSHIFT_START_GUIDE, false)),\n [dispatch],\n );\n\n const { t } = useTranslation();\n\n const thenPromise = (res) => {\n setInProgress(false);\n setErrorMessage('');\n return res;\n };\n\n const catchError = (error) => {\n const err = error.message || t('console-shared~An error occurred. Please try again.');\n setInProgress(false);\n setErrorMessage(err);\n return Promise.reject(err);\n };\n\n const handlePromise = (promise) => {\n setInProgress(true);\n\n return promise.then(\n (res) => thenPromise(res),\n (error) => catchError(error),\n );\n };\n\n const createProject = () => {\n const project = {\n metadata: {\n name,\n },\n displayName,\n description,\n };\n return k8sCreate(ProjectRequestModel, project).then((obj) => {\n // Immediately update the start guide flag to avoid the empty state\n // message from displaying when projects watch is slow.\n hideStartGuide();\n return obj;\n });\n };\n\n const submit = async (event) => {\n event.preventDefault();\n handlePromise(createProject())\n .then((obj) => {\n closeModal();\n if (onSubmit) {\n onSubmit(obj);\n } else {\n navigate(resourceObjPath(obj, referenceFor(obj)));\n }\n })\n .catch((err) => {\n // eslint-disable-next-line no-console\n console.error(`Failed to create Project:`, err);\n });\n };\n\n const popoverText = () => {\n const nameFormat = t(\n \"console-shared~A Project name must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name' or '123-abc').\",\n );\n const createNamespaceText = t(\n \"console-shared~You must create a Namespace to be able to create projects that begin with 'openshift-', 'kubernetes-', or 'kube-'.\",\n );\n return (\n <>\n <p>{nameFormat}</p>\n <p>{createNamespaceText}</p>\n </>\n );\n };\n\n const projectsURL = getDocumentationURL(documentationURLs.workingWithProjects);\n\n return (\n <Modal\n variant={ModalVariant.small}\n title={t('console-shared~Create Project')}\n isOpen\n onClose={closeModal}\n actions={[\n <Button\n type=\"submit\"\n variant=\"primary\"\n disabled={inProgress}\n onClick={submit}\n data-test=\"confirm-action\"\n id=\"confirm-action\"\n >\n {t('console-shared~Create')}\n </Button>,\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={inProgress}\n onClick={closeModal}\n data-test-id=\"modal-cancel-action\"\n >\n {t('console-shared~Cancel')}\n </Button>,\n ...(inProgress ? [<LoadingInline />] : []),\n ]}\n >\n <form onSubmit={submit} name=\"form\" className=\"modal-content\">\n <p>\n {t(\n 'console-shared~An OpenShift project is an alternative representation of a Kubernetes namespace.',\n )}\n </p>\n {!isManaged() && (\n <p>\n <ExternalLink href={projectsURL}>\n {t('console-shared~Learn more about working with projects')}\n </ExternalLink>\n </p>\n )}\n <div className=\"form-group\">\n <label htmlFor=\"input-name\" className=\"control-label co-required\">\n {t('console-shared~Name')}\n </label>{' '}\n <Popover aria-label={t('console-shared~Naming information')} bodyContent={popoverText}>\n <Button\n className=\"co-button-help-icon\"\n variant=\"plain\"\n aria-label={t('console-shared~View naming information')}\n >\n <OutlinedQuestionCircleIcon />\n </Button>\n </Popover>\n <div className=\"modal-body__field\">\n <input\n id=\"input-name\"\n data-test=\"input-name\"\n name=\"name\"\n type=\"text\"\n className=\"pf-v5-c-form-control\"\n onChange={(e) => setName(e.target.value)}\n value={name || ''}\n required\n />\n </div>\n </div>\n <div className=\"form-group\">\n <label htmlFor=\"input-display-name\" className=\"control-label\">\n {t('console-shared~Display name')}\n </label>\n <div className=\"modal-body__field\">\n <input\n id=\"input-display-name\"\n name=\"displayName\"\n type=\"text\"\n className=\"pf-v5-c-form-control\"\n onChange={(e) => setDisplayName(e.target.value)}\n value={displayName || ''}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <label htmlFor=\"input-description\" className=\"control-label\">\n {t('console-shared~Description')}\n </label>\n <div className=\"modal-body__field\">\n <textarea\n id=\"input-description\"\n name=\"description\"\n className=\"pf-v5-c-form-control pf-m-resize-both\"\n onChange={(e) => setDescription(e.target.value)}\n value={description || ''}\n />\n </div>\n </div>\n {errorMessage && (\n <Alert\n isInline\n className=\"co-alert co-alert--scrollable\"\n variant=\"danger\"\n title={t('console-shared~An error occurred')}\n data-test=\"alert-error\"\n >\n <div className=\"co-pre-line\">{errorMessage}</div>\n </Alert>\n )}\n </form>\n </Modal>\n );\n};\n\nexport const CreateProjectModal: ModalComponent<CreateProjectModalProps> = (props) => {\n // Get create project modal extensions\n const [createProjectModalExtensions, resolved] = useResolvedExtensions<\n CreateProjectModalExtension\n >(isCreateProjectModal);\n\n // resolve the modal component from the extensions, if at least one exists\n const Component = createProjectModalExtensions?.[0]?.properties?.component;\n\n // If extensions are not resolved yet, return null\n if (!resolved) {\n return null;\n }\n\n // If extension modal component exists, render it, else render default\n return Component ? <Component {...props} /> : <DefaultCreateProjectModal {...props} />;\n};\n","import * as React from 'react';\nimport * as _ from 'lodash';\n\nexport type UseMirroredLocalStateReturn<S> = [S, (state: S) => void, boolean];\n\n/**\n * DO NOT USE -- proper state management in React is Top-Down state management.\n * Syncs an external data point with a local data point. Used to fix the ToolbarFilter poor state\n * management issue.\n */\nconst useMirroredLocalState = <S>({\n externalState,\n externalChangeHandler,\n defaultState,\n}: {\n externalState: S;\n externalChangeHandler: (state: S) => void;\n defaultState: S;\n}): UseMirroredLocalStateReturn<S> => {\n const [localState, setLocalState] = React.useState<S>(null);\n\n const onExternalChange = React.useCallback(\n (state: S) => {\n setLocalState(state);\n externalChangeHandler(state);\n },\n [externalChangeHandler],\n );\n\n React.useEffect(() => {\n if (localState === null) {\n // We don't have local data, fresh mount\n if (_.isEmpty(externalState)) {\n // No url params, use defaults\n onExternalChange(defaultState);\n } else {\n // We have url params, routed here with params\n setLocalState(externalState);\n }\n } else {\n // We have local data so we have been initialized\n if (!_.isEqual(externalState, localState)) {\n // They are not equal, so we need to figure out who is right\n if (_.isEmpty(externalState)) {\n // Params are empty, so this means the component was not re-mounted but we lost params\n onExternalChange(localState);\n } else {\n // Params are not empty -- this is a conflict of source of truth\n // Possible reason would be a local code re-route on this page, accept URL as source of truth\n setLocalState(externalState);\n }\n }\n }\n }, [localState, externalState, onExternalChange, defaultState]);\n\n return [localState ?? defaultState, onExternalChange, localState !== null];\n};\n\nexport default useMirroredLocalState;\n","import { Pagination, PaginationVariant, PerPageOptions } from '@patternfly/react-core';\nimport * as React from 'react';\nimport { useTranslation, Trans } from 'react-i18next';\n\nconst defaultPerPageOptions: PerPageOptions[] = [10, 20, 50, 100, 200, 500].map((n) => ({\n title: n.toString(),\n value: n,\n}));\n\nconst LocalizedToggleTemplate: React.FC<LocalizedToggleTemplateProps> = ({\n firstIndex,\n itemCount,\n itemsTitle,\n lastIndex,\n}) => {\n const { t } = useTranslation();\n return (\n <Trans t={t} ns=\"public\">\n <b>\n {{ firstIndex }} - {{ lastIndex }}\n </b>{' '}\n of <b>{{ itemCount }}</b> {{ itemsTitle }}\n </Trans>\n );\n};\n\nconst TablePagination: React.FC<TablePaginationProps> = ({\n itemCount,\n page,\n perPage,\n perPageOptions = defaultPerPageOptions,\n setPage,\n setPerPage,\n}) => {\n const { t } = useTranslation();\n const onPerPageSelect = (e, v) => {\n // When changing the number of results per page, keep the start row approximately the same\n const firstRow = (page - 1) * perPage;\n setPage(Math.floor(firstRow / v) + 1);\n setPerPage(v);\n };\n\n return (\n <Pagination\n itemCount={itemCount}\n onPerPageSelect={onPerPageSelect}\n onSetPage={(e, v) => setPage(v)}\n page={page}\n perPage={perPage}\n perPageOptions={perPageOptions}\n variant={PaginationVariant.bottom}\n toggleTemplate={LocalizedToggleTemplate}\n titles={{\n items: '',\n page: '',\n itemsPerPage: t('public~Items per page'),\n perPageSuffix: t('public~per page'),\n toFirstPageAriaLabel: t('public~Go to first page'),\n toPreviousPageAriaLabel: t('public~Go to previous page'),\n toLastPageAriaLabel: t('public~Go to last page'),\n toNextPageAriaLabel: t('public~Go to next page'),\n optionsToggleAriaLabel: t('public~Items per page'),\n currPageAriaLabel: t('public~Current page'),\n paginationAriaLabel: t('public~Pagination'),\n ofWord: t('public~of'),\n }}\n />\n );\n};\n\ntype LocalizedToggleTemplateProps = {\n firstIndex: number;\n itemCount: number;\n itemsTitle: string;\n lastIndex: number;\n};\n\ntype TablePaginationProps = {\n itemCount: number;\n page: number;\n perPage: number;\n perPageOptions?: PerPageOptions[];\n setPage: (number) => void;\n setPerPage: (number) => void;\n};\n\nexport default TablePagination;\n","import * as React from 'react';\nimport { FormGroup, FormHelperText, HelperText, HelperTextItem } from '@patternfly/react-core';\nimport { useField } from 'formik';\nimport { RedExclamationCircleIcon } from '../status';\nimport { CheckboxFieldProps } from './field-types';\nimport { getFieldId } from './field-utils';\n\ntype ToggleableFieldBaseProps = CheckboxFieldProps & {\n children: (props) => React.ReactNode;\n};\n\nconst ToggleableFieldBase: React.FC<ToggleableFieldBaseProps> = ({\n label,\n formLabel,\n helpText,\n required,\n children,\n value,\n onChange,\n name,\n ...props\n}) => {\n const [field, { touched, error }] = useField({ value, name, type: 'checkbox' });\n const fieldId = getFieldId(name, 'checkbox');\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n\n return (\n <FormGroup fieldId={fieldId} label={formLabel} isRequired={required}>\n {children({\n ...field,\n ...props,\n value: field.value ?? false,\n id: fieldId,\n label,\n isChecked: field.checked,\n isValid,\n 'aria-describedby': helpText ? `${fieldId}-helper` : undefined,\n onChange: (event, val) => {\n field.onChange(event);\n onChange && onChange(val);\n },\n })}\n\n <FormHelperText>\n <HelperText>\n {!isValid ? (\n <HelperTextItem variant=\"error\" icon={<RedExclamationCircleIcon />}>\n {errorMessage}\n </HelperTextItem>\n ) : (\n <HelperTextItem>{helpText}</HelperTextItem>\n )}\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n};\n\nexport default ToggleableFieldBase;\n","import * as React from 'react';\nimport {\n FormGroup,\n FormHelperText,\n HelperText,\n HelperTextItem,\n ValidatedOptions,\n} from '@patternfly/react-core';\nimport { useField } from 'formik';\nimport { useFormikValidationFix } from '../../hooks';\nimport { RedExclamationCircleIcon } from '../status';\nimport { BaseInputFieldProps } from './field-types';\nimport { getFieldId } from './field-utils';\n\nconst BaseInputField: React.FC<\n BaseInputFieldProps & {\n children: (props) => React.ReactNode;\n }\n> = ({\n label,\n helpText,\n required,\n children,\n name,\n onChange,\n onBlur,\n helpTextInvalid,\n validated,\n ...props\n}) => {\n const [field, { touched, error }] = useField({ name, type: 'input' });\n const fieldId = getFieldId(name, 'input');\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n useFormikValidationFix(field.value);\n\n return (\n <FormGroup fieldId={fieldId} label={label} isRequired={required}>\n {children({\n ...field,\n ...props,\n value: field.value || '',\n id: fieldId,\n label,\n validated: !isValid ? ValidatedOptions.error : validated,\n 'aria-describedby': helpText ? `${fieldId}-helper` : undefined,\n onChange: (event) => {\n field.onChange(event);\n onChange && onChange(event);\n },\n onBlur: (event) => {\n field.onBlur(event);\n onBlur && onBlur(event);\n },\n })}\n\n <FormHelperText id={`${fieldId}-helper`}>\n <HelperText>\n {!isValid ? (\n <HelperTextItem variant=\"error\" icon={<RedExclamationCircleIcon />}>\n {errorMessage || helpTextInvalid}\n </HelperTextItem>\n ) : (\n <HelperTextItem variant={validated}>{helpText}</HelperTextItem>\n )}\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n};\n\nexport default BaseInputField;\n","import * as React from 'react';\nimport { Button, Tooltip } from '@patternfly/react-core';\nimport { PlusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon';\nimport { useTranslation } from 'react-i18next';\n\nexport interface MultiColumnFieldFooterProps {\n addLabel?: string;\n disableAddRow?: boolean;\n tooltipAddRow?: string;\n onAdd: () => void;\n}\n\nconst MultiColumnFieldFooter: React.FC<MultiColumnFieldFooterProps> = ({\n addLabel,\n disableAddRow = false,\n tooltipAddRow,\n onAdd,\n}) => {\n const { t } = useTranslation();\n const button = (\n <Button\n data-test={'add-action'}\n variant=\"link\"\n isAriaDisabled={disableAddRow}\n onClick={!disableAddRow ? onAdd : undefined}\n icon={<PlusCircleIcon />}\n isInline\n >\n {addLabel || t('console-shared~Add values')}\n </Button>\n );\n return tooltipAddRow ? <Tooltip content={tooltipAddRow}>{button}</Tooltip> : button;\n};\n\nexport default MultiColumnFieldFooter;\n","import * as React from 'react';\nimport {\n Flex,\n FlexItem,\n TextInputTypes,\n Button,\n ButtonVariant,\n ButtonType,\n Tooltip,\n} from '@patternfly/react-core';\nimport { GripVerticalIcon } from '@patternfly/react-icons/dist/esm/icons/grip-vertical-icon';\nimport { MinusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/minus-circle-icon';\nimport { useTranslation } from 'react-i18next';\nimport InputField from '../InputField';\nimport {\n TextColumnItemProps,\n TextColumnFieldChildParameterProps,\n MergeNewValueUtil,\n} from './text-column-types';\n\nexport type TextColumnItemContentProps = TextColumnItemProps & {\n previewDropRef: (node) => void | null;\n dragRef: (node) => void | null;\n opacity: number;\n};\n\nconst DEFAULT_CHILDREN = (\n props: TextColumnFieldChildParameterProps,\n mergeNewValue: MergeNewValueUtil,\n) => {\n const { name, onChange, ...otherProps } = props;\n\n return (\n <InputField\n {...otherProps}\n name={name}\n type={TextInputTypes.text}\n onChange={(e) => {\n if (onChange) {\n const values = mergeNewValue(e.target.value);\n onChange(values);\n }\n }}\n />\n );\n};\n\nconst TextColumnItemContent: React.FC<TextColumnItemContentProps> = ({\n name,\n dndEnabled,\n children = DEFAULT_CHILDREN,\n idx,\n isReadOnly,\n placeholder,\n onChange,\n arrayHelpers,\n rowValues,\n disableDeleteRow,\n tooltipDeleteRow,\n previewDropRef,\n dragRef,\n opacity,\n}) => {\n const { t } = useTranslation();\n\n const mergeNewValue: MergeNewValueUtil = (newValue) => {\n const values: string[] = [...rowValues];\n values[idx] = newValue;\n\n return values;\n };\n\n return (\n <div ref={previewDropRef} style={{ opacity }}>\n <Flex\n alignItems={{ default: 'alignItemsFlexStart' }}\n style={{ marginBottom: 'var(--pf-v5-global--spacer--sm)' }}\n >\n {dndEnabled && (\n <FlexItem style={{ cursor: 'move' }}>\n <div ref={dragRef}>\n <GripVerticalIcon />\n </div>\n </FlexItem>\n )}\n <FlexItem grow={{ default: 'grow' }}>\n {children({ name: `${name}.${idx}`, isReadOnly, placeholder, onChange }, mergeNewValue)}\n </FlexItem>\n {!isReadOnly && (\n <FlexItem>\n <Tooltip content={tooltipDeleteRow || t('console-shared~Remove')}>\n <Button\n aria-label={tooltipDeleteRow || t('console-shared~Remove')}\n variant={ButtonVariant.plain}\n type={ButtonType.button}\n isInline\n isDisabled={disableDeleteRow}\n onClick={() => {\n arrayHelpers.remove(idx);\n if (onChange) {\n const values = [...rowValues];\n values.splice(idx, 1);\n onChange(values);\n }\n }}\n >\n <MinusCircleIcon />\n </Button>\n </Tooltip>\n </FlexItem>\n )}\n </Flex>\n </div>\n );\n};\n\nexport default TextColumnItemContent;\n","/**\n * This component exists because of two issue with patternfly tooltip components\n * 1. If content changes while the tooltip is open, its position shift from the target\n * 2. Tooltip component is missing the onShow/OnHide events which are fired when the tooltip open/closed\n * Remove this component once https://github.com/patternfly/patternfly-react/issues/5620 is fixed.\n */\nimport * as React from 'react';\nimport { TooltipArrow } from '@patternfly/react-core/dist/js/components/Tooltip/TooltipArrow';\nimport { TooltipContent } from '@patternfly/react-core/dist/js/components/Tooltip/TooltipContent';\nimport { css } from '@patternfly/react-styles';\nimport styles from '@patternfly/react-styles/css/components/Tooltip/tooltip';\nimport { Tippy } from '../popper/Tippy';\nimport './Tooltip.scss';\n\nexport enum TooltipPlacement {\n top = 'top',\n left = 'left',\n right = 'right',\n bottom = 'bottom',\n}\n\ntype TooltipProps = {\n reference: Element | (() => HTMLElement);\n className?: string;\n placement?: TooltipPlacement;\n onShow?: (event: Event) => void;\n onHide?: (event: Event) => void;\n content: React.ReactNode;\n};\n\nexport const Tooltip: React.FC<TooltipProps> = ({ content, className, ...rest }) => {\n return (\n <Tippy\n className=\"ocs-tooltip\"\n tippyOptions={{\n modifiers: { arrow: { element: '.ocs-tooltip__arrow' } },\n }}\n {...rest}\n >\n <div className={css(styles.tooltip, className)}>\n <TooltipArrow className=\"ocs-tooltip__arrow\" />\n <TooltipContent>{content}</TooltipContent>\n </div>\n </Tippy>\n );\n};\n","import { useCallback } from 'react';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useDispatch } from 'react-redux';\nimport { setCloudShellCommand } from './cloud-shell-actions';\n\nexport const useCloudShellCommandDispatch = (): ((command: string | null) => void) => {\n const dispatch = useDispatch();\n return useCallback(\n (command: string) => {\n dispatch(setCloudShellCommand(command));\n },\n [dispatch],\n );\n};\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport * as React from 'react';\nimport { Menu, MenuContent, MenuGroup, MenuItem, MenuList, Divider } from '@patternfly/react-core';\nimport { Action, GroupedMenuOption, MenuOption, MenuOptionType } from '@console/dynamic-plugin-sdk';\nimport { orderExtensionBasedOnInsertBeforeAndAfter } from '../../../utils/order-extensions';\nimport { getMenuOptionType } from '../utils';\nimport ActionMenuItem from './ActionMenuItem';\n\ntype GroupMenuContentProps = {\n option: GroupedMenuOption;\n onClick: () => void;\n};\n\nconst GroupMenuContent: React.FC<GroupMenuContentProps> = ({ option, onClick }) => (\n <>\n <Divider />\n <MenuGroup label={option.label}>\n <MenuList>\n <ActionMenuContent\n options={option.children}\n onClick={onClick}\n focusItem={option.children[0]}\n />\n </MenuList>\n </MenuGroup>\n </>\n);\n\n// Need to keep this in the same file to avoid circular dependency.\nconst SubMenuContent: React.FC<GroupMenuContentProps> = ({ option, onClick }) => (\n <MenuItem\n data-test-action={option.id}\n flyoutMenu={\n <Menu containsFlyout>\n <MenuContent data-test-id=\"action-items\">\n <MenuList>\n <ActionMenuContent\n options={option.children}\n onClick={onClick}\n focusItem={option.children[0]}\n />\n </MenuList>\n </MenuContent>\n </Menu>\n }\n >\n {option.label}\n </MenuItem>\n);\n\ntype ActionMenuContentProps = {\n options: MenuOption[];\n onClick: () => void;\n focusItem?: MenuOption;\n};\n\nconst ActionMenuContent: React.FC<ActionMenuContentProps> = ({ options, onClick, focusItem }) => {\n const sortedOptions = orderExtensionBasedOnInsertBeforeAndAfter(options);\n return (\n <>\n {sortedOptions.map((option) => {\n const optionType = getMenuOptionType(option);\n switch (optionType) {\n case MenuOptionType.SUB_MENU:\n return (\n <SubMenuContent\n key={option.id}\n option={option as GroupedMenuOption}\n onClick={onClick}\n />\n );\n case MenuOptionType.GROUP_MENU:\n return (\n <GroupMenuContent\n key={option.id}\n option={option as GroupedMenuOption}\n onClick={onClick}\n />\n );\n default:\n return (\n <ActionMenuItem\n key={option.id}\n action={option as Action}\n onClick={onClick}\n autoFocus={focusItem ? option === focusItem : undefined}\n />\n );\n }\n })}\n </>\n );\n};\n\nexport default ActionMenuContent;\n","import * as React from 'react';\nimport { MenuToggle } from '@patternfly/react-core';\nimport { EllipsisVIcon } from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';\nimport { useTranslation } from 'react-i18next';\nimport { ActionMenuVariant } from '../types';\n\ntype ActionMenuToggleProps = {\n isOpen: boolean;\n isDisabled: boolean;\n menuRef: React.RefObject<HTMLElement>;\n toggleRef: React.RefObject<HTMLButtonElement>;\n toggleVariant?: ActionMenuVariant;\n toggleTitle?: string;\n onToggleClick: (state: React.SetStateAction<boolean>) => void;\n onToggleHover: () => void;\n};\n\nconst ActionMenuToggle: React.FC<ActionMenuToggleProps> = ({\n isOpen,\n isDisabled,\n menuRef,\n toggleRef,\n toggleVariant = ActionMenuVariant.KEBAB,\n toggleTitle,\n onToggleClick,\n onToggleHover,\n}) => {\n const { t } = useTranslation();\n const isKebabVariant = toggleVariant === ActionMenuVariant.KEBAB;\n const toggleLabel = toggleTitle || t('console-shared~Actions');\n\n const handleMenuKeys = (event) => {\n if (!isOpen) {\n return;\n }\n if (menuRef.current) {\n if (event.key === 'Escape') {\n onToggleClick(false);\n toggleRef.current.focus();\n }\n if (!menuRef.current?.contains(event.target) && event.key === 'Tab') {\n onToggleClick(false);\n }\n }\n };\n\n const handleClickOutside = (event) => {\n if (\n toggleRef.current !== event.target &&\n !toggleRef.current?.contains(event.target) &&\n !menuRef.current?.contains(event.target)\n ) {\n onToggleClick(false);\n }\n };\n\n React.useEffect(() => {\n if (isOpen) {\n window.addEventListener('keydown', handleMenuKeys);\n window.addEventListener('click', handleClickOutside);\n }\n return () => {\n window.removeEventListener('keydown', handleMenuKeys);\n window.removeEventListener('click', handleClickOutside);\n }; // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]); // This needs to be run only on component mount/unmount\n\n const handleToggleClick = () => {\n setTimeout(() => {\n const firstElement = menuRef?.current?.querySelector<HTMLElement>(\n 'li > button:not(:disabled)',\n );\n firstElement?.focus();\n }, 0);\n onToggleClick((open) => !open);\n };\n\n return (\n <MenuToggle\n variant={toggleVariant}\n innerRef={toggleRef}\n isExpanded={isOpen}\n isDisabled={isDisabled}\n aria-expanded={isOpen}\n aria-label={toggleLabel}\n aria-haspopup=\"true\"\n data-test-id={isKebabVariant ? 'kebab-button' : 'actions-menu-button'}\n onClick={handleToggleClick}\n onFocus={onToggleHover}\n onMouseOver={onToggleHover}\n >\n {isKebabVariant ? <EllipsisVIcon /> : toggleLabel}\n </MenuToggle>\n );\n};\n\nexport default ActionMenuToggle;\n","import * as React from 'react';\nimport i18next from 'i18next';\nimport { Trans } from 'react-i18next';\nimport { confirmModal } from '@console/internal/components/modals';\nimport { modelFor } from '@console/internal/module/k8s';\nimport { YellowExclamationTriangleIcon } from '@console/shared';\n\nconst confirmNavUnpinModal = (resource: string, pinnedResources: string[], updatePinsFn) => {\n const executeFn = () => {\n const updatedPinnedResources = [...pinnedResources];\n const index = pinnedResources.indexOf(resource);\n if (index >= 0) {\n updatedPinnedResources.splice(index, 1);\n updatePinsFn(updatedPinnedResources);\n }\n return Promise.resolve();\n };\n\n const label = modelFor(resource)?.labelPlural;\n const title = (\n <>\n <YellowExclamationTriangleIcon className=\"co-icon-space-r\" />{' '}\n {i18next.t('console-app~Remove from navigation?')}\n </>\n );\n const message = (\n <span>\n <Trans ns=\"public\">\n Are you sure you want to remove <strong>{{ label }}</strong> from navigation?\n </Trans>\n </span>\n );\n\n return confirmModal({\n title,\n message,\n btnText: i18next.t('console-app~Remove'),\n submitDanger: true,\n executeFn,\n });\n};\n\nexport default confirmNavUnpinModal;\n","export { default as GuidedTour } from './GuidedTour';\nexport { default as GuidedTourMastheadTrigger } from './GuidedTourMastheadTrigger';\nexport * from './type';\nexport * from './const';\nexport * from './tour-context';\n","import * as React from 'react';\nimport { Link, LinkProps } from 'react-router-dom-v5-compat';\n\nexport const NavLink: React.FC<NavLinkProps> = ({ children, dragRef, ...linkProps }) => {\n return (\n <Link data-test=\"nav\" ref={dragRef} {...linkProps}>\n {children}\n </Link>\n );\n};\n\nexport type NavLinkProps = LinkProps & {\n dragRef?: React.Ref<any>;\n};\n","import * as React from 'react';\nimport { NavItem } from '@patternfly/react-core';\nimport { HrefNavItem } from '@console/dynamic-plugin-sdk';\nimport { formatNamespacedRouteForHref, formatNamespacedRouteForResource } from '@console/shared';\nimport { useActiveNamespace } from '@console/shared/src/hooks/useActiveNamespace';\nimport { useLocation } from '@console/shared/src/hooks/useLocation';\nimport { NavLinkProps, NavLink } from './NavLink';\nimport { navItemHrefIsActive, stripScopeFromPath } from './utils';\n\nexport const NavItemHref: React.FC<NavItemHrefProps> = ({\n children,\n href,\n namespaced,\n prefixNamespaced,\n startsWith,\n dataAttributes,\n ...navLinkProps\n}) => {\n const [activeNamespace] = useActiveNamespace();\n const location = useLocation();\n const isActive = React.useMemo(() => navItemHrefIsActive(location, href, startsWith), [\n href,\n location,\n startsWith,\n ]);\n const to = React.useCallback(() => {\n if (namespaced) {\n return formatNamespacedRouteForHref(href, activeNamespace);\n }\n if (prefixNamespaced) {\n return formatNamespacedRouteForResource(stripScopeFromPath(href), activeNamespace);\n }\n return href;\n }, [activeNamespace, href, namespaced, prefixNamespaced]);\n return (\n <NavItem isActive={isActive}>\n <NavLink {...navLinkProps} {...dataAttributes} to={to()}>\n {children}\n </NavLink>\n </NavItem>\n );\n};\n\nexport type NavItemHrefProps = Omit<NavLinkProps, 'to'> &\n Pick<\n HrefNavItem['properties'],\n 'href' | 'namespaced' | 'prefixNamespaced' | 'startsWith' | 'dataAttributes'\n >;\n","import * as React from 'react';\nimport { NavExtension, isNavExtension } from '@console/dynamic-plugin-sdk/src/lib-core';\nimport { LoadedExtension, useExtensions } from '@console/plugin-sdk';\nimport { usePerspectives } from '@console/shared/src';\n\nexport const useNavExtensionsForPerspective = (\n perspective: string,\n): LoadedExtension<NavExtension>[] => {\n const allPerspectives = usePerspectives();\n const allNavExtensions = useExtensions<NavExtension>(isNavExtension);\n const isDefaultPerspective = React.useMemo(\n () =>\n allPerspectives?.some((p) => p.properties.default && p.properties.id === perspective) ??\n false,\n [allPerspectives, perspective],\n );\n const isExtensionForCurrentPerspective = React.useCallback(\n (extension) =>\n perspective === extension.properties.perspective ||\n (!extension.properties.perspective && isDefaultPerspective),\n [isDefaultPerspective, perspective],\n );\n return React.useMemo(() => allNavExtensions.filter(isExtensionForCurrentPerspective), [\n allNavExtensions,\n isExtensionForCurrentPerspective,\n ]);\n};\n","import * as React from 'react';\nimport { Button, Tab, TabTitleText, TabTitleIcon } from '@patternfly/react-core';\nimport { CloseIcon } from '@patternfly/react-icons/dist/esm/icons/close-icon';\nimport { PlusIcon } from '@patternfly/react-icons/dist/esm/icons/plus-icon';\nimport { useTranslation } from 'react-i18next';\nimport { Tabs } from '@console/app/src/components/tabs';\nimport { useTelemetry } from '@console/shared/src/hooks/useTelemetry';\nimport { sendActivityTick } from './cloud-shell-utils';\nimport CloudShellTerminal from './CloudShellTerminal';\nimport { TICK_INTERVAL } from './useActivityTick';\nimport './MultiTabbedTerminal.scss';\n\nconst MAX_TERMINAL_TABS = 8;\n\ninterface MultiTabbedTerminalProps {\n onClose?: () => void;\n}\n\nexport const MultiTabbedTerminal: React.FC<MultiTabbedTerminalProps> = ({ onClose }) => {\n const [terminalTabs, setTerminalTabs] = React.useState<number[]>([1]);\n const [activeTabKey, setActiveTabKey] = React.useState<number>(1);\n const [tickNamespace, setTickNamespace] = React.useState<string>(null);\n const [tickWorkspace, setTickWorkspace] = React.useState<string>(null);\n const { t } = useTranslation();\n const fireTelemetryEvent = useTelemetry();\n\n const tick = React.useCallback(() => {\n return tickNamespace && tickWorkspace && sendActivityTick(tickWorkspace, tickNamespace);\n }, [tickWorkspace, tickNamespace]);\n\n React.useEffect(() => {\n let startTime;\n let tickReq;\n const handleTick = (timestamp) => {\n if (!startTime || timestamp - startTime >= TICK_INTERVAL) {\n startTime = timestamp;\n tick();\n }\n tickReq = window.requestAnimationFrame(handleTick);\n };\n\n tickReq = window.requestAnimationFrame(handleTick);\n\n return () => {\n window.cancelAnimationFrame(tickReq);\n };\n }, [tick]);\n\n const addNewTerminal = () => {\n if (terminalTabs.length < MAX_TERMINAL_TABS) {\n const tabs = [...terminalTabs];\n const newTerminalNumber = terminalTabs[terminalTabs.length - 1] + 1;\n tabs.push(newTerminalNumber);\n setTerminalTabs(tabs);\n setActiveTabKey(newTerminalNumber);\n fireTelemetryEvent('Web Terminal New Tab');\n }\n };\n\n const removeCurrentTerminal = (event, tabIndex: number) => {\n event.stopPropagation();\n const tabs = [...terminalTabs];\n if (tabs[tabIndex] === activeTabKey) {\n setActiveTabKey(tabIndex > 0 ? tabs[tabIndex - 1] : tabs[tabs.length - 1]);\n }\n tabs.splice(tabIndex, 1);\n setTerminalTabs(tabs);\n };\n\n const getWorkspaceNamespace = (namespace: string, terminal: number) => {\n terminal === activeTabKey && namespace !== tickNamespace && setTickNamespace(namespace);\n };\n\n const getWorkspaceName = (name: string, terminal: number) => {\n terminal === activeTabKey && name !== tickWorkspace && setTickWorkspace(name);\n };\n\n return (\n <Tabs activeKey={activeTabKey} isBox data-test=\"multi-tab-terminal\">\n {terminalTabs.map((terminalNumber, tabIndex) => (\n <Tab\n className=\"co-multi-tabbed-terminal__tab\"\n data-test=\"multi-tab-terminal-tab\"\n eventKey={terminalNumber}\n key={terminalNumber}\n title={\n <div>\n <TabTitleText onClick={() => setActiveTabKey(terminalNumber)}>\n {t('webterminal-plugin~Terminal {{number}}', { number: terminalNumber })}\n </TabTitleText>\n <TabTitleIcon>\n {terminalTabs.length > 1 ? (\n <Button\n variant=\"plain\"\n style={{ padding: '0' }}\n aria-label={t('webterminal-plugin~Close terminal tab')}\n data-test=\"close-terminal-icon\"\n onClick={(event) => removeCurrentTerminal(event, tabIndex)}\n >\n <CloseIcon />\n </Button>\n ) : (\n <Button\n variant=\"plain\"\n style={{ padding: '0' }}\n aria-label={t('webterminal-plugin~Close terminal')}\n data-test=\"close-terminal-icon\"\n onClick={onClose}\n >\n <CloseIcon />\n </Button>\n )}\n </TabTitleIcon>\n </div>\n }\n >\n <CloudShellTerminal\n terminalNumber={terminalNumber}\n setWorkspaceName={getWorkspaceName}\n setWorkspaceNamespace={getWorkspaceNamespace}\n />\n </Tab>\n ))}\n {terminalTabs.length < MAX_TERMINAL_TABS && (\n <Tab\n eventKey=\"add-tab\"\n onClick={addNewTerminal}\n title={\n <TabTitleIcon>\n <Button\n variant=\"plain\"\n style={{ padding: '0' }}\n aria-label={t('webterminal-plugin~Add new tab')}\n data-test=\"add-terminal-icon\"\n >\n <PlusIcon />\n </Button>\n </TabTitleIcon>\n }\n />\n )}\n </Tabs>\n );\n};\n\nexport default MultiTabbedTerminal;\n","import * as React from 'react';\nimport { FormikProps, FormikValues } from 'formik';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { FlexForm, FormFooter, FormBody } from '@console/shared';\nimport AdminNamespaceSection from './AdminNamespaceSection';\nimport CloudShellAdvancedOption from './CloudShellAdvancedOption';\nimport NamespaceSection from './NamespaceSection';\n\nconst CloudShellSetupForm: React.FC<\n Pick<\n FormikProps<FormikValues>,\n 'errors' | 'handleSubmit' | 'handleReset' | 'status' | 'isSubmitting'\n > & { isAdmin?: boolean }\n> = ({ errors, handleSubmit, handleReset, status, isSubmitting, isAdmin = false }) => {\n const { t } = useTranslation();\n return (\n <FlexForm onSubmit={handleSubmit}>\n <FormBody className=\"co-m-pane__form\">\n {isAdmin ? <AdminNamespaceSection /> : <NamespaceSection />}\n <CloudShellAdvancedOption />\n </FormBody>\n <FormFooter\n handleReset={handleReset}\n errorMessage={status && status.submitError}\n isSubmitting={isSubmitting}\n submitLabel={t('webterminal-plugin~Start')}\n disableSubmit={!_.isEmpty(errors) || isSubmitting}\n resetLabel={t('webterminal-plugin~Cancel')}\n sticky\n />\n </FlexForm>\n );\n};\n\nexport default CloudShellSetupForm;\n","import * as _ from 'lodash';\n\n/**\n * Resolve URL string using `base` and `to` URLs.\n *\n * If `base` is missing the protocol, it's considered to be relative to document origin.\n *\n * @param base Base URL.\n * @param to Target resource URL.\n * @param processURL Custom URL processing callback.\n */\nexport const resolveURL = (\n base: string,\n to: string,\n processURL: (url: URL) => URL = _.identity,\n getDocumentOrigin: () => string = _.constant(window.location.origin),\n) => {\n const baseAbsoluteURL = base.indexOf('://') === -1 ? getDocumentOrigin() + base : base;\n return processURL(new URL(to, baseAbsoluteURL)).toString();\n};\n","import { K8sModel } from '../api/common-types';\n\nexport const ProjectModel: K8sModel = {\n abbr: 'PR',\n label: 'Project',\n apiVersion: 'v1',\n apiGroup: 'project.openshift.io',\n plural: 'projects',\n kind: 'Project',\n labelPlural: 'Projects',\n};\n\nexport const SelfSubjectAccessReviewModel: K8sModel = {\n abbr: 'SSAR',\n kind: 'SelfSubjectAccessReview',\n label: 'SelfSubjectAccessReview',\n labelPlural: 'SelfSubjectAccessReviews',\n plural: 'selfsubjectaccessreviews',\n apiVersion: 'v1',\n apiGroup: 'authorization.k8s.io',\n};\n","import {\n Dropdown as DropdownDeprecated,\n DropdownPosition as DropdownPositionDeprecated,\n KebabToggle as KebabToggleDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport * as React from 'react';\n\nimport { useBoolean } from './hooks/useBoolean';\n\nconst KebabDropdown: React.FC<{ dropdownItems: any[] }> = ({ dropdownItems }) => {\n const [isOpen, setIsOpen, , setClosed] = useBoolean(false);\n\n return (\n <DropdownDeprecated\n data-test-id=\"kebab-button\"\n dropdownItems={dropdownItems}\n isOpen={isOpen}\n isPlain\n onSelect={setClosed}\n position={DropdownPositionDeprecated.right}\n toggle={<KebabToggleDeprecated aria-label=\"toggle menu\" onToggle={setIsOpen} />}\n />\n );\n};\n\nexport default KebabDropdown;\n","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/openjdk.svg\";","import * as React from 'react';\nimport { TourActions } from './const';\nimport { TourContext } from './tour-context';\nimport TourStepComponent from './TourStepComponent';\nimport { StepContentType } from './type';\n\ntype StepComponentProps = {\n heading: string;\n content: StepContentType;\n selector?: string;\n placement?: string;\n showClose?: boolean;\n showStepBadge?: boolean;\n nextButtonText: string;\n backButtonText: string;\n};\n\nconst StepComponent: React.FC<StepComponentProps> = ({\n heading,\n content,\n selector,\n placement,\n nextButtonText,\n backButtonText,\n showClose = true,\n showStepBadge = true,\n}) => {\n const {\n tourDispatch,\n totalSteps,\n tourState: { stepNumber: step },\n } = React.useContext(TourContext);\n return (\n <TourStepComponent\n key={step}\n step={step}\n content={content}\n heading={heading}\n selector={selector}\n placement={placement}\n showClose={showClose}\n totalSteps={totalSteps}\n showStepBadge={showStepBadge}\n nextButtonText={nextButtonText}\n backButtonText={backButtonText}\n onClose={() => tourDispatch({ type: TourActions.complete })}\n onNext={() =>\n step > totalSteps\n ? tourDispatch({ type: TourActions.complete })\n : tourDispatch({ type: TourActions.next })\n }\n onBack={() =>\n step === 0\n ? tourDispatch({ type: TourActions.complete })\n : tourDispatch({ type: TourActions.back })\n }\n />\n );\n};\n\nexport default StepComponent;\n","module.exports = __webpack_public_path__ + \"assets/public/imgs/openshift-logo.svg\";","import { Location } from 'history';\nimport { getBrandingDetails } from '../masthead';\n\n/**\n * Removes sensitive informations from the pathname.\n *\n * At the moment it just removes usernames from\n * `/k8s/cluster/user.openshift.io~v1~User/a-user[...]`\n */\nexport const withoutSensitiveInformations = (location: Location): Location => {\n let pathname = location.pathname;\n if (pathname.startsWith('/k8s/cluster/user.openshift.io~v1~User/')) {\n pathname = pathname.replace(/User\\/[^/]+/, 'User/removed-username');\n }\n return {\n pathname,\n search: location.search,\n state: location.state,\n hash: location.hash,\n key: location.key,\n };\n};\n\nconst titleProductNameSuffix = ` · ${getBrandingDetails().productName}`;\n\nexport const getTelemetryTitle = () => {\n const titleElement = document.querySelector('title');\n let title = titleElement.getAttribute('data-telemetry') || document.title;\n if (title.endsWith(titleProductNameSuffix)) {\n title = title.substring(0, title.length - titleProductNameSuffix.length);\n }\n return title;\n};\n","import { safeDump, safeLoad } from 'js-yaml';\n\n// Safely parse js obj to yaml. Returns fallback (emtpy string by default) on exception.\nexport const safeJSToYAML = (js: any, fallback: string = '', options: any = {}): string => {\n try {\n return safeDump(js, options);\n } catch {\n return fallback;\n }\n};\n\n// Safely parse yaml to js object. Returns fallback (empty object by default) on exception.\nexport const safeYAMLToJS = (yaml: string, fallback: any = {}, options: any = {}): any => {\n try {\n return safeLoad(yaml, options);\n } catch {\n return fallback;\n }\n};\n\nexport const asyncJSToYAML = (js: any, options: any = {}): Promise<string> => {\n return new Promise((resolve, reject) => {\n try {\n const yaml = safeDump(js, options);\n resolve(yaml);\n } catch (e) {\n reject(e);\n }\n });\n};\n\nexport const asyncYAMLToJS = (yaml: string, options: any = {}): Promise<any> => {\n return new Promise((resolve, reject) => {\n try {\n const js = safeLoad(yaml, options);\n resolve(js);\n } catch (e) {\n reject(e);\n }\n });\n};\n","import * as React from 'react';\nimport { ActionGroup, Button } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\n\nimport { HandlePromiseProps, withHandlePromise } from '../utils';\nimport {\n createModalLauncher,\n ModalTitle,\n ModalBody,\n ModalFooter,\n ModalComponentProps,\n} from '../factory/modal';\nimport { YellowExclamationTriangleIcon } from '@console/shared';\n\nexport const ModalErrorContent = withHandlePromise<ErrorModalProps>((props) => {\n const { t } = useTranslation();\n const { error, title, cancel } = props;\n const titleText = title || t('public~Error');\n return (\n <div className=\"modal-content\">\n <ModalTitle>\n <YellowExclamationTriangleIcon className=\"co-icon-space-r\" /> {titleText}\n </ModalTitle>\n <ModalBody>{error}</ModalBody>\n <ModalFooter inProgress={false} errorMessage=\"\">\n <ActionGroup className=\"pf-v5-c-form pf-v5-c-form__actions--right pf-v5-c-form__group--no-top-margin\">\n <Button type=\"button\" variant=\"primary\" onClick={cancel}>\n {t('public~OK')}\n </Button>\n </ActionGroup>\n </ModalFooter>\n </div>\n );\n});\n\nexport const errorModal = createModalLauncher(ModalErrorContent);\n\nexport type ErrorModalProps = {\n error: string;\n title?: string;\n} & ModalComponentProps &\n HandlePromiseProps;\n","import * as classNames from 'classnames';\nimport * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport { Link } from 'react-router-dom-v5-compat';\n\nimport { useActivePerspective } from '@console/dynamic-plugin-sdk';\nimport { FLAGS } from '@console/shared';\nimport { featureReducerName } from '../../reducers/features';\nimport { getActiveNamespace } from '../../reducers/ui';\nimport { RootState } from '../../redux';\n\nconst mapStateToProps = (state: RootState) => ({\n canAccessMonitoring:\n !!state[featureReducerName].get(FLAGS.CAN_GET_NS) && !!window.SERVER_FLAGS.prometheusBaseURL,\n namespace: getActiveNamespace(state),\n});\n\nconst PrometheusGraphLink_: React.FC<PrometheusGraphLinkProps> = ({\n canAccessMonitoring,\n children,\n query,\n namespace,\n ariaChartLinkLabel,\n}) => {\n const [perspective] = useActivePerspective();\n const queries = _.compact(_.castArray(query));\n if (!queries.length) {\n return <>{children}</>;\n }\n\n const params = new URLSearchParams();\n queries.forEach((q, index) => params.set(`query${index}`, q));\n\n const url =\n canAccessMonitoring && perspective === 'admin'\n ? `/monitoring/query-browser?${params.toString()}`\n : `/dev-monitoring/ns/${namespace}/metrics?${params.toString()}`;\n\n return (\n <Link\n to={url}\n aria-label={ariaChartLinkLabel}\n style={{ color: 'inherit', textDecoration: 'none' }}\n >\n {children}\n </Link>\n );\n};\nexport const PrometheusGraphLink = connect(mapStateToProps)(PrometheusGraphLink_);\n\nexport const PrometheusGraph: React.FC<PrometheusGraphProps> = React.forwardRef(\n ({ children, className, title }, ref: React.RefObject<HTMLDivElement>) => (\n <div ref={ref} className={classNames('graph-wrapper graph-wrapper__horizontal-bar', className)}>\n {title && <h5 className=\"graph-title\">{title}</h5>}\n {children}\n </div>\n ),\n);\n\ntype PrometheusGraphLinkProps = {\n canAccessMonitoring: boolean;\n query: string | string[];\n namespace?: string;\n ariaChartLinkLabel?: string;\n};\n\ntype PrometheusGraphProps = {\n className?: string;\n ref?: React.Ref<HTMLDivElement>;\n title?: string;\n};\n","export * from './node-maintenance';\nexport * from './baremetal-hosts';\n","import * as React from 'react';\nimport * as classNames from 'classnames';\nimport * as _ from 'lodash-es';\n// FIXME upgrading redux types is causing many errors at this time\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { NamespaceBarProps, useActivePerspective } from '@console/dynamic-plugin-sdk';\nimport {\n ALL_NAMESPACES_KEY,\n FLAGS,\n KEYBOARD_SHORTCUTS,\n NamespaceDropdown,\n useActiveNamespace,\n useFlag,\n} from '@console/shared';\nimport { k8sGet } from '@console/internal/module/k8s';\nimport { setFlag } from '../actions/features';\nimport { NamespaceModel, ProjectModel } from '../models';\nimport { flagPending } from '../reducers/features';\nimport { Firehose, FirehoseResult, removeQueryArgument } from './utils';\nimport { useCreateNamespaceOrProjectModal } from '@console/shared/src/hooks/useCreateNamespaceOrProjectModal';\n\nexport type NamespaceBarDropdownsProps = {\n children: React.ReactNode;\n isDisabled: boolean;\n namespace?: FirehoseResult;\n onNamespaceChange: (namespace: string) => void;\n useProjects: boolean;\n};\n\nconst getModel = (useProjects) => (useProjects ? ProjectModel : NamespaceModel);\n\nexport const NamespaceBarDropdowns: React.FC<NamespaceBarDropdownsProps> = ({\n children,\n isDisabled,\n namespace,\n onNamespaceChange,\n useProjects,\n}) => {\n const createNamespaceOrProjectModal = useCreateNamespaceOrProjectModal();\n const dispatch = useDispatch();\n const [activeNamespace, setActiveNamespace] = useActiveNamespace();\n const activePerspective = useActivePerspective()[0];\n const [activeNamespaceError, setActiveNamespaceError] = React.useState(false);\n const canListNS = useFlag(FLAGS.CAN_LIST_NS);\n React.useEffect(() => {\n if (namespace.loaded) {\n dispatch(setFlag(FLAGS.SHOW_OPENSHIFT_START_GUIDE, _.isEmpty(namespace.data)));\n }\n }, [dispatch, namespace.data, namespace.loaded]);\n\n /* Check if the activeNamespace is present in the cluster */\n React.useEffect(() => {\n if (activePerspective === 'dev' && activeNamespace !== ALL_NAMESPACES_KEY) {\n k8sGet(useProjects ? ProjectModel : NamespaceModel, activeNamespace)\n .then(() => {\n setActiveNamespace(activeNamespace);\n setActiveNamespaceError(false);\n })\n .catch((err) => {\n if (err?.response?.status === 404) {\n /* This would redirect to \"/all-namespaces\" to show the Project List */\n setActiveNamespace(ALL_NAMESPACES_KEY);\n setActiveNamespaceError(true);\n }\n });\n }\n }, [activeNamespace, activePerspective, setActiveNamespace, activeNamespaceError, useProjects]);\n\n if (flagPending(canListNS)) {\n return null;\n }\n\n return (\n <div className=\"co-namespace-bar__items\" data-test-id=\"namespace-bar-dropdown\">\n <NamespaceDropdown\n onSelect={(event, newNamespace) => {\n onNamespaceChange?.(newNamespace);\n setActiveNamespace(newNamespace);\n removeQueryArgument('project-name');\n }}\n onCreateNew={() => {\n createNamespaceOrProjectModal({\n onSubmit: (newProject) => {\n setActiveNamespace(newProject.metadata.name);\n removeQueryArgument('project-name');\n },\n });\n }}\n selected={!activeNamespaceError ? activeNamespace : ALL_NAMESPACES_KEY}\n isProjects={getModel(useProjects).label === 'Project'}\n disabled={isDisabled}\n shortCut={KEYBOARD_SHORTCUTS.focusNamespaceDropdown}\n />\n {children}\n </div>\n );\n};\n\nexport const NamespaceBar: React.FC<NamespaceBarProps & { hideProjects?: boolean }> = ({\n onNamespaceChange,\n isDisabled,\n children,\n hideProjects = false,\n}) => {\n const useProjects = useSelector(({ k8s }) =>\n k8s.hasIn(['RESOURCES', 'models', ProjectModel.kind]),\n );\n return (\n <div\n className={classNames('co-namespace-bar', { 'co-namespace-bar--no-project': hideProjects })}\n >\n {hideProjects ? (\n <div className=\"co-namespace-bar__items\" data-test-id=\"namespace-bar-dropdown\">\n {children}\n </div>\n ) : (\n // Data from Firehose is not used directly by the NamespaceDropdown nor the children.\n // Data is used to determine if the StartGuide should be shown.\n // See NamespaceBarDropdowns_ above.\n <Firehose\n resources={[{ kind: getModel(useProjects).kind, prop: 'namespace', isList: true }]}\n >\n <NamespaceBarDropdowns\n useProjects={useProjects}\n isDisabled={isDisabled}\n onNamespaceChange={onNamespaceChange}\n >\n {children}\n </NamespaceBarDropdowns>\n </Firehose>\n )}\n </div>\n );\n};\n","import * as React from 'react';\nimport { Helmet } from 'react-helmet';\nimport * as classNames from 'classnames';\nimport * as _ from 'lodash-es';\n/* eslint-disable import/named */\nimport { useTranslation, withTranslation, WithTranslation } from 'react-i18next';\nimport { TFunction } from 'i18next';\nimport { Link, Routes, Route, useParams, Navigate, useLocation } from 'react-router-dom-v5-compat';\nimport {\n HorizontalNavTab as DynamicResourceNavTab,\n isHorizontalNavTab as DynamicIsResourceNavTab,\n NavTab as DynamicNavTab,\n isTab as DynamicIsNavTab,\n} from '@console/dynamic-plugin-sdk/src/extensions/horizontal-nav-tabs';\nimport { ExtensionK8sGroupModel } from '@console/dynamic-plugin-sdk/src/api/common-types';\nimport { PageTitleContext } from '@console/shared/src/components/pagetitle/PageTitleContext';\nimport { ErrorBoundaryPage } from '@console/shared/src/components/error';\nimport { K8sResourceKind, K8sResourceCommon } from '../../module/k8s';\nimport { referenceForModel, referenceFor, referenceForExtensionModel } from '../../module/k8s/k8s';\nimport { PodsPage } from '../pod';\nimport { AsyncComponent } from './async';\nimport { ResourceMetricsDashboard } from './resource-metrics';\nimport { EmptyBox, LoadingBox, StatusBox } from './status-box';\nimport {\n HorizontalNavProps as HorizontalNavFacadeProps,\n NavPage,\n} from '@console/dynamic-plugin-sdk/src/extensions/console-types';\nimport { useExtensions, HorizontalNavTab, isHorizontalNavTab } from '@console/plugin-sdk/src';\n\nconst removeLeadingSlash = (str: string | undefined) => str?.replace(/^\\//, '') || '';\n\nexport const editYamlComponent = (props) => (\n <AsyncComponent loader={() => import('../edit-yaml').then((c) => c.EditYAML)} obj={props.obj} />\n);\nexport const viewYamlComponent = (props) => (\n <AsyncComponent\n loader={() => import('../edit-yaml').then((c) => c.EditYAML)}\n obj={props.obj}\n readOnly={true}\n />\n);\n\nclass PodsComponentWithTranslation extends React.PureComponent<\n PodsComponentProps & WithTranslation\n> {\n render() {\n const {\n metadata: { namespace },\n spec: { selector },\n } = this.props.obj;\n const { showNodes, t } = this.props;\n if (_.isEmpty(selector)) {\n return <EmptyBox label={t('public~Pods')} />;\n }\n\n // Hide the create button to avoid confusion when showing pods for an object.\n // Otherwise it might seem like you click \"Create Pod\" to add replicas instead\n // of scaling the owner.\n return (\n <PodsPage\n showTitle={false}\n namespace={namespace}\n selector={selector}\n canCreate={false}\n showNodes={showNodes}\n />\n );\n }\n}\n\nexport const PodsComponent = withTranslation()(PodsComponentWithTranslation);\n\ntype NavFactory = { [name: string]: (c?: React.ComponentType<any>) => Page };\nexport const navFactory: NavFactory = {\n details: (component) => ({\n href: '',\n // t('public~Details')\n nameKey: 'public~Details',\n component,\n }),\n events: (component) => ({\n href: 'events',\n // t('public~Events')\n nameKey: 'public~Events',\n component,\n }),\n logs: (component) => ({\n href: 'logs',\n // t('public~Logs')\n nameKey: 'public~Logs',\n component,\n }),\n editYaml: (component) => ({\n href: 'yaml',\n // t('public~YAML')\n nameKey: 'public~YAML',\n component: component || editYamlComponent,\n }),\n pods: (component) => ({\n href: 'pods',\n // t('public~Pods')\n nameKey: 'public~Pods',\n component: component || PodsComponent,\n }),\n jobs: (component) => ({\n href: 'jobs',\n // t('public~Jobs')\n nameKey: 'public~Jobs',\n component,\n }),\n roles: (component) => ({\n href: 'roles',\n // t('public~RoleBindings')\n nameKey: 'public~RoleBindings',\n component,\n }),\n builds: (component) => ({\n href: 'builds',\n // t('public~Builds')\n nameKey: 'public~Builds',\n component,\n }),\n envEditor: (component) => ({\n href: 'environment',\n // t('public~Environment')\n nameKey: 'public~Environment',\n component,\n }),\n clusterOperators: (component) => ({\n href: 'clusteroperators',\n // t('public~Cluster Operators')\n nameKey: 'public~Cluster Operators',\n component,\n }),\n machineConfigs: (component) => ({\n href: 'machineconfigs',\n // t('public~MachineConfigs')\n nameKey: 'public~MachineConfigs',\n component,\n }),\n machines: (component) => ({\n href: 'machines',\n // t('public~Machines')\n nameKey: 'public~Machines',\n component,\n }),\n workloads: (component) => ({\n href: 'workloads',\n // t('public~Workloads')\n nameKey: 'public~Workloads',\n component,\n }),\n history: (component) => ({\n href: 'history',\n // t('public~History')\n nameKey: 'public~History',\n component,\n }),\n metrics: (component) => ({\n href: 'metrics',\n // t('public~Metrics')\n nameKey: 'public~Metrics',\n component: component ?? ResourceMetricsDashboard,\n }),\n terminal: (component) => ({\n href: 'terminal',\n // t('public~Terminal')\n nameKey: 'public~Terminal',\n component,\n }),\n};\n\nexport const NavBar: React.FC<NavBarProps> = ({ pages }) => {\n const { t } = useTranslation();\n const { telemetryPrefix, titlePrefix } = React.useContext(PageTitleContext);\n const location = useLocation();\n\n const sliced = location.pathname.split('/');\n const lastElement = sliced.pop();\n const defaultPage =\n pages.filter((p) => {\n return p.href === lastElement;\n }).length === 0;\n const baseURL = defaultPage ? location.pathname : sliced.join('/');\n\n const tabs = (\n <>\n {pages.map(({ name, nameKey, href }) => {\n const isURLMatch = defaultPage ? href === '' : lastElement === href;\n\n const klass = classNames('co-m-horizontal-nav__menu-item', {\n 'co-m-horizontal-nav-item--active': isURLMatch,\n });\n return (\n <li className={klass} key={href}>\n <Link\n to={`${baseURL.replace(/\\/$/, '')}/${removeLeadingSlash(href)}`}\n data-test-id={`horizontal-link-${nameKey ? nameKey.split('~')[1] : name}`}\n >\n {nameKey ? t(nameKey) : name}\n </Link>\n </li>\n );\n })}\n </>\n );\n\n const activePage = pages.find(({ href }) => {\n return defaultPage ? href === '' : lastElement === href;\n });\n\n const labelId = activePage?.nameKey?.split('~')[1] || activePage?.name || 'Details';\n return (\n <>\n <Helmet>\n <title data-telemetry={telemetryPrefix ? `${telemetryPrefix} · ${labelId}` : labelId}>\n {titlePrefix\n ? `${titlePrefix} · ${activePage?.nameKey ? t(activePage.nameKey) : activePage?.name}`\n : `${activePage?.nameKey ? t(activePage.nameKey) : activePage?.name}`}\n </title>\n </Helmet>\n <ul className=\"co-m-horizontal-nav__menu\">{tabs}</ul>\n </>\n );\n};\nNavBar.displayName = 'NavBar';\n\nexport const HorizontalNav = React.memo((props: HorizontalNavProps) => {\n const params = useParams();\n\n const renderContent = (routes: JSX.Element[]) => {\n const { noStatusBox, obj, EmptyMsg, label } = props;\n const content = (\n <React.Suspense fallback={<LoadingBox />}>\n <Routes>{routes}</Routes>\n </React.Suspense>\n );\n\n const skeletonDetails = (\n <div data-test=\"skeleton-detail-view\" className=\"skeleton-detail-view\">\n <div className=\"skeleton-detail-view--head\" />\n <div className=\"skeleton-detail-view--grid\">\n <div className=\"skeleton-detail-view--column\">\n <div className=\"skeleton-detail-view--tile skeleton-detail-view--tile-plain\" />\n <div className=\"skeleton-detail-view--tile skeleton-detail-view--tile-resource\" />\n <div className=\"skeleton-detail-view--tile skeleton-detail-view--tile-labels\" />\n <div className=\"skeleton-detail-view--tile skeleton-detail-view--tile-resource\" />\n </div>\n <div className=\"skeleton-detail-view--column\">\n <div className=\"skeleton-detail-view--tile skeleton-detail-view--tile-plain\" />\n <div className=\"skeleton-detail-view--tile skeleton-detail-view--tile-plain\" />\n <div className=\"skeleton-detail-view--tile skeleton-detail-view--tile-resource\" />\n <div className=\"skeleton-detail-view--tile skeleton-detail-view--tile-plain\" />\n </div>\n </div>\n </div>\n );\n\n if (noStatusBox) {\n return content;\n }\n\n return (\n <StatusBox skeleton={skeletonDetails} {...obj} EmptyMsg={EmptyMsg} label={label}>\n {content}\n </StatusBox>\n );\n };\n\n const componentProps = {\n ..._.pick(props, ['filters', 'selected', 'loaded']),\n obj: _.get(props.obj, 'data'),\n };\n const extraResources = _.reduce(\n props.resourceKeys,\n (extraObjs, key) => ({ ...extraObjs, [key]: _.get(props[key], 'data') }),\n {},\n );\n\n const objReference = props.obj?.data ? referenceFor(props.obj.data) : '';\n const contextId = props.contextId;\n const dynamicResourceNavTabExtensions = useExtensions<DynamicResourceNavTab>(\n DynamicIsResourceNavTab,\n );\n const dynamicTabExtensions = useExtensions<DynamicNavTab>(DynamicIsNavTab);\n const navTabExtensions = useExtensions<HorizontalNavTab>(isHorizontalNavTab);\n\n const pluginPages = React.useMemo(\n () =>\n navTabExtensions\n .filter((tab) => referenceForModel(tab.properties.model) === objReference)\n .map((tab) => ({\n ...tab.properties.page,\n component: (pageProps: PageComponentProps) => (\n <AsyncComponent {...pageProps} loader={tab.properties.loader} />\n ),\n })),\n [navTabExtensions, objReference],\n );\n\n const dynamicPluginPages = React.useMemo(() => {\n const resolvedResourceNavTab = dynamicResourceNavTabExtensions\n .filter(\n (tab) =>\n referenceForExtensionModel(tab.properties.model as ExtensionK8sGroupModel) ===\n objReference,\n )\n .map((tab) => ({\n ...tab.properties.page,\n component: (pageProps: PageComponentProps) => (\n <AsyncComponent {...pageProps} loader={tab.properties.component} />\n ),\n }));\n\n const resolvedNavTab = dynamicTabExtensions\n .filter((tab) => tab.properties.contextId === contextId)\n .map((tab) => ({\n name: tab.properties.name,\n href: tab.properties.href,\n component: (pageProps: PageComponentProps) => (\n <AsyncComponent {...pageProps} loader={tab.properties.component} />\n ),\n }));\n\n return [...resolvedResourceNavTab, ...resolvedNavTab].sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n }, [dynamicResourceNavTabExtensions, dynamicTabExtensions, objReference, contextId]);\n\n const pages: Page[] = [\n ...(props.pages || props.pagesFor(props.obj?.data)),\n ...pluginPages,\n ...dynamicPluginPages,\n ];\n\n const routes = pages.map((p) => {\n return (\n <Route\n path={p.path || p.href}\n key={p.nameKey || p.name}\n element={\n <ErrorBoundaryPage>\n <p.component\n {...params}\n {...componentProps}\n {...extraResources}\n {...p.pageData}\n customData={props.customData}\n params={params}\n />\n </ErrorBoundaryPage>\n }\n />\n );\n });\n\n // Handle cases where matching Routes do not exist and show the details page instead of a blank page\n if (props.createRedirect && routes.length >= 1) {\n routes.push(\n <Route key=\"fallback_redirect\" element={<Navigate to={routes[0].props.path} replace />} />,\n );\n }\n\n return (\n <div className={classNames('co-m-page__body', props.className)}>\n <div className=\"co-m-horizontal-nav\">{!props.hideNav && <NavBar pages={pages} />}</div>\n {renderContent(routes)}\n </div>\n );\n}, _.isEqual);\n\n/*\n * Component consumed by the dynamic plugin SDK\n * Changes to the underlying component has to support props used in this facade\n */\nexport const HorizontalNavFacade: React.FC<HorizontalNavFacadeProps> = ({ resource, pages }) => {\n const obj = { data: resource, loaded: true };\n\n return <HorizontalNav obj={obj} pages={pages} noStatusBox />;\n};\n\nexport type PodsComponentProps = {\n obj: K8sResourceKind;\n showNodes?: boolean;\n t: TFunction;\n};\n\nexport type PageComponentProps<R extends K8sResourceCommon = K8sResourceKind> = {\n filters?: any;\n selected?: any;\n match?: any;\n obj?: R;\n params?: any;\n customData?: any;\n showTitle?: boolean;\n fieldSelector?: string;\n};\n\nexport type Page<D = any> = Partial<Omit<NavPage, 'component'>> & {\n component?: React.ComponentType<PageComponentProps & D>;\n badge?: React.ReactNode;\n pageData?: D;\n nameKey?: string;\n};\n\nexport type NavBarProps = {\n pages: Page[];\n baseURL?: string;\n basePath?: string;\n};\n\nexport type HorizontalNavProps = Omit<HorizontalNavFacadeProps, 'pages' | 'resource'> & {\n /* The facade support a limited set of properties for pages */\n className?: string;\n createRedirect?: boolean;\n contextId?: string;\n pages: Page[];\n label?: string;\n obj?: { data: K8sResourceCommon; loaded: boolean };\n pagesFor?: (obj: K8sResourceKind) => Page[];\n resourceKeys?: string[];\n hideNav?: boolean;\n EmptyMsg?: React.ComponentType<any>;\n customData?: any;\n noStatusBox?: boolean;\n};\n\nHorizontalNav.displayName = 'HorizontalNav';\nHorizontalNavFacade.displayName = 'HorizontalNavFacade';\n","import * as React from 'react';\nimport { Accordion, Button } from '@patternfly/react-core';\nimport { PauseIcon } from '@patternfly/react-icons/dist/esm/icons/pause-icon';\nimport { PlayIcon } from '@patternfly/react-icons/dist/esm/icons/play-icon';\nimport classNames from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from 'react-router-dom-v5-compat';\nimport {\n ActivityBodyProps,\n OngoingActivityBodyProps,\n RecentEventsBodyProps,\n} from '@console/dynamic-plugin-sdk/src/api/internal-types';\nimport { ErrorLoadingEvents, sortEvents } from '@console/internal/components/events';\nimport { AsyncComponent } from '@console/internal/components/utils/async';\nimport { Timestamp } from '@console/internal/components/utils/timestamp';\nimport { EventKind } from '@console/internal/module/k8s';\nimport { ErrorBoundaryInline } from '@console/shared/src/components/error';\nimport EventItem from './EventItem';\n\nimport './activity-card.scss';\n\nexport const Activity: React.FC<ActivityProps> = ({ timestamp, children }) => {\n const { t } = useTranslation();\n return (\n <div className=\"co-activity-item__ongoing\" data-test=\"activity\">\n {timestamp && (\n <span className=\"text-secondary\">\n {t('console-shared~Started')}{' '}\n <span data-test=\"timestamp\">\n <Timestamp simple timestamp={timestamp.toString()} />\n </span>\n </span>\n )}\n {children}\n </div>\n );\n};\n\nexport const RecentEventsBodyContent: React.FC<RecentEventsBodyContentProps> = ({\n events,\n filter,\n paused,\n setPaused,\n moreLink,\n}) => {\n const { t } = useTranslation();\n const ref = React.useRef<EventKind[]>([]);\n React.useEffect(() => {\n if (paused && events) {\n ref.current = events.data;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [paused]);\n if (!paused && events) {\n ref.current = events.data;\n }\n const eventsData = ref.current;\n const [expanded, setExpanded] = React.useState<string[]>([]);\n const onToggle = React.useCallback(\n (uid: string) => {\n const isExpanded = expanded.includes(uid);\n const newExpanded = isExpanded ? expanded.filter((e) => e !== uid) : [...expanded, uid];\n setPaused(isExpanded ? !!newExpanded.length : !isExpanded);\n setExpanded(newExpanded);\n },\n [expanded, setPaused],\n );\n const isExpanded = React.useCallback(\n (uid: string) => {\n return expanded.includes(uid);\n },\n [expanded],\n );\n\n if (events && events.loadError) {\n return <ErrorLoadingEvents />;\n }\n if (!(events && events.loaded)) {\n return (\n <div className=\"co-status-card__alerts-body\">\n <div className=\"co-status-card__alert-item co-status-card__alert-item--loading\">\n <div className=\"skeleton-activity__dashboard\" />\n <div className=\"skeleton-activity__dashboard\" />\n <div className=\"skeleton-activity__dashboard\" />\n <div className=\"skeleton-activity__dashboard\" />\n <div className=\"skeleton-activity__dashboard\" />\n </div>\n </div>\n );\n }\n\n const filteredEvents = filter ? eventsData.filter(filter) : eventsData;\n const sortedEvents: EventKind[] = sortEvents(filteredEvents);\n const lastEvents = sortedEvents.slice(0, 50);\n if (sortedEvents.length === 0) {\n return (\n <Activity>\n <div className=\"text-secondary\">{t('console-shared~There are no recent events.')}</div>\n </Activity>\n );\n }\n return (\n <>\n <Accordion\n asDefinitionList={false}\n headingLevel=\"h5\"\n className=\"co-activity-card__recent-accordion\"\n >\n {lastEvents.map((e) => (\n <EventItem key={e.metadata.uid} isExpanded={isExpanded} onToggle={onToggle} event={e} />\n ))}\n </Accordion>\n {sortedEvents.length > 50 && !!moreLink && (\n <Link\n className=\"co-activity-card__recent-more-link\"\n to={moreLink}\n data-test=\"events-view-all-link\"\n >\n {t('console-shared~View all events')}\n </Link>\n )}\n </>\n );\n};\n\nexport const PauseButton: React.FC<PauseButtonProps> = ({ paused, togglePause }) => {\n const { t } = useTranslation();\n return (\n <Button\n variant=\"link\"\n isInline\n onClick={togglePause}\n className=\"co-activity-card__recent-actions\"\n icon={paused ? <PlayIcon /> : <PauseIcon />}\n data-test-id=\"events-pause-button\"\n data-test=\"events-pause-button\"\n >\n {paused ? t('console-shared~Resume') : t('console-shared~Pause')}\n </Button>\n );\n};\n\nexport const RecentEventsBody: React.FC<RecentEventsBodyProps> = (props) => {\n const { t } = useTranslation();\n const [paused, setPaused] = React.useState(false);\n const togglePause = React.useCallback(() => setPaused(!paused), [paused]);\n return (\n <>\n <div className=\"co-activity-card__recent-title\" data-test=\"activity-recent-title\">\n {t('console-shared~Recent events')}\n <PauseButton paused={paused} togglePause={togglePause} />\n </div>\n <RecentEventsBodyContent {...props} paused={paused} setPaused={setPaused} />\n </>\n );\n};\n\nexport const OngoingActivityBody: React.FC<OngoingActivityBodyProps> = ({\n loaded,\n resourceActivities = [],\n prometheusActivities = [],\n}) => {\n const { t } = useTranslation();\n const activitiesLoaded =\n loaded || resourceActivities.length > 0 || prometheusActivities.length > 0;\n let body: React.ReactNode;\n if (!activitiesLoaded) {\n body = (\n <div className=\"co-activity-item__ongoing\">\n <div className=\"skeleton-activity__dashboard\" />\n </div>\n );\n } else {\n const allActivities = prometheusActivities.map(\n ({ results, loader, component: Component }, idx) => (\n // eslint-disable-next-line react/no-array-index-key\n <Activity key={idx}>\n <ErrorBoundaryInline>\n {loader ? (\n <AsyncComponent loader={loader} results={results} />\n ) : (\n <Component results={results} />\n )}\n </ErrorBoundaryInline>\n </Activity>\n ),\n );\n resourceActivities\n .sort((a, b) => +b.timestamp - +a.timestamp)\n .forEach(({ resource, timestamp, loader, component: Component }) =>\n allActivities.push(\n <Activity key={resource.metadata.uid} timestamp={timestamp}>\n <ErrorBoundaryInline>\n {loader ? (\n <AsyncComponent loader={loader} resource={resource} />\n ) : (\n <Component resource={resource} />\n )}\n </ErrorBoundaryInline>\n </Activity>,\n ),\n );\n body = allActivities.length ? (\n allActivities\n ) : (\n <Activity>\n <div className=\"text-secondary\">{t('console-shared~There are no ongoing activities.')}</div>\n </Activity>\n );\n }\n return (\n <>\n <div className=\"co-activity-card__ongoing-title\" data-test=\"ongoing-title\">\n {t('console-shared~Ongoing')}\n </div>\n <div className=\"co-activity-card__ongoing-body\">{body}</div>\n </>\n );\n};\n\nconst ActivityBody: React.FC<ActivityBodyProps> = ({ children, className }) => (\n <div className={classNames('co-activity-card__body', className)} id=\"activity-body\">\n {children}\n </div>\n);\n\nexport default ActivityBody;\n\ntype RecentEventsBodyContentProps = RecentEventsBodyProps & {\n paused?: boolean;\n setPaused?: (paused: boolean) => void;\n};\n\ntype ActivityProps = {\n timestamp?: Date;\n children: React.ReactNode;\n};\n\ntype PauseButtonProps = {\n paused: boolean;\n togglePause: () => void;\n};\n","export * from './helm';\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport * as React from 'react';\nimport * as PropTypes from 'prop-types';\nimport * as _ from 'lodash-es';\nimport * as classNames from 'classnames';\nimport { DragSource, DropTarget } from 'react-dnd';\nimport { DRAGGABLE_TYPE } from './draggable-item-types';\nimport { Button, Tooltip } from '@patternfly/react-core';\nimport { GripVerticalIcon } from '@patternfly/react-icons/dist/esm/icons/grip-vertical-icon';\nimport { MinusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/minus-circle-icon';\nimport { PlusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon';\n\nimport { withTranslation } from 'react-i18next';\n\nimport { NameValueEditorPair, EnvFromPair, EnvType } from './index';\nimport { ValueFromPair } from './value-from-pair';\nimport withDragDropContext from './drag-drop-context';\n\nconst NameValueEditor_ = withDragDropContext(\n class NameValueEditor extends React.Component {\n constructor(props) {\n super(props);\n this._append = this._append.bind(this);\n this._appendConfigMapOrSecret = this._appendConfigMapOrSecret.bind(this);\n this._change = this._change.bind(this);\n this._move = this._move.bind(this);\n this._remove = this._remove.bind(this);\n }\n\n _append() {\n const { updateParentData, nameValuePairs, nameValueId } = this.props;\n\n updateParentData(\n { nameValuePairs: nameValuePairs.concat([['', '', nameValuePairs.length]]) },\n nameValueId,\n );\n }\n\n _appendConfigMapOrSecret() {\n const { updateParentData, nameValuePairs, nameValueId } = this.props;\n const configMapSecretKeyRef = { name: '', key: '' };\n updateParentData(\n {\n nameValuePairs: nameValuePairs.concat([\n ['', { configMapSecretKeyRef }, nameValuePairs.length],\n ]),\n },\n nameValueId,\n );\n }\n\n _remove(i) {\n const { updateParentData, nameValueId, onLastItemRemoved } = this.props;\n const nameValuePairs = _.cloneDeep(this.props.nameValuePairs);\n nameValuePairs.splice(i, 1);\n nameValuePairs.forEach((values, index) => (values[2] = index)); // update the indices in order.\n\n updateParentData(\n { nameValuePairs: nameValuePairs.length ? nameValuePairs : [['', '', 0]] },\n nameValueId,\n );\n\n if (nameValuePairs.length === 0 && !!onLastItemRemoved) {\n onLastItemRemoved();\n }\n }\n\n _change(e, i, type) {\n const { updateParentData, nameValueId } = this.props;\n const nameValuePairs = _.cloneDeep(this.props.nameValuePairs);\n\n nameValuePairs[i][\n type === NameValueEditorPair.Name ? NameValueEditorPair.Name : NameValueEditorPair.Value\n ] = e.target.value;\n updateParentData({ nameValuePairs }, nameValueId);\n }\n\n _move(dragIndex, hoverIndex) {\n const { updateParentData, nameValueId } = this.props;\n const nameValuePairs = _.cloneDeep(this.props.nameValuePairs);\n const movedPair = nameValuePairs[dragIndex];\n\n nameValuePairs[dragIndex] = nameValuePairs[hoverIndex];\n nameValuePairs[hoverIndex] = movedPair;\n updateParentData({ nameValuePairs }, nameValueId);\n }\n\n render() {\n const {\n addString,\n nameValuePairs,\n allowSorting,\n readOnly,\n nameValueId,\n configMaps,\n secrets,\n addConfigMapSecret,\n toolTip,\n t,\n onLastItemRemoved,\n } = this.props;\n const nameString = this.props.nameString || t('public~Key');\n const valueString = this.props.valueString || t('public~Value');\n const pairElems = nameValuePairs.map((pair, i) => {\n const key = _.get(pair, [NameValueEditorPair.Index], i);\n const isEmpty = nameValuePairs.length === 1 && nameValuePairs[0].every((value) => !value);\n return (\n <PairElement\n onChange={this._change}\n index={i}\n nameString={nameString}\n valueString={valueString}\n allowSorting={allowSorting}\n readOnly={readOnly}\n pair={pair}\n key={key}\n onRemove={this._remove}\n onMove={this._move}\n rowSourceId={nameValueId}\n configMaps={configMaps}\n secrets={secrets}\n isEmpty={isEmpty}\n disableReorder={nameValuePairs.length === 1}\n toolTip={toolTip}\n alwaysAllowRemove={!!onLastItemRemoved}\n />\n );\n });\n return (\n <>\n <div className=\"row pairs-list__heading\">\n {!readOnly && allowSorting && <div className=\"col-xs-1 co-empty__header\" />}\n <div className=\"col-xs-5\">{nameString}</div>\n <div className=\"col-xs-5\">{valueString}</div>\n <div className=\"col-xs-1 co-empty__header\" />\n </div>\n {pairElems}\n <div className=\"row\">\n <div className=\"col-xs-12\">\n {readOnly ? null : (\n <div className=\"co-toolbar__group co-toolbar__group--left\">\n <Button\n className=\"pf-m-link--align-left\"\n data-test=\"add-button\"\n onClick={this._append}\n type=\"button\"\n variant=\"link\"\n >\n <PlusCircleIcon\n data-test-id=\"pairs-list__add-icon\"\n className=\"co-icon-space-r\"\n />\n {addString ? addString : t('public~Add more')}\n </Button>\n {addConfigMapSecret && (\n <>\n <Button\n className=\"pf-m-link--align-left\"\n onClick={this._appendConfigMapOrSecret}\n type=\"button\"\n variant=\"link\"\n >\n <PlusCircleIcon\n data-test-id=\"pairs-list__add-icon\"\n className=\"co-icon-space-r\"\n />\n {t('public~Add from ConfigMap or Secret')}\n </Button>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n </>\n );\n }\n },\n);\n\nexport const NameValueEditor = withTranslation()(NameValueEditor_);\n\nNameValueEditor.propTypes = {\n nameString: PropTypes.string,\n valueString: PropTypes.string,\n addString: PropTypes.string,\n allowSorting: PropTypes.bool,\n readOnly: PropTypes.bool,\n nameValueId: PropTypes.number,\n nameValuePairs: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.string),\n PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.object])),\n PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.number]),\n ),\n ]),\n ).isRequired,\n updateParentData: PropTypes.func.isRequired,\n configMaps: PropTypes.object,\n secrets: PropTypes.object,\n addConfigMapSecret: PropTypes.bool,\n toolTip: PropTypes.string,\n onLastItemRemoved: PropTypes.func,\n};\nNameValueEditor.defaultProps = {\n allowSorting: false,\n readOnly: false,\n nameValueId: 0,\n addConfigMapSecret: false,\n};\n\nNameValueEditor.displayName = 'Name Value Editor';\n\nconst EnvFromEditor_ = withDragDropContext(\n class EnvFromEditor extends React.Component {\n constructor(props) {\n super(props);\n this._append = this._append.bind(this);\n this._change = this._change.bind(this);\n this._move = this._move.bind(this);\n this._remove = this._remove.bind(this);\n }\n\n _append() {\n const { updateParentData, nameValuePairs, nameValueId } = this.props;\n const configMapSecretRef = { name: '', key: '' };\n updateParentData(\n {\n nameValuePairs: nameValuePairs.concat([\n ['', { configMapSecretRef }, nameValuePairs.length],\n ]),\n },\n nameValueId,\n EnvType.ENV_FROM,\n );\n }\n\n _remove(i) {\n const { updateParentData, nameValueId } = this.props;\n const nameValuePairs = _.cloneDeep(this.props.nameValuePairs);\n nameValuePairs.splice(i, 1);\n const configMapSecretRef = { name: '', key: '' };\n\n updateParentData(\n { nameValuePairs: nameValuePairs.length ? nameValuePairs : [['', { configMapSecretRef }]] },\n nameValueId,\n EnvType.ENV_FROM,\n );\n }\n\n _change(e, i, type) {\n const { updateParentData, nameValueId } = this.props;\n const nameValuePairs = _.cloneDeep(this.props.nameValuePairs);\n nameValuePairs[i][type === EnvFromPair.Prefix ? EnvFromPair.Prefix : EnvFromPair.Resource] =\n e.target.value;\n updateParentData({ nameValuePairs }, nameValueId, EnvType.ENV_FROM);\n }\n\n _move(dragIndex, hoverIndex) {\n const { updateParentData, nameValueId } = this.props;\n const nameValuePairs = _.cloneDeep(this.props.nameValuePairs);\n const movedPair = nameValuePairs[dragIndex];\n\n nameValuePairs[dragIndex] = nameValuePairs[hoverIndex];\n nameValuePairs[hoverIndex] = movedPair;\n updateParentData({ nameValuePairs }, nameValueId, EnvType.ENV_FROM);\n }\n\n render() {\n const {\n nameValuePairs,\n readOnly,\n nameValueId,\n configMaps,\n secrets,\n serviceAccounts,\n firstTitle,\n secondTitle,\n addButtonDisabled,\n addButtonLabel,\n t,\n } = this.props;\n const pairElems = nameValuePairs.map((pair, i) => {\n const key = _.get(pair, [EnvFromPair.Index], i);\n\n return (\n <EnvFromPairElement\n onChange={this._change}\n index={i}\n nameString={t('public~ConfigMap/Secret')}\n valueString=\"\"\n readOnly={readOnly}\n pair={pair}\n key={key}\n onRemove={this._remove}\n onMove={this._move}\n rowSourceId={nameValueId}\n configMaps={configMaps}\n secrets={secrets}\n serviceAccounts={serviceAccounts}\n />\n );\n });\n\n return (\n <>\n <div className=\"row pairs-list__heading\">\n {!readOnly && <div className=\"col-xs-1 co-empty__header\" />}\n <div className=\"col-xs-5 text-secondary text-uppercase\">\n {firstTitle || t('public~ConfigMap/Secret')}\n </div>\n <div className=\"col-xs-5 text-secondary text-uppercase\">\n {secondTitle || t('public~Prefix (optional)')}\n </div>\n <div className=\"col-xs-1 co-empty__header\" />\n </div>\n {pairElems}\n <div className=\"row\">\n <div className=\"col-xs-12\">\n {!readOnly && (\n <Button\n className=\"pf-m-link--align-left\"\n onClick={this._append}\n type=\"button\"\n variant=\"link\"\n isDisabled={addButtonDisabled}\n >\n <PlusCircleIcon />{' '}\n {addButtonLabel || t('public~Add all from ConfigMap or Secret')}\n </Button>\n )}\n </div>\n </div>\n </>\n );\n }\n },\n);\nexport const EnvFromEditor = withTranslation()(EnvFromEditor_);\nEnvFromEditor.propTypes = {\n readOnly: PropTypes.bool,\n nameValueId: PropTypes.number,\n nameValuePairs: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.string),\n PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.object])),\n PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.number]),\n ),\n ]),\n ).isRequired,\n updateParentData: PropTypes.func.isRequired,\n configMaps: PropTypes.object,\n secrets: PropTypes.object,\n serviceAccounts: PropTypes.object,\n firstTitle: PropTypes.string,\n secondTitle: PropTypes.string,\n addButtonDisabled: PropTypes.bool,\n};\nEnvFromEditor.defaultProps = {\n readOnly: false,\n nameValueId: 0,\n addButtonDisabled: false,\n};\nconst pairSource = {\n beginDrag(props) {\n return {\n index: props.index,\n rowSourceId: props.rowSourceId,\n };\n },\n};\nconst itemTarget = {\n hover(props, monitor, component) {\n const dragIndex = monitor.getItem().index;\n const hoverIndex = props.index;\n // Don't replace items with themselves or with other row groupings on the page\n if (dragIndex === hoverIndex || monitor.getItem().rowSourceId !== props.rowSourceId) {\n return;\n }\n // Determine rectangle on screen\n const hoverBoundingRect = component.node.getBoundingClientRect();\n // Get vertical middle\n const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n\n // Determine mouse position\n const clientOffset = monitor.getClientOffset();\n\n // Get pixels to the top\n const hoverClientY = clientOffset.y - hoverBoundingRect.top;\n\n // Only perform the move when the mouse has crossed half of the items height\n // When dragging downwards, only move when the cursor is below 50%\n // When dragging upwards, only move when the cursor is above 50%\n\n // Dragging downwards\n if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) {\n return;\n }\n\n // Dragging upwards\n if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) {\n return;\n }\n\n // Time to actually perform the action\n props.onMove(dragIndex, hoverIndex);\n\n // Note: we're mutating the monitor item here!\n // Generally it's better to avoid mutations,\n // but it's good here for the sake of performance\n // to avoid expensive index searches.\n monitor.getItem().index = hoverIndex;\n },\n};\n\nconst collectSourcePair = (connect, monitor) => ({\n connectDragSource: connect.dragSource(),\n connectDragPreview: connect.dragPreview(),\n isDragging: monitor.isDragging(),\n});\n\nconst collectTargetPair = (connect) => ({\n connectDropTarget: connect.dropTarget(),\n});\n\nconst PairElement_ = DragSource(\n DRAGGABLE_TYPE.ENV_ROW,\n pairSource,\n collectSourcePair,\n)(\n DropTarget(\n DRAGGABLE_TYPE.ENV_ROW,\n itemTarget,\n collectTargetPair,\n )(\n class PairElement extends React.Component {\n constructor(props) {\n super(props);\n\n this._onRemove = this._onRemove.bind(this);\n this._onChangeName = this._onChangeName.bind(this);\n this._onChangeValue = this._onChangeValue.bind(this);\n }\n\n _onRemove() {\n const { index, onRemove } = this.props;\n onRemove(index);\n }\n\n _onChangeName(e) {\n const { index, onChange } = this.props;\n onChange(e, index, NameValueEditorPair.Name);\n }\n\n _onChangeValue(e) {\n const { index, onChange } = this.props;\n onChange(e, index, NameValueEditorPair.Value);\n }\n\n render() {\n const {\n isDragging,\n connectDragSource,\n connectDragPreview,\n connectDropTarget,\n nameString,\n allowSorting,\n readOnly,\n pair,\n configMaps,\n secrets,\n isEmpty,\n disableReorder,\n toolTip,\n t,\n valueString,\n alwaysAllowRemove,\n } = this.props;\n const deleteIcon = (\n <>\n <MinusCircleIcon className=\"pairs-list__side-btn pairs-list__delete-icon\" />\n <span className=\"pf-v5-u-screen-reader\">{t('public~Delete')}</span>\n </>\n );\n const dragButton = (\n <div>\n <Button\n type=\"button\"\n className=\"pairs-list__action-icon\"\n tabIndex=\"-1\"\n isDisabled={disableReorder}\n variant=\"plain\"\n aria-label={t('public~Drag to reorder')}\n >\n <GripVerticalIcon className=\"pairs-list__action-icon--reorder\" />\n </Button>\n </div>\n );\n return connectDropTarget(\n connectDragPreview(\n <div\n className={classNames(\n 'row',\n isDragging ? 'pairs-list__row-dragging' : 'pairs-list__row',\n )}\n data-test=\"pairs-list-row\"\n ref={(node) => (this.node = node)}\n >\n {allowSorting && !readOnly && (\n <div className=\"col-xs-1 pairs-list__action\">\n {disableReorder ? dragButton : connectDragSource(dragButton)}\n </div>\n )}\n <div className=\"col-xs-5 pairs-list__name-field\">\n <input\n type=\"text\"\n data-test=\"pairs-list-name\"\n className=\"pf-v5-c-form-control\"\n placeholder={nameString}\n value={pair[NameValueEditorPair.Name]}\n onChange={this._onChangeName}\n disabled={readOnly}\n />\n </div>\n {_.isPlainObject(pair[NameValueEditorPair.Value]) ? (\n <div className=\"col-xs-5 pairs-list__value-pair-field\">\n <ValueFromPair\n data-test=\"pairs-list-value\"\n pair={pair[NameValueEditorPair.Value]}\n configMaps={configMaps}\n secrets={secrets}\n onChange={this._onChangeValue}\n disabled={readOnly}\n />\n </div>\n ) : (\n <div className=\"col-xs-5 pairs-list__value-field\">\n <input\n type=\"text\"\n data-test=\"pairs-list-value\"\n className=\"pf-v5-c-form-control\"\n placeholder={valueString}\n value={pair[NameValueEditorPair.Value] || ''}\n onChange={this._onChangeValue}\n disabled={readOnly}\n />\n </div>\n )}\n {!readOnly && (\n <div className=\"col-xs-1 pairs-list__action\">\n <Tooltip content={toolTip || t('public~Remove')}>\n <Button\n type=\"button\"\n data-test=\"delete-button\"\n className={classNames({\n 'pairs-list__span-btns': allowSorting,\n })}\n onClick={this._onRemove}\n isDisabled={isEmpty && !alwaysAllowRemove}\n variant=\"plain\"\n >\n {deleteIcon}\n </Button>\n </Tooltip>\n </div>\n )}\n </div>,\n ),\n );\n }\n },\n ),\n);\nconst PairElement = withTranslation()(PairElement_);\nPairElement.propTypes = {\n nameString: PropTypes.string,\n valueString: PropTypes.string,\n readOnly: PropTypes.bool,\n index: PropTypes.number.isRequired,\n pair: PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.string),\n PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.object])),\n PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.number])),\n ]),\n allowSorting: PropTypes.bool.isRequired,\n onChange: PropTypes.func.isRequired,\n connectDragSource: PropTypes.func,\n connectDropTarget: PropTypes.func,\n isDragging: PropTypes.bool,\n onMove: PropTypes.func.isRequired,\n rowSourceId: PropTypes.number.isRequired,\n configMaps: PropTypes.object,\n secrets: PropTypes.object,\n toolTip: PropTypes.string,\n alwaysAllowRemove: PropTypes.bool,\n};\nconst EnvFromPairElement_ = DragSource(\n DRAGGABLE_TYPE.ENV_FROM_ROW,\n pairSource,\n collectSourcePair,\n)(\n DropTarget(\n DRAGGABLE_TYPE.ENV_FROM_ROW,\n itemTarget,\n collectTargetPair,\n )(\n class EnvFromPairElement extends React.Component {\n constructor(props) {\n super(props);\n this._onRemove = this._onRemove.bind(this);\n this._onChangePrefix = this._onChangePrefix.bind(this);\n this._onChangeResource = this._onChangeResource.bind(this);\n }\n _onRemove() {\n const { index, onRemove } = this.props;\n onRemove(index);\n }\n _onChangePrefix(e) {\n const { index, onChange } = this.props;\n onChange(e, index, EnvFromPair.Prefix);\n }\n _onChangeResource(e) {\n const { index, onChange } = this.props;\n onChange(e, index, EnvFromPair.Resource);\n }\n render() {\n const {\n isDragging,\n connectDragSource,\n connectDragPreview,\n connectDropTarget,\n valueString,\n readOnly,\n pair,\n configMaps,\n secrets,\n serviceAccounts,\n t,\n } = this.props;\n const deleteButton = (\n <>\n <MinusCircleIcon className=\"pairs-list__side-btn pairs-list__delete-icon\" />\n <span className=\"pf-v5-u-screen-reader\">{t('public~Delete')}</span>\n </>\n );\n return connectDropTarget(\n connectDragPreview(\n <div\n className={classNames(\n 'row',\n isDragging ? 'pairs-list__row-dragging' : 'pairs-list__row',\n )}\n ref={(node) => (this.node = node)}\n >\n {!readOnly &&\n connectDragSource(\n <div className=\"col-xs-1 pairs-list__action\">\n <Button\n type=\"button\"\n className=\"pairs-list__action-icon\"\n tabIndex=\"-1\"\n variant=\"plain\"\n aria-label={t('public~Drag to reorder')}\n >\n <GripVerticalIcon className=\"pairs-list__action-icon--reorder\" />\n </Button>\n </div>,\n )}\n <div className=\"col-xs-5 pairs-list__value-pair-field\">\n <ValueFromPair\n pair={pair[EnvFromPair.Resource]}\n configMaps={configMaps}\n secrets={secrets}\n serviceAccounts={serviceAccounts}\n onChange={this._onChangeResource}\n disabled={readOnly}\n />\n </div>\n <div className=\"col-xs-5 pairs-list__name-field\">\n <input\n data-test-id=\"env-prefix\"\n type=\"text\"\n className=\"pf-v5-c-form-control\"\n placeholder={valueString}\n value={pair[EnvFromPair.Prefix]}\n onChange={this._onChangePrefix}\n disabled={readOnly}\n />\n </div>\n {readOnly ? null : (\n <div className=\"col-xs-1 pairs-list__action\">\n <Tooltip content={t('public~Remove')}>\n <Button\n type=\"button\"\n data-test-id=\"pairs-list__delete-from-btn\"\n className=\"pairs-list__span-btns\"\n onClick={this._onRemove}\n variant=\"plain\"\n >\n {deleteButton}\n </Button>\n </Tooltip>\n </div>\n )}\n </div>,\n ),\n );\n }\n },\n ),\n);\nconst EnvFromPairElement = withTranslation()(EnvFromPairElement_);\nEnvFromPairElement.propTypes = {\n valueString: PropTypes.string,\n readOnly: PropTypes.bool,\n index: PropTypes.number.isRequired,\n pair: PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.string),\n PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.object])),\n PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.number])),\n ]),\n onChange: PropTypes.func.isRequired,\n connectDragSource: PropTypes.func,\n connectDropTarget: PropTypes.func,\n isDragging: PropTypes.bool,\n onMove: PropTypes.func.isRequired,\n rowSourceId: PropTypes.number.isRequired,\n configMaps: PropTypes.object,\n secrets: PropTypes.object,\n};\n","import * as React from 'react';\nimport {\n ALL_NAMESPACES_KEY,\n COLUMN_MANAGEMENT_CONFIGMAP_KEY,\n COLUMN_MANAGEMENT_LOCAL_STORAGE_KEY,\n useActiveNamespace,\n useUserSettingsCompatibility,\n} from '@console/shared';\nimport { TableColumn } from '@console/dynamic-plugin-sdk';\n\nexport const useActiveColumns = <D = any>({\n columns,\n showNamespaceOverride,\n columnManagementID,\n}: {\n columns: TableColumn<D>[];\n showNamespaceOverride?: boolean;\n columnManagementID?: string;\n}): [TableColumn<D>[], boolean] => {\n const [tableColumns, , userSettingsLoaded] = useUserSettingsCompatibility(\n COLUMN_MANAGEMENT_CONFIGMAP_KEY,\n COLUMN_MANAGEMENT_LOCAL_STORAGE_KEY,\n undefined,\n true,\n );\n const [namespace] = useActiveNamespace();\n\n return React.useMemo(() => {\n const activeColumnIDs: Set<string> =\n tableColumns?.[columnManagementID]?.length > 0\n ? new Set(tableColumns[columnManagementID])\n : new Set(\n columns.map((col) => {\n if (col.id && !col.additional) {\n return col.id;\n }\n }),\n );\n\n if (showNamespaceOverride && !activeColumnIDs.has('namespace')) {\n activeColumnIDs.add('namespace');\n }\n\n let activeColumns = columns.filter((c) => activeColumnIDs.has(c.id) || c.title === '');\n if (namespace && namespace !== ALL_NAMESPACES_KEY && !showNamespaceOverride) {\n activeColumns = activeColumns.filter((column) => column.id !== 'namespace');\n }\n return [activeColumns, userSettingsLoaded];\n }, [\n tableColumns,\n columnManagementID,\n columns,\n namespace,\n showNamespaceOverride,\n userSettingsLoaded,\n ]);\n};\n","import { K8sResourceCommon, K8sResourceCondition } from '@console/internal/module/k8s';\n\nexport type ServiceBinding = K8sResourceCommon & {\n spec: {\n application: {\n group: string;\n version: string;\n resource: string;\n name?: string;\n labelSelector?: {\n matchLabels: {\n [key: string]: string;\n };\n };\n };\n services: {\n group: string;\n version: string;\n kind: string;\n name: string;\n }[];\n bindAsFiles?: boolean;\n detectBindingResources?: boolean;\n };\n status?: {\n conditions?: K8sResourceCondition[];\n };\n};\n\n// The enum values need to match the dynamic-plugin `Status` `status` prop.\n// A translation (title) is added in the ServiceBindingStatus component.\nexport enum ComputedServiceBindingStatus {\n CONNECTED = 'Connected',\n ERROR = 'Error',\n}\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Tooltip } from '@patternfly/react-core';\nimport { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';\nimport { EndpointSliceKind } from '../module/k8s';\nimport { ConnectedIcon } from '@patternfly/react-icons/dist/esm/icons/connected-icon';\nimport { DisconnectedIcon } from '@patternfly/react-icons/dist/esm/icons/disconnected-icon';\nimport { EndPointSliceModel } from '@console/app/src/models';\nimport { LoadingInline } from '@console/internal/components/utils';\nimport Status from '@console/dynamic-plugin-sdk/src/app/components/status/Status';\n\nexport type PodTrafficProp = {\n podName: string;\n namespace: string;\n tooltipFlag?: boolean;\n};\n\nexport const PodTraffic: React.FC<PodTrafficProp> = ({ podName, namespace, tooltipFlag }) => {\n const { t } = useTranslation();\n const [data, loaded, loadError] = useK8sWatchResource<EndpointSliceKind[]>({\n groupVersionKind: {\n kind: EndPointSliceModel.kind,\n version: EndPointSliceModel.apiVersion,\n },\n isList: true,\n namespaced: true,\n namespace,\n });\n\n if (!loaded) {\n return <LoadingInline />;\n } else if (loaded && loadError) {\n return <Status status=\"Error\" title={t('public~Error')} />;\n }\n const allEndpoints = data?.reduce((prev, next) => prev.concat(next?.endpoints), []);\n const receivingTraffic = allEndpoints?.some((endPoint) => endPoint?.targetRef?.name === podName);\n if (tooltipFlag) {\n return (\n loaded &&\n !loadError && (\n <div data-test=\"pod-traffic-status\">\n <Tooltip\n position=\"top\"\n content={\n receivingTraffic ? t('public~Receiving Traffic') : t('public~Not Receiving Traffic')\n }\n >\n {receivingTraffic ? <ConnectedIcon /> : <DisconnectedIcon />}\n </Tooltip>\n </div>\n )\n );\n }\n return loaded && !loadError && (receivingTraffic ? <ConnectedIcon /> : <DisconnectedIcon />);\n};\n","import * as React from 'react';\nimport { QuickStart } from '@patternfly/quickstarts';\nimport { QuickStartsLoaderProps } from '@console/dynamic-plugin-sdk/src/api/internal-types';\nimport { useQuickStarts } from '../utils/useQuickStarts';\nimport QuickStartPermissionChecker from './QuickStartPermissionChecker';\n\nconst QuickStartsLoader: React.FC<QuickStartsLoaderProps> = ({ children }) => {\n const [quickStarts, quickStartsLoaded] = useQuickStarts();\n\n const [allowedQuickStarts, setAllowedQuickStarts] = React.useState<QuickStart[]>([]);\n const [permissionsLoaded, setPermissionsLoaded] = React.useState<boolean>(false);\n const permissionChecks = React.useRef<{ [name: string]: boolean }>({});\n\n const handlePermissionCheck = React.useCallback(\n (quickStart, hasPermission) => {\n permissionChecks.current[quickStart.metadata.name] = hasPermission;\n if (Object.keys(permissionChecks.current).length === quickStarts.length) {\n const filteredQuickStarts = quickStarts.filter(\n (quickstart) => permissionChecks.current[quickstart.metadata.name],\n );\n setAllowedQuickStarts(filteredQuickStarts);\n setPermissionsLoaded(true);\n }\n },\n [quickStarts],\n );\n\n return (\n <>\n {quickStarts.map((quickstart) => {\n return (\n <QuickStartPermissionChecker\n key={quickstart.metadata.name}\n quickStart={quickstart}\n onPermissionCheck={handlePermissionCheck}\n />\n );\n })}\n {children(\n allowedQuickStarts,\n quickStartsLoaded && (quickStarts.length === 0 || permissionsLoaded),\n )}\n </>\n );\n};\n\nexport default QuickStartsLoader;\n","export * from './node';\nexport * from './snapshot';\n","import * as React from 'react';\nimport { Menu, Popper, MenuContent, MenuList } from '@patternfly/react-core';\nimport * as _ from 'lodash';\nimport { Action } from '@console/dynamic-plugin-sdk';\nimport { LazyActionMenuProps } from '@console/dynamic-plugin-sdk/src/api/internal-types';\nimport { checkAccess } from '@console/internal/components/utils';\nimport ActionServiceProvider from './ActionServiceProvider';\nimport ActionMenuContent from './menu/ActionMenuContent';\nimport ActionMenuToggle from './menu/ActionMenuToggle';\nimport { ActionMenuVariant } from './types';\n\ntype LazyMenuRendererProps = {\n isOpen: boolean;\n actions: Action[];\n menuRef: React.RefObject<HTMLDivElement>;\n toggleRef: React.RefObject<HTMLButtonElement>;\n} & React.ComponentProps<typeof ActionMenuContent>;\n\nconst LazyMenuRenderer: React.FC<LazyMenuRendererProps> = ({\n isOpen,\n actions,\n menuRef,\n toggleRef,\n ...restProps\n}) => {\n React.useEffect(() => {\n // Check access after loading actions from service over a kebab to minimize flicker when opened.\n // This depends on `checkAccess` being memoized.\n _.each(actions, (action: Action) => {\n if (action.accessReview) {\n checkAccess(action.accessReview).catch((e) =>\n // eslint-disable-next-line no-console\n console.warn('Could not check access for action menu', e),\n );\n }\n });\n }, [actions]);\n\n const menu = (\n <Menu ref={menuRef} containsFlyout onSelect={restProps.onClick}>\n <MenuContent data-test-id=\"action-items\">\n <MenuList>\n <ActionMenuContent {...restProps} />\n </MenuList>\n </MenuContent>\n </Menu>\n );\n\n return <Popper triggerRef={toggleRef} popper={menu} placement=\"bottom-end\" isVisible={isOpen} />;\n};\n\nconst LazyActionMenu: React.FC<LazyActionMenuProps> = ({\n context,\n variant = ActionMenuVariant.KEBAB,\n label,\n isDisabled,\n}) => {\n const [isOpen, setIsOpen] = React.useState<boolean>(false);\n const [initActionLoader, setInitActionLoader] = React.useState<boolean>(false);\n const menuRef = React.useRef<HTMLDivElement>(null);\n const toggleRef = React.useRef<HTMLButtonElement>(null);\n\n const hideMenu = () => {\n setIsOpen(false);\n };\n\n const handleHover = React.useCallback(() => {\n setInitActionLoader(true);\n }, []);\n\n return (\n <>\n <ActionMenuToggle\n isOpen={isOpen}\n isDisabled={isDisabled}\n toggleRef={toggleRef}\n toggleVariant={variant}\n toggleTitle={label}\n menuRef={menuRef}\n onToggleClick={setIsOpen}\n onToggleHover={handleHover}\n />\n {initActionLoader && (\n <ActionServiceProvider context={context}>\n {({ actions, options, loaded }) =>\n loaded && (\n <LazyMenuRenderer\n isOpen={isOpen}\n actions={actions}\n options={options}\n menuRef={menuRef}\n toggleRef={toggleRef}\n onClick={hideMenu}\n focusItem={options[0]}\n />\n )\n }\n </ActionServiceProvider>\n )}\n </>\n );\n};\n\nexport default LazyActionMenu;\n","/* eslint-disable tsdoc/syntax */\nimport * as _ from 'lodash-es';\nimport * as React from 'react';\nimport * as fuzzy from 'fuzzysearch';\nimport * as PropTypes from 'prop-types';\nimport { Alert } from '@patternfly/react-core';\nimport { useFlag } from '@console/shared/src/hooks/flag';\nimport { FLAGS } from '@console/shared/src/constants';\nimport { Dropdown } from './dropdown';\nimport { Firehose } from './firehose';\nimport { LoadingInline } from './status-box';\nimport { ResourceName } from './resource-icon';\nimport { flagPending } from '../../reducers/features';\nimport { NamespaceModel, ProjectModel } from '@console/internal/models';\nimport { useTranslation, withTranslation } from 'react-i18next';\nimport { useCreateNamespaceModal } from '@console/shared/src/hooks/useCreateNamespaceModal';\nimport { useCreateProjectModal } from '@console/shared/src/hooks/useCreateProjectModal';\n\nconst getKey = (key, keyKind) => {\n return keyKind ? `${key}-${keyKind}` : key;\n};\n\nclass ListDropdownWithTranslation extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n items: {},\n };\n\n if (props.selectedKey) {\n this.state.selectedKey = getKey(props.selectedKey, props.selectedKeyKind);\n }\n\n this.state.title = props.loaded ? props.placeholder : <LoadingInline />;\n\n this.autocompleteFilter = (text, item) => fuzzy(text, item.props.name);\n // Pass both the resource name and the resource kind to onChange()\n this.onChange = (key) => {\n if (_.find(this.props.actionItems, { actionKey: key })) {\n this.props.onChange(key);\n }\n const { name, kindLabel, resource } = _.get(this.state, ['items', key], {});\n this.setState({ selectedKey: key, title: <ResourceName kind={kindLabel} name={name} /> });\n this.props.onChange?.(name, kindLabel, resource);\n };\n }\n\n UNSAFE_componentWillMount() {\n // we need to trigger state changes to get past shouldComponentUpdate...\n // but the entire working set of data can be loaded in memory at this point in time\n // in which case componentWillReceiveProps would not be called for a while...\n this.UNSAFE_componentWillReceiveProps(this.props);\n }\n\n UNSAFE_componentWillReceiveProps({\n desc,\n placeholder,\n loaded,\n loadError,\n resources,\n dataFilter,\n ...nextProps\n }) {\n if (!loaded) {\n return;\n }\n\n this.setState((currentState) => {\n if (loadError) {\n return {\n title: (\n <div className=\"cos-error-title\">\n {this.props.t('public~Error loading {{desc}}', desc)}\n </div>\n ),\n };\n }\n\n const unsortedList = {};\n _.each(resources, ({ data }, kindLabel) => {\n _.reduce(\n data,\n (acc, resource) => {\n if (!dataFilter || dataFilter(resource)) {\n acc[`${resource.metadata.name}-${kindLabel}`] = {\n kindLabel,\n name: resource.metadata.name,\n resource,\n };\n }\n return acc;\n },\n unsortedList,\n );\n });\n\n const sortedList = {};\n _.keys(unsortedList)\n .sort()\n .forEach((key) => {\n sortedList[key] = unsortedList[key];\n });\n\n const keyChanged = currentState.selectedKey !== nextProps.selectedKey;\n const keyKindChanged = currentState.selectedKeyKind !== nextProps.selectedKeyKind;\n const selectedKey =\n keyChanged || keyKindChanged\n ? getKey(nextProps.selectedKey, nextProps.selectedKeyKind)\n : currentState.selectedKey;\n\n const selectedItem = sortedList[selectedKey];\n return {\n selectedKey,\n items: sortedList,\n title: selectedItem ? (\n <ResourceName kind={selectedItem.kindLabel} name={selectedItem.name} />\n ) : (\n placeholder\n ),\n };\n });\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n return !_.isEqual(this.state, nextState);\n }\n\n render() {\n const { desc, fixed, placeholder, id, loaded, disabled, t } = this.props;\n const items = {};\n\n _.keys(this.state.items).forEach((key) => {\n const item = this.state.items[key];\n items[key] = <ResourceName kind={item.kindLabel} name={item.name} />;\n });\n\n const { selectedKey } = this.state;\n\n const Component = fixed ? (\n items[selectedKey]\n ) : (\n <Dropdown\n actionItems={this.props.actionItems}\n autocompleteFilter={this.autocompleteFilter}\n autocompletePlaceholder={placeholder}\n items={items}\n selectedKey={selectedKey}\n title={this.state.title}\n onChange={this.onChange}\n id={id}\n dropDownClassName=\"dropdown--full-width\"\n menuClassName=\"dropdown-menu--text-wrap\"\n disabled={disabled}\n dataTest={this.props.dataTest}\n />\n );\n\n return (\n <div>\n {Component}\n {loaded && _.isEmpty(items) && (desc || this.props.selectedKeyKind) && (\n <Alert\n isInline\n className=\"co-alert pf-v5-c-alert--top-margin\"\n variant=\"info\"\n title={t('public~No {{selection}} found', {\n selection: desc || this.props.selectedKeyKind,\n })}\n />\n )}\n </div>\n );\n }\n}\n\nconst ListDropdown_ = withTranslation()(ListDropdownWithTranslation);\n\nexport const ListDropdown = (props) => {\n const resources = _.map(props.resources, (resource) =>\n _.assign({ isList: true, prop: resource.kind }, resource),\n );\n return (\n <Firehose resources={resources}>\n <ListDropdown_ {...props} />\n </Firehose>\n );\n};\n\nListDropdown.propTypes = {\n dataFilter: PropTypes.func,\n desc: PropTypes.string,\n // specify both key/kind\n selectedKey: PropTypes.string,\n selectedKeyKind: PropTypes.string,\n fixed: PropTypes.bool,\n resources: PropTypes.arrayOf(\n PropTypes.shape({\n kind: PropTypes.string.isRequired,\n namespace: PropTypes.string,\n selector: PropTypes.object,\n }),\n ).isRequired,\n placeholder: PropTypes.string,\n onChange: PropTypes.func,\n id: PropTypes.string,\n disabled: PropTypes.bool,\n};\n\n/** @type {() => [K8sModel?, boolean?]} */\nexport const useProjectOrNamespaceModel = () => {\n const openshiftFlag = useFlag(FLAGS.OPENSHIFT);\n const canCreateNs = useFlag(FLAGS.CAN_CREATE_NS);\n const canCreateProject = useFlag(FLAGS.CAN_CREATE_PROJECT);\n\n if (flagPending(openshiftFlag) || flagPending(canCreateNs) || flagPending(canCreateProject)) {\n return [];\n }\n\n // NamespaceModal is used when not on an openshift cluster\n const model = openshiftFlag ? ProjectModel : NamespaceModel;\n const canCreate = openshiftFlag ? canCreateProject : canCreateNs;\n return [model, canCreate];\n};\n\n/** @type {React.FC<{dataFilter?: (ns: any) => boolean, desc?: string, selectedKey?: string, fixed?: boolean, placeholder?: string, onChange?: (selectedKey: string, selectedKeyKind: string, selectedResource?: K8sResourceKind) => void, id?: string, dataTest?: string}}>} */\nexport const NsDropdown = (props) => {\n const { t } = useTranslation();\n const createNamespaceModal = useCreateNamespaceModal();\n const createProjectModal = useCreateProjectModal();\n const [selectedKey, setSelectedKey] = React.useState(props.selectedKey);\n const [model, canCreate] = useProjectOrNamespaceModel();\n\n const actionItems =\n model && canCreate\n ? [\n {\n actionTitle: t('public~Create {{resourceKindLabel}}', {\n resourceKindLabel: model.labelKey ? t(model.labelKey) : model.label,\n }),\n actionKey: `Create_${model.label}`,\n },\n ]\n : [];\n\n const onChange = (actionKey, kindLabel, resource) => {\n switch (actionKey) {\n case 'Create_Namespace':\n createNamespaceModal({\n onSubmit: (newNamespace) => {\n setSelectedKey(newNamespace.metadata.name);\n props.onChange?.(newNamespace.metadata.name, newNamespace.kind, newNamespace);\n },\n });\n break;\n case 'Create_Project':\n createProjectModal({\n onSubmit: (newProject) => {\n setSelectedKey(newProject.metadata.name);\n props.onChange?.(newProject.metadata.name, newProject.kind, newProject);\n },\n });\n break;\n default:\n props.onChange?.(actionKey, kindLabel, resource);\n break;\n }\n };\n\n const getPlaceholder = (placeholderModel) => {\n if (!placeholderModel.kind) {\n return t('public~Select item');\n }\n\n return t('public~Select {{kindLabel}}', {\n kindLabel: placeholderModel.labelKey ? t(placeholderModel.labelKey) : placeholderModel.label,\n });\n };\n\n return model ? (\n <ListDropdown\n {...props}\n actionItems={actionItems}\n desc={model.plural}\n onChange={onChange}\n placeholder={props.placeholder || getPlaceholder(model)}\n resources={[{ kind: `${model.kind}` }]}\n selectedKeyKind={model.kind}\n selectedKey={selectedKey}\n />\n ) : null;\n};\n","import { useContext } from 'react';\nimport { UseActivePerspective } from '../extensions';\nimport { PerspectiveContext, PerspectiveContextType } from './perspective-context';\n\nconst useActivePerspective: UseActivePerspective = () => {\n const { activePerspective, setActivePerspective } = useContext<PerspectiveContextType>(\n PerspectiveContext,\n );\n return [activePerspective, setActivePerspective];\n};\n\nexport default useActivePerspective;\n","import * as React from 'react';\nimport { ModalComponent } from '@console/dynamic-plugin-sdk/src/app/modal-support/ModalProvider';\nimport { useModal } from '@console/dynamic-plugin-sdk/src/app/modal-support/useModal';\nimport { UseLabelsModal } from '@console/dynamic-plugin-sdk/src/extensions/console-types';\nimport { useK8sModel } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sModel';\nimport { getGroupVersionKindForResource } from '@console/dynamic-plugin-sdk/src/utils/k8s/k8s-ref';\nimport { ModalWrapper } from '@console/internal/components/factory/modal';\nimport { LabelsModal, LabelsModalProps } from '@console/internal/components/modals/labels-modal';\n\nconst LabelsModalComponent: ModalComponent<LabelsModalProps> = ({ closeModal, kind, resource }) => {\n return (\n <ModalWrapper blocking onClose={closeModal}>\n <LabelsModal cancel={closeModal} close={closeModal} kind={kind} resource={resource} />\n </ModalWrapper>\n );\n};\n\nexport const useLabelsModal: UseLabelsModal = (resource) => {\n const launcher = useModal();\n const groupVersionKind = getGroupVersionKindForResource(resource);\n const [kind] = useK8sModel(groupVersionKind);\n return React.useCallback(\n () => resource && kind && launcher<LabelsModalProps>(LabelsModalComponent, { kind, resource }),\n [launcher, kind, resource],\n );\n};\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport {\n Action,\n Alert,\n AlertSeverity,\n AlertStates,\n BlueInfoCircleIcon,\n FormatSeriesTitle,\n GreenCheckCircleIcon,\n PrometheusAlert,\n PrometheusEndpoint,\n PrometheusLabels,\n RedExclamationCircleIcon,\n ResourceStatus,\n RowFilter,\n RowProps,\n Rule,\n Silence,\n SilenceStates,\n TableColumn,\n useResolvedExtensions,\n YellowExclamationTriangleIcon,\n} from '@console/dynamic-plugin-sdk';\nimport {\n AlertingRuleChartExtension,\n AlertingRulesSourceExtension,\n isAlertingRuleChart,\n isAlertingRulesSource,\n} from '@console/dynamic-plugin-sdk/src/extensions/alerts';\nimport {\n ActionServiceProvider,\n ListPageFilter,\n ResourceLink,\n Timestamp,\n useListPageFilter,\n VirtualizedTable,\n} from '@console/dynamic-plugin-sdk/src/lib-core';\nimport { consoleFetchJSON } from '@console/dynamic-plugin-sdk/src/utils/fetch';\nimport { withFallback } from '@console/shared/src/components/error';\nimport { QueryBrowser } from '@console/shared/src/components/query-browser';\nimport { formatPrometheusDuration } from '@openshift-console/plugin-shared/src/datetime/prometheus';\nimport { useExactSearch } from '@console/app/src/components/user-preferences/search';\nimport {\n Alert as PFAlert,\n Breadcrumb,\n BreadcrumbItem,\n Button,\n Checkbox,\n CodeBlock,\n CodeBlockCode,\n Flex,\n FlexItem,\n Label,\n Modal,\n ModalVariant,\n Popover,\n Toolbar,\n ToolbarContent,\n ToolbarGroup,\n ToolbarItem,\n} from '@patternfly/react-core';\nimport {\n Dropdown as DropdownDeprecated,\n DropdownItem as DropdownItemDeprecated,\n DropdownPosition as DropdownPositionDeprecated,\n DropdownToggle as DropdownToggleDeprecated,\n KebabToggle as KebabToggleDeprecated,\n KebabToggleProps as KebabTogglePropsDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { BanIcon } from '@patternfly/react-icons/dist/esm/icons/ban-icon';\nimport { BellIcon } from '@patternfly/react-icons/dist/esm/icons/bell-icon';\nimport { BellSlashIcon } from '@patternfly/react-icons/dist/esm/icons/bell-slash-icon';\nimport { HourglassHalfIcon } from '@patternfly/react-icons/dist/esm/icons/hourglass-half-icon';\nimport { OutlinedBellIcon } from '@patternfly/react-icons/dist/esm/icons/outlined-bell-icon';\nimport { sortable } from '@patternfly/react-table';\nimport classNames from 'classnames';\nimport i18next, { TFunction } from 'i18next';\nimport * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { Helmet } from 'react-helmet';\nimport { useTranslation } from 'react-i18next';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n Routes,\n Route,\n Navigate,\n useLocation,\n useParams,\n Link,\n useNavigate,\n} from 'react-router-dom-v5-compat';\nimport {\n alertingErrored,\n alertingLoaded,\n alertingLoading,\n alertingSetRules,\n} from '../../actions/observe';\nimport {\n ContainerModel,\n DaemonSetModel,\n DeploymentModel,\n JobModel,\n NamespaceModel,\n NodeModel,\n PodModel,\n StatefulSetModel,\n} from '../../models';\nimport { RootState } from '../../redux';\nimport { getPrometheusURL } from '../graphs/helpers';\nimport { refreshNotificationPollers } from '../notification-drawer';\nimport { SectionHeading } from '../utils/headings';\nimport { ExternalLink, getURLSearchParams, LinkifyExternal } from '../utils/link';\nimport { LoadingInline, StatusBox } from '../utils/status-box';\nimport MonitoringDashboardsPage from './dashboards';\nimport { fetchAlerts } from './fetch-alerts';\nimport { useBoolean } from './hooks/useBoolean';\nimport KebabDropdown from './kebab-dropdown';\nimport { Labels } from './labels';\nimport { ToggleGraph } from './metrics';\nimport { CreateSilence, EditSilence } from './silence-form';\nimport { TargetsUI } from './targets';\nimport { Alerts, AlertSource, MonitoringResource, Silences } from './types';\nimport {\n alertDescription,\n alertingRuleStateOrder,\n AlertResource,\n alertSeverityOrder,\n alertState,\n alertURL,\n getAlertsAndRules,\n labelsToParams,\n RuleResource,\n silenceMatcherEqualitySymbol,\n SilenceResource,\n silenceState,\n} from './utils';\nimport { exactMatch, fuzzyCaseInsensitive } from '../factory/table-filters';\nimport { AlertmanagerConfig } from './alertmanager/alertmanager-config';\nimport AlertmanagerYAML from './alertmanager/alertmanager-yaml-editor';\n\nconst SelectedSilencesContext = React.createContext({\n selectedSilences: new Set(),\n setSelectedSilences: undefined,\n});\n\nconst ruleURL = (rule: Rule, namespace: string) =>\n namespace\n ? `/dev-monitoring/ns/${namespace}/alertrules/${rule?.id}`\n : `/monitoring/alertrules/${rule?.id}`;\n\nconst alertingRuleSource = (rule: Rule): AlertSource | string => {\n if (rule.sourceId === undefined || rule.sourceId === 'prometheus') {\n return rule.labels?.prometheus === 'openshift-monitoring/k8s'\n ? AlertSource.Platform\n : AlertSource.User;\n }\n\n return rule.sourceId;\n};\n\nconst alertSource = (alert: Alert): AlertSource | string => alertingRuleSource(alert.rule);\n\nconst pollers = {};\nconst pollerTimeouts = {};\n\nconst silenceAlert = (alert: Alert, navigate: any, namespace?: string) =>\n navigate(\n namespace\n ? `/dev-monitoring/ns/${namespace}/silences/~new/?${labelsToParams(alert.labels)}`\n : `/monitoring/silences/~new/?${labelsToParams(alert.labels)}`,\n );\n\nconst MonitoringResourceIcon: React.FC<MonitoringResourceIconProps> = ({ className, resource }) => (\n <span\n className={classNames(\n `co-m-resource-icon co-m-resource-${resource.kind.toLowerCase()}`,\n className,\n )}\n title={resource.label}\n >\n {resource.abbr}\n </span>\n);\n\nconst AlertStateIcon: React.FC<{ state: string }> = React.memo(({ state }) => {\n switch (state) {\n case AlertStates.Firing:\n return <BellIcon />;\n case AlertStates.Pending:\n return <OutlinedBellIcon />;\n case AlertStates.Silenced:\n return <BellSlashIcon className=\"text-muted\" />;\n default:\n return null;\n }\n});\n\nconst getAlertStateKey = (state) => {\n switch (state) {\n case AlertStates.Firing:\n return i18next.t('public~Firing');\n case AlertStates.Pending:\n return i18next.t('public~Pending');\n case AlertStates.Silenced:\n return i18next.t('public~Silenced');\n default:\n return i18next.t('public~Not Firing');\n }\n};\n\nexport const AlertState: React.FC<AlertStateProps> = React.memo(({ state }) => {\n const icon = <AlertStateIcon state={state} />;\n\n return icon ? (\n <>\n {icon} {getAlertStateKey(state)}\n </>\n ) : null;\n});\n\nconst SilenceState = ({ silence }) => {\n const { t } = useTranslation();\n\n const state = silenceState(silence);\n const icon = {\n [SilenceStates.Active]: <GreenCheckCircleIcon />,\n [SilenceStates.Pending]: <HourglassHalfIcon className=\"monitoring-state-icon--pending\" />,\n [SilenceStates.Expired]: <BanIcon className=\"text-muted\" data-test-id=\"ban-icon\" />,\n }[state];\n\n const getStateKey = (stateData) => {\n switch (stateData) {\n case SilenceStates.Active:\n return t('public~Active');\n case SilenceStates.Pending:\n return t('public~Pending');\n default:\n return t('public~Expired');\n }\n };\n\n return icon ? (\n <>\n {icon} {getStateKey(state)}\n </>\n ) : null;\n};\n\nexport const StateTimestamp = ({ text, timestamp }) => (\n <div className=\"text-muted monitoring-timestamp\">\n {text} \n <Timestamp timestamp={timestamp} />\n </div>\n);\n\nconst AlertStateDescription: React.FC<{ alert }> = ({ alert }) => {\n const { t } = useTranslation();\n\n if (alert && !_.isEmpty(alert.silencedBy)) {\n return (\n <StateTimestamp\n text={t('public~Ends')}\n timestamp={_.max(_.map(alert.silencedBy, 'endsAt'))}\n />\n );\n }\n if (alert && alert.activeAt) {\n return <StateTimestamp text={t('public~Since')} timestamp={alert.activeAt} />;\n }\n return null;\n};\n\nconst SeverityIcon: React.FC<{ severity: string }> = React.memo(({ severity }) => {\n const Icon =\n {\n [AlertSeverity.Critical]: RedExclamationCircleIcon,\n [AlertSeverity.Info]: BlueInfoCircleIcon,\n [AlertSeverity.None]: BlueInfoCircleIcon,\n [AlertSeverity.Warning]: YellowExclamationTriangleIcon,\n }[severity] || YellowExclamationTriangleIcon;\n return <Icon />;\n});\n\nexport const Severity: React.FC<{ severity: string }> = React.memo(({ severity }) => {\n const { t } = useTranslation();\n\n const getSeverityKey = (severityData: string) => {\n switch (severityData) {\n case AlertSeverity.Critical:\n return t('public~Critical');\n case AlertSeverity.Info:\n return t('public~Info');\n case AlertSeverity.Warning:\n return t('public~Warning');\n case AlertSeverity.None:\n return t('public~None');\n default:\n return severityData;\n }\n };\n\n return _.isNil(severity) ? (\n <>-</>\n ) : (\n <>\n <SeverityIcon severity={severity} /> {getSeverityKey(severity)}\n </>\n );\n});\n\nconst SeverityBadge: React.FC<{ severity: string }> = React.memo(({ severity }) =>\n _.isNil(severity) || severity === 'none' ? null : (\n <ResourceStatus>\n <Severity severity={severity} />\n </ResourceStatus>\n ),\n);\n\nconst SeverityCounts: React.FC<{ alerts: Alert[] }> = ({ alerts }) => {\n if (_.isEmpty(alerts)) {\n return <>-</>;\n }\n\n const counts = _.countBy(alerts, (a) => {\n const { severity } = a.labels;\n return severity === AlertSeverity.Critical || severity === AlertSeverity.Warning\n ? severity\n : AlertSeverity.Info;\n });\n\n const severities = [AlertSeverity.Critical, AlertSeverity.Warning, AlertSeverity.Info].filter(\n (s) => counts[s] > 0,\n );\n\n return (\n <>\n {severities.map((s) => (\n <span className=\"monitoring-icon-wrap\" key={s}>\n <SeverityIcon severity={s} /> {counts[s]}\n </span>\n ))}\n </>\n );\n};\n\nexport const StateCounts: React.FC<{ alerts: PrometheusAlert[] }> = ({ alerts }) => {\n const counts = _.countBy(alerts, 'state');\n const states = [AlertStates.Firing, AlertStates.Pending, AlertStates.Silenced].filter(\n (s) => counts[s] > 0,\n );\n\n return (\n <>\n {states.map((s) => (\n <div className=\"monitoring-icon-wrap\" key={s}>\n <AlertStateIcon state={s} /> {counts[s]} {getAlertStateKey(s)}\n </div>\n ))}\n </>\n );\n};\n\nconst PopoverField: React.FC<{ bodyContent: React.ReactNode; label: string }> = ({\n bodyContent,\n label,\n}) => (\n <Popover headerContent={label} bodyContent={bodyContent}>\n <Button variant=\"plain\" className=\"details-item__popover-button\">\n {label}\n </Button>\n </Popover>\n);\n\nconst AlertStateHelp: React.FC<{}> = () => {\n const { t } = useTranslation();\n\n return (\n <dl className=\"co-inline\">\n <dt>\n <AlertStateIcon state={AlertStates.Pending} /> <strong>{t('public~Pending: ')}</strong>\n </dt>\n <dd>\n {t(\n 'public~The alert is active but is waiting for the duration that is specified in the alerting rule before it fires.',\n )}\n </dd>\n <dt>\n <AlertStateIcon state={AlertStates.Firing} /> <strong>{t('public~Firing: ')}</strong>\n </dt>\n <dd>\n {t(\n 'public~The alert is firing because the alert condition is true and the optional `for` duration has passed. The alert will continue to fire as long as the condition remains true.',\n )}\n </dd>\n <dt>\n <AlertStateIcon state={AlertStates.Silenced} /> <strong>{t('public~Silenced: ')}</strong>\n </dt>\n <dt></dt>\n <dd>\n {t(\n 'public~The alert is now silenced for a defined time period. Silences temporarily mute alerts based on a set of label selectors that you define. Notifications will not be sent for alerts that match all the listed values or regular expressions.',\n )}\n </dd>\n </dl>\n );\n};\n\nconst SeverityHelp: React.FC<{}> = () => {\n const { t } = useTranslation();\n\n return (\n <dl className=\"co-inline\">\n <dt>\n <SeverityIcon severity={AlertSeverity.Critical} /> <strong>{t('public~Critical: ')}</strong>\n </dt>\n <dd>\n {t(\n 'public~The condition that triggered the alert could have a critical impact. The alert requires immediate attention when fired and is typically paged to an individual or to a critical response team.',\n )}\n </dd>\n <dt>\n <SeverityIcon severity={AlertSeverity.Warning} /> <strong>{t('public~Warning: ')}</strong>\n </dt>\n <dd>\n {t(\n 'public~The alert provides a warning notification about something that might require attention in order to prevent a problem from occurring. Warnings are typically routed to a ticketing system for non-immediate review.',\n )}\n </dd>\n <dt>\n <SeverityIcon severity={AlertSeverity.Info} /> <strong>{t('public~Info: ')}</strong>\n </dt>\n <dd>{t('public~The alert is provided for informational purposes only.')}</dd>\n <dt>\n <SeverityIcon severity={AlertSeverity.None} /> <strong>{t('public~None: ')}</strong>\n </dt>\n <dd>{t('public~The alert has no defined severity.')}</dd>\n <dd>\n {t('public~You can also create custom severity definitions for user workload alerts.')}\n </dd>\n </dl>\n );\n};\n\nconst SourceHelp: React.FC<{}> = () => {\n const { t } = useTranslation();\n\n return (\n <dl className=\"co-inline\">\n <dt>\n <strong>{t('public~Platform: ')}</strong>\n </dt>\n <dd>\n {t(\n 'public~Platform-level alerts relate only to OpenShift namespaces. OpenShift namespaces provide core OpenShift functionality.',\n )}\n </dd>\n <dt>\n <strong>{t('public~User: ')}</strong>\n </dt>\n <dd>\n {t(\n 'public~User workload alerts relate to user-defined namespaces. These alerts are user-created and are customizable. User workload monitoring can be enabled post-installation to provide observability into your own services.',\n )}\n </dd>\n </dl>\n );\n};\n\ntype ActionWithHref = Omit<Action, 'cta'> & { cta: { href: string; external?: boolean } };\n\nconst isActionWithHref = (action: Action): action is ActionWithHref => 'href' in action.cta;\n\nconst queryBrowserURL = (query: string, namespace: string) =>\n namespace\n ? `/dev-monitoring/ns/${namespace}/metrics?query0=${encodeURIComponent(query)}`\n : `/monitoring/query-browser?query0=${encodeURIComponent(query)}`;\n\nconst Graph: React.FC<GraphProps> = ({\n filterLabels = undefined,\n formatSeriesTitle,\n namespace,\n query,\n ruleDuration,\n}) => {\n const { t } = useTranslation();\n\n // 3 times the rule's duration, but not less than 30 minutes\n const timespan = Math.max(3 * ruleDuration, 30 * 60) * 1000;\n\n const GraphLink = () =>\n query ? (\n <Link aria-label={t('public~View in Metrics')} to={queryBrowserURL(query, namespace)}>\n {t('public~View in Metrics')}\n </Link>\n ) : null;\n\n return (\n <QueryBrowser\n namespace={namespace}\n defaultTimespan={timespan}\n filterLabels={filterLabels}\n formatSeriesTitle={formatSeriesTitle}\n GraphLink={GraphLink}\n pollInterval={Math.round(timespan / 120)}\n queries={[query]}\n />\n );\n};\n\nconst tableSilenceClasses = [\n 'pf-v5-c-table__action', // Checkbox\n 'pf-v5-u-w-50 pf-v5-u-w-33-on-sm', // Name\n 'pf-m-hidden pf-m-visible-on-sm', // Firing alerts\n '', // State\n 'pf-m-hidden pf-m-visible-on-sm', // Creator\n 'dropdown-kebab-pf pf-v5-c-table__action',\n];\n\nconst SilenceMatchersList = ({ silence }) => (\n <div className={`co-text-${SilenceResource.kind.toLowerCase()}`}>\n {_.map(silence.matchers, ({ name, isEqual, isRegex, value }, i) => (\n <Label className=\"co-label\" key={i}>\n <span className=\"co-label__key\">{name}</span>\n <span className=\"co-label__eq\">{silenceMatcherEqualitySymbol(isEqual, isRegex)}</span>\n <span className=\"co-label__value\">{value}</span>\n </Label>\n ))}\n </div>\n);\n\ntype SilenceTableRowProps = {\n obj: Silence;\n showCheckbox?: boolean;\n};\n\nconst SilenceTableRow: React.FC<SilenceTableRowProps> = ({ obj, showCheckbox }) => {\n const { t } = useTranslation();\n\n const { createdBy, endsAt, firingAlerts, id, name, startsAt } = obj;\n const state = silenceState(obj);\n\n const { selectedSilences, setSelectedSilences } = React.useContext(SelectedSilencesContext);\n\n const onCheckboxChange = React.useCallback(\n (_event, isChecked: boolean) => {\n setSelectedSilences((oldSet) => {\n const newSet = new Set(oldSet);\n if (isChecked) {\n newSet.add(id);\n } else {\n newSet.delete(id);\n }\n return newSet;\n });\n },\n [id, setSelectedSilences],\n );\n\n const { ns: namespace } = useParams();\n\n return (\n <>\n {showCheckbox && (\n <td className={tableSilenceClasses[0]}>\n <Checkbox\n id={id}\n isChecked={selectedSilences.has(id)}\n isDisabled={state === SilenceStates.Expired}\n onChange={onCheckboxChange}\n />\n </td>\n )}\n <td className={tableSilenceClasses[1]}>\n <div className=\"co-resource-item\">\n <MonitoringResourceIcon resource={SilenceResource} />\n <Link\n className=\"co-resource-item__resource-name\"\n data-test-id=\"silence-resource-link\"\n title={id}\n to={\n namespace\n ? `/dev-monitoring/ns/${namespace}/silences/${id}`\n : `/monitoring/silences/${id}`\n }\n >\n {name}\n </Link>\n </div>\n <div className=\"monitoring-label-list\">\n <SilenceMatchersList silence={obj} />\n </div>\n </td>\n <td className={tableSilenceClasses[2]}>\n <SeverityCounts alerts={firingAlerts} />\n </td>\n <td className={classNames(tableSilenceClasses[3], 'co-break-word')}>\n <SilenceState silence={obj} />\n {state === SilenceStates.Pending && (\n <StateTimestamp text={t('public~Starts')} timestamp={startsAt} />\n )}\n {state === SilenceStates.Active && (\n <StateTimestamp text={t('public~Ends')} timestamp={endsAt} />\n )}\n {state === SilenceStates.Expired && (\n <StateTimestamp text={t('public~Expired')} timestamp={endsAt} />\n )}\n </td>\n <td className={tableSilenceClasses[4]}>{createdBy || '-'}</td>\n <td className={tableSilenceClasses[5]}>\n <SilenceDropdownKebab silence={obj} />\n </td>\n </>\n );\n};\n\nconst SilenceTableRowWithCheckbox: React.FC<RowProps<Silence>> = ({ obj }) => (\n <SilenceTableRow showCheckbox={true} obj={obj} />\n);\n\nexport const alertMessageResources: {\n [labelName: string]: { kind: string; namespaced?: boolean };\n} = {\n container: ContainerModel,\n daemonset: DaemonSetModel,\n deployment: DeploymentModel,\n job: JobModel,\n namespace: NamespaceModel,\n node: NodeModel,\n pod: PodModel,\n statefulset: StatefulSetModel,\n};\n\nconst matchCount = (haystack: string, regExpString: string) =>\n _.size(haystack.match(new RegExp(regExpString, 'g')));\n\nconst AlertMessage: React.FC<AlertMessageProps> = ({ alertText, labels, template }) => {\n if (_.isEmpty(alertText)) {\n return null;\n }\n\n let messageParts: React.ReactNode[] = [alertText];\n\n // Go through each recognized resource type and replace any resource names that exist in alertText\n // with a link to the resource's details page\n _.each(alertMessageResources, (model, label) => {\n const labelValue = labels[label];\n\n if (labelValue && !(model.namespaced && _.isEmpty(labels.namespace))) {\n const tagCount = matchCount(template, `\\\\{\\\\{ *\\\\$labels\\\\.${label} *\\\\}\\\\}`);\n const resourceNameCount = matchCount(alertText, _.escapeRegExp(labelValue));\n\n // Don't do the replacement unless the counts match. This avoids overwriting the wrong string\n // if labelValue happens to appear elsewhere in alertText\n if (tagCount > 0 && tagCount === resourceNameCount) {\n const link = (\n <ResourceLink\n className=\"co-resource-item--monitoring-alert\"\n inline\n key={model.kind}\n kind={model.kind}\n name={labelValue}\n namespace={model.namespaced ? labels.namespace : undefined}\n />\n );\n messageParts = _.flatMap(messageParts, (part) => {\n if (_.isString(part) && part.indexOf(labelValue) !== -1) {\n // `part` contains at least one instance of the resource name, so replace each instance\n // with the link to the resource. Since the link is a component, we can't simply do a\n // string substitution. Instead, create an array that contains each of the string parts\n // and the resource links in the correct order.\n const splitParts = part.split(labelValue);\n return _.flatMap(splitParts, (p) => [p, link]).slice(0, -1);\n }\n return [part];\n });\n }\n }\n });\n\n return (\n <div className=\"co-alert-manager\">\n <p>\n <LinkifyExternal>{messageParts}</LinkifyExternal>\n </p>\n </div>\n );\n};\n\nconst HeaderAlertMessage: React.FC<{ alert: Alert; rule: Rule }> = ({ alert, rule }) => {\n const annotation = alert.annotations.description ? 'description' : 'message';\n return (\n <AlertMessage\n alertText={alert.annotations[annotation]}\n labels={alert.labels}\n template={rule.annotations[annotation]}\n />\n );\n};\n\nconst getSourceKey = (t: TFunction, source: string) => {\n switch (source) {\n case 'Platform':\n return t('public~Platform');\n case 'User':\n return t('public~User');\n default:\n return source;\n }\n};\n\nconst SilencedByList: React.FC<{ silences: Silence[] }> = ({ silences }) => {\n const { t } = useTranslation();\n\n const columns = React.useMemo<TableColumn<Silence>[]>(\n () => [\n {\n id: 'name',\n props: { className: tableSilenceClasses[1] },\n title: t('public~Name'),\n },\n {\n id: 'firingAlerts',\n props: { className: tableSilenceClasses[2] },\n title: t('public~Firing alerts'),\n },\n {\n id: 'state',\n props: { className: tableSilenceClasses[3] },\n title: t('public~State'),\n },\n {\n id: 'createdBy',\n props: { className: tableSilenceClasses[4] },\n title: t('public~Creator'),\n },\n {\n id: 'actions',\n props: { className: tableSilenceClasses[5] },\n title: '',\n },\n ],\n [t],\n );\n\n return (\n <VirtualizedTable<Silence>\n aria-label={t('public~Silenced by')}\n columns={columns}\n data={silences}\n loaded={true}\n loadError={undefined}\n Row={SilenceTableRow}\n unfilteredData={silences}\n />\n );\n};\n\nconst AlertsDetailsPage_: React.FC<{}> = () => {\n const { t } = useTranslation();\n const params = useParams();\n const navigate = useNavigate();\n\n const isDevPerspective = _.has(params, 'ns');\n const namespace = params?.ns;\n const hideGraphs = useSelector(({ observe }: RootState) => !!observe.get('hideGraphs'));\n\n const alerts: Alerts = useSelector(({ observe }: RootState) =>\n observe.get(isDevPerspective ? 'devAlerts' : 'alerts'),\n );\n\n const silencesLoaded = ({ observe }) =>\n observe.get(isDevPerspective ? 'devSilences' : 'silences')?.loaded;\n\n const ruleAlerts = _.filter(alerts?.data, (a) => a.rule.id === params?.ruleID);\n const rule = ruleAlerts?.[0]?.rule;\n const alert = _.find(ruleAlerts, (a) => _.isEqual(a.labels, getURLSearchParams()));\n\n const state = alertState(alert);\n\n const labelsMemoKey = JSON.stringify(alert?.labels);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const labels: PrometheusLabels = React.useMemo(() => alert?.labels, [labelsMemoKey]);\n\n // eslint-disable-next-line camelcase\n const runbookURL = alert?.annotations?.runbook_url;\n\n const sourceId = rule?.sourceId;\n\n // Load alert metrics chart from plugin\n const [alertsChartExtensions] = useResolvedExtensions<AlertingRuleChartExtension>(\n isAlertingRuleChart,\n );\n const alertsChart = alertsChartExtensions\n .filter((extension) => extension.properties.sourceId === sourceId)\n .map((extension) => extension.properties.chart);\n\n const AlertsChart = alertsChart?.[0];\n\n return (\n <>\n <Helmet>\n <title>{t('public~{{alertName}} details', { alertName: labels?.alertname })}</title>\n </Helmet>\n <StatusBox\n data={alert}\n label={AlertResource.label}\n loaded={alerts?.loaded}\n loadError={alerts?.loadError}\n >\n <div className=\"pf-v5-c-page__main-breadcrumb\">\n <Breadcrumb className=\"monitoring-breadcrumbs\">\n <BreadcrumbItem>\n <Link\n className=\"pf-v5-c-breadcrumb__link\"\n to={namespace ? `/dev-monitoring/ns/${namespace}/alerts` : '/monitoring/alerts'}\n >\n {t('public~Alerts')}\n </Link>\n </BreadcrumbItem>\n <BreadcrumbItem isActive>{t('public~Alert details')}</BreadcrumbItem>\n </Breadcrumb>\n </div>\n <div className=\"co-m-nav-title co-m-nav-title--detail co-m-nav-title--breadcrumbs\">\n <h1 className=\"co-m-pane__heading\">\n <div data-test=\"resource-title\" className=\"co-resource-item\">\n <MonitoringResourceIcon className=\"co-m-resource-icon--lg\" resource={AlertResource} />\n {labels?.alertname}\n <SeverityBadge severity={labels?.severity} />\n </div>\n {state !== AlertStates.Silenced && (\n <div data-test-id=\"details-actions\">\n <Button\n className=\"co-action-buttons__btn\"\n onClick={() => silenceAlert(alert, navigate, namespace)}\n variant=\"primary\"\n >\n {t('public~Silence alert')}\n </Button>\n </div>\n )}\n </h1>\n <HeaderAlertMessage alert={alert} rule={rule} />\n </div>\n <div className=\"co-m-pane__body\">\n <Toolbar className=\"monitoring-alert-detail-toolbar\">\n <ToolbarContent>\n <ToolbarItem variant=\"label\">\n <SectionHeading text={t('public~Alert details')} />\n </ToolbarItem>\n <ToolbarGroup align={{ default: 'alignRight' }}>\n <ActionServiceProvider context={{ 'alert-detail-toolbar-actions': { alert } }}>\n {({ actions, loaded }) =>\n loaded\n ? actions.filter(isActionWithHref).map((action) => (\n <ToolbarItem key={action.id}>\n <Link to={action.cta.href}>{action.label}</Link>\n </ToolbarItem>\n ))\n : null\n }\n </ActionServiceProvider>\n <ToolbarItem>\n <ToggleGraph />\n </ToolbarItem>\n </ToolbarGroup>\n </ToolbarContent>\n </Toolbar>\n\n <div className=\"co-m-pane__body-group\">\n <div className=\"row\">\n <div className=\"col-sm-12\">\n {!sourceId || sourceId === 'prometheus' ? (\n <Graph\n filterLabels={labels}\n namespace={namespace}\n query={rule?.query}\n ruleDuration={rule?.duration}\n />\n ) : AlertsChart && rule && !hideGraphs ? (\n <AlertsChart rule={rule} />\n ) : null}\n </div>\n </div>\n <div className=\"row\">\n <div className=\"col-sm-6\">\n <dl className=\"co-m-pane__details\">\n <dt>{t('public~Name')}</dt>\n <dd>{labels?.alertname}</dd>\n <dt>\n <PopoverField bodyContent={<SeverityHelp />} label={t('public~Severity')} />\n </dt>\n <dd>\n <Severity severity={labels?.severity} />\n </dd>\n {alert?.annotations?.description && (\n <>\n <dt>{t('public~Description')}</dt>\n <dd>\n <AlertMessage\n alertText={alert.annotations.description}\n labels={labels}\n template={rule?.annotations?.description}\n />\n </dd>\n </>\n )}\n {alert?.annotations?.summary && (\n <>\n <dt>{t('public~Summary')}</dt>\n <dd>{alert.annotations.summary}</dd>\n </>\n )}\n {alert?.annotations?.message && (\n <>\n <dt>{t('public~Message')}</dt>\n <dd>\n <AlertMessage\n alertText={alert.annotations.message}\n labels={labels}\n template={rule?.annotations?.message}\n />\n </dd>\n </>\n )}\n {runbookURL && (\n <>\n <dt>{t('public~Runbook')}</dt>\n <dd>\n <ExternalLink href={runbookURL} text={runbookURL} />\n </dd>\n </>\n )}\n </dl>\n </div>\n <div className=\"col-sm-6\">\n <dl className=\"co-m-pane__details\">\n <dt>\n <PopoverField bodyContent={<SourceHelp />} label={t('public~Source')} />\n </dt>\n <dd>{alert && getSourceKey(t, _.startCase(alertSource(alert)))}</dd>\n <dt>\n <PopoverField bodyContent={<AlertStateHelp />} label={t('public~State')} />\n </dt>\n <dd>\n <AlertState state={state} />\n <AlertStateDescription alert={alert} />\n </dd>\n </dl>\n </div>\n </div>\n </div>\n <div className=\"co-m-pane__body-group\">\n <div className=\"row\">\n <div className=\"col-xs-12\">\n <dl className=\"co-m-pane__details\" data-test=\"label-list\">\n <dt>{t('public~Labels')}</dt>\n <dd>\n <Labels kind=\"alert\" labels={labels} />\n </dd>\n </dl>\n </div>\n </div>\n </div>\n <div className=\"co-m-pane__body-group\">\n <div className=\"row\">\n <div className=\"col-xs-12\">\n <dl className=\"co-m-pane__details\">\n <dt>{t('public~Alerting rule')}</dt>\n <dd>\n <div className=\"co-resource-item\">\n <MonitoringResourceIcon resource={RuleResource} />\n <Link\n to={ruleURL(rule, namespace)}\n data-test=\"alert-rules-detail-resource-link\"\n className=\"co-resource-item__resource-name\"\n >\n {_.get(rule, 'name')}\n </Link>\n </div>\n </dd>\n </dl>\n </div>\n </div>\n </div>\n </div>\n {silencesLoaded && !_.isEmpty(alert?.silencedBy) && (\n <div className=\"co-m-pane__body\">\n <div className=\"co-m-pane__body-group\">\n <SectionHeading text={t('public~Silenced by')} />\n <div className=\"row\">\n <div className=\"col-xs-12\">\n <SilencedByList silences={alert?.silencedBy} />\n </div>\n </div>\n </div>\n </div>\n )}\n </StatusBox>\n </>\n );\n};\nconst AlertsDetailsPage = withFallback(AlertsDetailsPage_);\n\n// Renders Prometheus template text and highlights any {{ ... }} tags that it contains\nconst PrometheusTemplate = ({ text }) => (\n <>\n {text?.split(/(\\{\\{[^{}]*\\}\\})/)?.map((part: string, i: number) =>\n part.match(/^\\{\\{[^{}]*\\}\\}$/) ? (\n <code className=\"co-code prometheus-template-tag\" key={i}>\n {part}\n </code>\n ) : (\n part\n ),\n )}\n </>\n);\n\nconst ActiveAlerts: React.FC<{ alerts; ruleID: string; namespace: string }> = (props) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n\n const { alerts, ruleID, namespace } = props;\n\n return (\n <div className=\"co-m-table-grid co-m-table-grid--bordered\">\n <div className=\"row co-m-table-grid__head\">\n <div className=\"col-xs-6\">{t('public~Description')}</div>\n <div className=\"col-sm-2 hidden-xs\">{t('public~Active since')}</div>\n <div className=\"col-sm-2 col-xs-3\">{t('public~State')}</div>\n <div className=\"col-sm-2 col-xs-3\">{t('public~Value')}</div>\n </div>\n <div className=\"co-m-table-grid__body\">\n {_.sortBy(alerts, alertDescription).map((a, i) => (\n <div className=\"row co-resource-list__item\" key={i}>\n <div className=\"col-xs-6\">\n <Link\n className=\"co-resource-item\"\n data-test=\"active-alerts\"\n to={\n namespace\n ? `/dev-monitoring/ns/${namespace}/alerts/${ruleID}?${labelsToParams(a.labels)}`\n : alertURL(a, ruleID)\n }\n >\n {alertDescription(a)}\n </Link>\n </div>\n <div className=\"col-sm-2 hidden-xs\">\n <Timestamp timestamp={a.activeAt} />\n </div>\n <div className=\"col-sm-2 col-xs-3\">\n <AlertState state={a.state} />\n </div>\n <div className=\"col-sm-2 col-xs-3 co-truncate\">{a.value}</div>\n {a.state !== AlertStates.Silenced && (\n <div className=\"dropdown-kebab-pf\">\n <KebabDropdown\n dropdownItems={[\n <DropdownItemDeprecated\n component=\"button\"\n key=\"silence\"\n onClick={() => silenceAlert(a, navigate, namespace)}\n >\n {t('public~Silence alert')}\n </DropdownItemDeprecated>,\n ]}\n />\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nconst AlertRulesDetailsPage_: React.FC<{}> = () => {\n const { t } = useTranslation();\n const params = useParams();\n\n const isDevPerspective = _.has(params, 'ns');\n const namespace = params?.ns;\n\n const rules: Rule[] = useSelector(({ observe }: RootState) =>\n observe.get(isDevPerspective ? 'devRules' : 'rules'),\n );\n const rule = _.find(rules, { id: params?.id });\n\n const { loaded, loadError }: Alerts = useSelector(\n ({ observe }: RootState) => observe.get(isDevPerspective ? 'devAlerts' : 'alerts') || {},\n );\n\n const sourceId = rule?.sourceId;\n\n // Load alert metrics chart from plugin\n const [alertsChartExtensions] = useResolvedExtensions<AlertingRuleChartExtension>(\n isAlertingRuleChart,\n );\n const alertsChart = alertsChartExtensions\n .filter((extension) => extension.properties.sourceId === sourceId)\n .map((extension) => extension.properties.chart);\n\n const AlertsChart = alertsChart?.[0];\n\n const formatSeriesTitle = (alertLabels) => {\n const nameLabel = alertLabels.__name__ ?? '';\n const otherLabels = _.omit(alertLabels, '__name__');\n return `${nameLabel}{${_.map(otherLabels, (v, k) => `${k}=\"${v}\"`).join(',')}}`;\n };\n\n // eslint-disable-next-line camelcase\n const runbookURL = rule?.annotations?.runbook_url;\n\n return (\n <>\n <Helmet>\n <title>{t('public~{{name}} details', { name: rule?.name || RuleResource.label })}</title>\n </Helmet>\n <StatusBox data={rule} label={RuleResource.label} loaded={loaded} loadError={loadError}>\n <div className=\"pf-v5-c-page__main-breadcrumb\">\n <Breadcrumb className=\"monitoring-breadcrumbs\">\n <BreadcrumbItem>\n <Link\n className=\"pf-v5-c-breadcrumb__link\"\n to={namespace ? `/dev-monitoring/ns/${namespace}/alerts` : '/monitoring/alertrules'}\n >\n {namespace ? t('public~Alerts') : t('public~Alerting rules')}\n </Link>\n </BreadcrumbItem>\n <BreadcrumbItem isActive>{t('public~Alerting rule details')}</BreadcrumbItem>\n </Breadcrumb>\n </div>\n <div className=\"co-m-nav-title co-m-nav-title--detail co-m-nav-title--breadcrumbs\">\n <h1 className=\"co-m-pane__heading\">\n <div data-test=\"resource-title\" className=\"co-resource-item\">\n <MonitoringResourceIcon className=\"co-m-resource-icon--lg\" resource={RuleResource} />\n {rule?.name}\n <SeverityBadge severity={rule?.labels?.severity} />\n </div>\n </h1>\n </div>\n <div className=\"co-m-pane__body\">\n <div className=\"monitoring-heading\">\n <SectionHeading text={t('public~Alerting rule details')} />\n </div>\n <div className=\"co-m-pane__body-group\">\n <div className=\"row\">\n <div className=\"col-sm-6\">\n <dl className=\"co-m-pane__details\">\n <dt>{t('public~Name')}</dt>\n <dd>{rule?.name}</dd>\n <dt>\n <PopoverField bodyContent={<SeverityHelp />} label={t('public~Severity')} />\n </dt>\n <dd>\n <Severity severity={rule?.labels?.severity} />\n </dd>\n {rule?.annotations?.description && (\n <>\n <dt>{t('public~Description')}</dt>\n <dd>\n <PrometheusTemplate text={rule.annotations.description} />\n </dd>\n </>\n )}\n {rule?.annotations?.summary && (\n <>\n <dt>{t('public~Summary')}</dt>\n <dd>{rule.annotations.summary}</dd>\n </>\n )}\n {rule?.annotations?.message && (\n <>\n <dt>{t('public~Message')}</dt>\n <dd>\n <PrometheusTemplate text={rule.annotations.message} />\n </dd>\n </>\n )}\n {runbookURL && (\n <>\n <dt>{t('public~Runbook')}</dt>\n <dd>\n <ExternalLink href={runbookURL} text={runbookURL} />\n </dd>\n </>\n )}\n </dl>\n </div>\n <div className=\"col-sm-6\">\n <dl className=\"co-m-pane__details\">\n <dt>\n <PopoverField bodyContent={<SourceHelp />} label={t('public~Source')} />\n </dt>\n <dd>{rule && getSourceKey(t, _.startCase(alertingRuleSource(rule)))}</dd>\n {_.isInteger(rule?.duration) && (\n <>\n <dt>{t('public~For')}</dt>\n <dd>\n {rule.duration === 0 ? '-' : formatPrometheusDuration(rule.duration * 1000)}\n </dd>\n </>\n )}\n <dt>{t('public~Expression')}</dt>\n <dd>\n <Link to={queryBrowserURL(rule?.query, namespace)}>\n <CodeBlock>\n <CodeBlockCode>{rule?.query}</CodeBlockCode>\n </CodeBlock>\n </Link>\n </dd>\n </dl>\n </div>\n </div>\n </div>\n <div className=\"co-m-pane__body-group\">\n <div className=\"row\">\n <div className=\"col-xs-12\">\n <dl className=\"co-m-pane__details\">\n <dt>{t('public~Labels')}</dt>\n <dd>\n <Labels kind=\"alertrule\" labels={rule?.labels} />\n </dd>\n </dl>\n </div>\n </div>\n </div>\n </div>\n <div className=\"co-m-pane__body\">\n <div className=\"co-m-pane__body-group\">\n <Toolbar className=\"monitoring-alert-detail-toolbar\">\n <ToolbarContent>\n <ToolbarItem variant=\"label\">\n <SectionHeading text={t('public~Active alerts')} />\n </ToolbarItem>\n <ToolbarGroup align={{ default: 'alignRight' }}>\n <ToolbarItem>\n <ToggleGraph />\n </ToolbarItem>\n </ToolbarGroup>\n </ToolbarContent>\n </Toolbar>\n <div className=\"row\">\n <div className=\"col-sm-12\">\n {!sourceId || sourceId === 'prometheus' ? (\n <Graph\n formatSeriesTitle={formatSeriesTitle}\n namespace={namespace}\n query={rule?.query}\n ruleDuration={rule?.duration}\n showLegend\n />\n ) : AlertsChart && rule ? (\n <AlertsChart rule={rule} />\n ) : null}\n </div>\n </div>\n <div className=\"row\">\n <div className=\"col-xs-12\">\n {_.isEmpty(rule?.alerts) ? (\n <div className=\"pf-v5-u-text-align-center\">{t('public~None found')}</div>\n ) : (\n <ActiveAlerts alerts={rule.alerts} ruleID={rule?.id} namespace={namespace} />\n )}\n </div>\n </div>\n </div>\n </div>\n </StatusBox>\n </>\n );\n};\nexport const AlertRulesDetailsPage = withFallback(AlertRulesDetailsPage_);\n\ntype ExpireSilenceModalProps = {\n isOpen: boolean;\n setClosed: () => void;\n silenceID: string;\n};\n\nconst ExpireSilenceModal: React.FC<ExpireSilenceModalProps> = ({\n isOpen,\n setClosed,\n silenceID,\n}) => {\n const { t } = useTranslation();\n const { ns: namespace } = useParams();\n\n const [isInProgress, , setInProgress, setNotInProgress] = useBoolean(false);\n const [errorMessage, setErrorMessage] = React.useState();\n\n const expireSilence = () => {\n setInProgress();\n const url = namespace\n ? `api/alertmanager-tenancy/api/v2/silence/${silenceID}?namespace=${namespace}`\n : `${window.SERVER_FLAGS.alertManagerBaseURL}/api/v2/silence/${silenceID}`;\n consoleFetchJSON\n .delete(url)\n .then(() => {\n refreshNotificationPollers();\n setClosed();\n })\n .catch((err) => {\n setErrorMessage(_.get(err, 'json.error') || err.message || 'Error expiring silence');\n setNotInProgress();\n })\n .then(setNotInProgress);\n };\n\n return (\n <Modal\n isOpen={isOpen}\n position=\"top\"\n showClose={false}\n title={t('public~Expire silence')}\n variant={ModalVariant.small}\n >\n <Flex direction={{ default: 'column' }}>\n <FlexItem>{t('public~Are you sure you want to expire this silence?')}</FlexItem>\n <Flex direction={{ default: 'column' }}>\n <FlexItem>\n {errorMessage && (\n <PFAlert\n className=\"co-alert co-alert--scrollable\"\n isInline\n title={t('public~An error occurred')}\n variant=\"danger\"\n >\n <div className=\"co-pre-line\">{errorMessage}</div>\n </PFAlert>\n )}\n </FlexItem>\n <Flex>\n <FlexItem>{isInProgress && <LoadingInline />}</FlexItem>\n <FlexItem align={{ default: 'alignRight' }}>\n <Button variant=\"secondary\" onClick={setClosed}>\n {t('public~Cancel')}\n </Button>\n </FlexItem>\n <FlexItem>\n <Button variant=\"primary\" onClick={expireSilence}>\n {t('public~Expire silence')}\n </Button>\n </FlexItem>\n </Flex>\n </Flex>\n </Flex>\n </Modal>\n );\n};\n\ntype SilenceDropdownProps = {\n className?: string;\n isPlain?: boolean;\n silence: Silence;\n Toggle: React.FC<{ onToggle: KebabTogglePropsDeprecated['onToggle'] }>;\n};\n\nconst SilenceDropdown: React.FC<SilenceDropdownProps> = ({\n className,\n isPlain,\n silence,\n Toggle,\n}) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n\n const { ns: namespace } = useParams();\n\n const [isOpen, setIsOpen, , setClosed] = useBoolean(false);\n const [isModalOpen, , setModalOpen, setModalClosed] = useBoolean(false);\n\n const editSilence = () => {\n navigate(\n namespace\n ? `/dev-monitoring/ns/${namespace}/silences/${silence.id}/edit`\n : `/monitoring/silences/${silence.id}/edit`,\n );\n };\n\n const dropdownItems =\n silenceState(silence) === SilenceStates.Expired\n ? [\n <DropdownItemDeprecated key=\"edit-silence\" component=\"button\" onClick={editSilence}>\n {t('public~Recreate silence')}\n </DropdownItemDeprecated>,\n ]\n : [\n <DropdownItemDeprecated key=\"edit-silence\" component=\"button\" onClick={editSilence}>\n {t('public~Edit silence')}\n </DropdownItemDeprecated>,\n <DropdownItemDeprecated key=\"cancel-silence\" component=\"button\" onClick={setModalOpen}>\n {t('public~Expire silence')}\n </DropdownItemDeprecated>,\n ];\n\n return (\n <>\n <DropdownDeprecated\n className={className}\n data-test=\"silence-actions\"\n dropdownItems={dropdownItems}\n isOpen={isOpen}\n isPlain={isPlain}\n onSelect={setClosed}\n position={DropdownPositionDeprecated.right}\n toggle={<Toggle onToggle={setIsOpen} />}\n />\n <ExpireSilenceModal isOpen={isModalOpen} setClosed={setModalClosed} silenceID={silence.id} />\n </>\n );\n};\n\nconst SilenceDropdownKebab: React.FC<{ silence: Silence }> = ({ silence }) => (\n <SilenceDropdown isPlain silence={silence} Toggle={KebabToggleDeprecated} />\n);\n\nconst ActionsToggle: React.FC<{ onToggle: KebabTogglePropsDeprecated['onToggle'] }> = ({\n onToggle,\n ...props\n}) => (\n <DropdownToggleDeprecated data-test=\"silence-actions-toggle\" onToggle={onToggle} {...props}>\n Actions\n </DropdownToggleDeprecated>\n);\n\nconst SilenceDropdownActions: React.FC<{ silence: Silence }> = ({ silence }) => (\n <SilenceDropdown className=\"co-actions-menu\" silence={silence} Toggle={ActionsToggle} />\n);\n\nconst SilencedAlertsList = ({ alerts }) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n\n const { ns: namespace } = useParams();\n\n return _.isEmpty(alerts) ? (\n <div className=\"pf-v5-u-text-align-center\">{t('public~None found')}</div>\n ) : (\n <div className=\"co-m-table-grid co-m-table-grid--bordered\">\n <div className=\"row co-m-table-grid__head\">\n <div className=\"col-xs-9\">{t('public~Name')}</div>\n <div className=\"col-xs-3\">{t('public~Severity')}</div>\n </div>\n <div className=\"co-m-table-grid__body\">\n {_.sortBy(alerts, alertDescription).map((a, i) => (\n <div className=\"row co-resource-list__item\" key={i}>\n <div className=\"col-xs-9\">\n <Link\n className=\"co-resource-item\"\n data-test=\"firing-alerts\"\n to={\n namespace\n ? `/dev-monitoring/ns/${namespace}/alerts/${a.rule.id}?${labelsToParams(\n a.labels,\n )}`\n : alertURL(a, a.rule.id)\n }\n >\n {a.labels.alertname}\n </Link>\n <div className=\"monitoring-description\">{alertDescription(a)}</div>\n </div>\n <div className=\"col-xs-3\">\n <Severity severity={a.labels.severity} />\n </div>\n <div className=\"dropdown-kebab-pf\">\n <KebabDropdown\n dropdownItems={[\n <DropdownItemDeprecated\n key=\"view-rule\"\n onClick={() => navigate(ruleURL(a.rule, namespace))}\n >\n {t('public~View alerting rule')}\n </DropdownItemDeprecated>,\n ]}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nconst SilencesDetailsPage_: React.FC<{}> = () => {\n const { t } = useTranslation();\n const params = useParams();\n const { ns: namespace } = params;\n\n const alertsLoaded = useSelector(\n ({ observe }: RootState) => observe.get(namespace ? 'devAlerts' : 'alerts')?.loaded,\n );\n\n const silences: Silences = useSelector(({ observe }: RootState) =>\n observe.get(namespace ? 'devSilences' : 'silences'),\n );\n const silence = _.find(silences?.data, { id: params?.id });\n\n return (\n <>\n <Helmet>\n <title>\n {t('public~{{name}} details', { name: silence?.name || SilenceResource.label })}\n </title>\n </Helmet>\n <StatusBox\n data={silence}\n label={SilenceResource.label}\n loaded={silences?.loaded}\n loadError={silences?.loadError}\n >\n <div className=\"pf-v5-c-page__main-breadcrumb\">\n <Breadcrumb className=\"monitoring-breadcrumbs\">\n <BreadcrumbItem>\n <Link\n className=\"pf-v5-c-breadcrumb__link\"\n to={namespace ? `/dev-monitoring/ns/${namespace}/silences` : '/monitoring/silences'}\n >\n {t('public~Silences')}\n </Link>\n </BreadcrumbItem>\n <BreadcrumbItem isActive>{t('public~Silence details')}</BreadcrumbItem>\n </Breadcrumb>\n </div>\n <div className=\"co-m-nav-title co-m-nav-title--detail co-m-nav-title--breadcrumbs\">\n <h1 className=\"co-m-pane__heading\">\n <div data-test=\"resource-title\" className=\"co-resource-item\">\n <MonitoringResourceIcon\n className=\"co-m-resource-icon--lg\"\n resource={SilenceResource}\n />\n {silence?.name}\n </div>\n <div className=\"co-actions\" data-test-id=\"details-actions\">\n {silence && <SilenceDropdownActions silence={silence} />}\n </div>\n </h1>\n </div>\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Silence details')} />\n <div className=\"co-m-pane__body-group\">\n <div className=\"row\">\n <div className=\"col-sm-6\">\n <dl className=\"co-m-pane__details\">\n {silence?.name && (\n <>\n <dt>{t('public~Name')}</dt>\n <dd>{silence?.name}</dd>\n </>\n )}\n <dt>{t('public~Matchers')}</dt>\n <dd data-test=\"label-list\">\n {_.isEmpty(silence?.matchers) ? (\n <div className=\"text-muted\">{t('public~No matchers')}</div>\n ) : (\n <SilenceMatchersList silence={silence} />\n )}\n </dd>\n <dt>{t('public~State')}</dt>\n <dd>\n <SilenceState silence={silence} />\n </dd>\n <dt>{t('public~Last updated at')}</dt>\n <dd>\n <Timestamp timestamp={silence?.updatedAt} />\n </dd>\n </dl>\n </div>\n <div className=\"col-sm-6\">\n <dl className=\"co-m-pane__details\">\n <dt>{t('public~Starts at')}</dt>\n <dd>\n <Timestamp timestamp={silence?.startsAt} />\n </dd>\n <dt>{t('public~Ends at')}</dt>\n <dd>\n <Timestamp timestamp={silence?.endsAt} />\n </dd>\n <dt>{t('public~Created by')}</dt>\n <dd>{silence?.createdBy || '-'}</dd>\n <dt>{t('public~Comment')}</dt>\n <dd>{silence?.comment || '-'}</dd>\n <dt>{t('public~Firing alerts')}</dt>\n <dd>\n {alertsLoaded ? (\n <SeverityCounts alerts={silence?.firingAlerts} />\n ) : (\n <LoadingInline />\n )}\n </dd>\n </dl>\n </div>\n </div>\n </div>\n </div>\n <div className=\"co-m-pane__body\">\n <div className=\"co-m-pane__body-group\">\n <SectionHeading text={t('public~Firing alerts')} />\n <div className=\"row\">\n <div className=\"col-xs-12\">\n {alertsLoaded ? (\n <SilencedAlertsList alerts={silence?.firingAlerts} />\n ) : (\n <LoadingInline />\n )}\n </div>\n </div>\n </div>\n </div>\n </StatusBox>\n </>\n );\n};\nexport const SilencesDetailsPage = withFallback(SilencesDetailsPage_);\n\nconst tableAlertClasses = [\n 'pf-v5-u-w-50 pf-v5-u-w-33-on-sm', // Name\n 'pf-m-hidden pf-m-visible-on-sm', // Severity\n '', // State\n 'pf-m-hidden pf-m-visible-on-sm', // Source\n 'dropdown-kebab-pf pf-v5-c-table__action',\n];\n\nconst AlertTableRow: React.FC<RowProps<Alert>> = ({ obj }) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n\n const { annotations = {}, labels } = obj;\n const description = annotations.description || annotations.message;\n const state = alertState(obj);\n\n const title: string = obj.annotations?.description || obj.annotations?.message;\n\n const { ns: namespace } = useParams();\n\n const dropdownItems = [\n <DropdownItemDeprecated key=\"view-rule\" onClick={() => navigate(ruleURL(obj.rule, namespace))}>\n {t('public~View alerting rule')}\n </DropdownItemDeprecated>,\n ];\n if (state !== AlertStates.Silenced) {\n dropdownItems.unshift(\n <DropdownItemDeprecated key=\"silence-alert\" onClick={() => silenceAlert(obj, navigate)}>\n {t('public~Silence alert')}\n </DropdownItemDeprecated>,\n );\n }\n\n return (\n <>\n <td className={tableAlertClasses[0]} title={title}>\n <div className=\"co-resource-item\">\n <MonitoringResourceIcon resource={AlertResource} />\n <Link\n to={alertURL(obj, obj.rule.id)}\n data-test-id=\"alert-resource-link\"\n className=\"co-resource-item__resource-name\"\n >\n {labels?.alertname}\n </Link>\n </div>\n <div className=\"monitoring-description\">{description}</div>\n </td>\n <td className={tableAlertClasses[1]} title={title}>\n <Severity severity={labels?.severity} />\n </td>\n <td className={tableAlertClasses[2]} title={title}>\n <AlertState state={state} />\n <AlertStateDescription alert={obj} />\n </td>\n <td className={tableAlertClasses[3]} title={title}>\n {getSourceKey(t, _.startCase(alertSource(obj)))}\n </td>\n <td className={tableAlertClasses[4]} title={title}>\n <KebabDropdown dropdownItems={dropdownItems} />\n </td>\n </>\n );\n};\n\nexport const severityRowFilter = (): RowFilter => ({\n filter: (filter, alert: Alert) =>\n filter.selected?.includes(alert.labels?.severity) || _.isEmpty(filter.selected),\n filterGroupName: i18next.t('public~Severity'),\n items: [\n { id: AlertSeverity.Critical, title: i18next.t('public~Critical') },\n { id: AlertSeverity.Warning, title: i18next.t('public~Warning') },\n { id: AlertSeverity.Info, title: i18next.t('public~Info') },\n { id: AlertSeverity.None, title: i18next.t('public~None') },\n ],\n reducer: ({ labels }: Alert | Rule) => labels?.severity,\n type: 'alert-severity',\n});\n\nconst SilencesNotLoadedWarning: React.FC<{ silencesLoadError: any }> = ({ silencesLoadError }) => {\n const { t } = useTranslation();\n\n return (\n <PFAlert\n className=\"co-alert\"\n isInline\n title={t(\n 'public~Error loading silences from Alertmanager. Some of the alerts below may actually be silenced.',\n )}\n variant=\"warning\"\n >\n {silencesLoadError.json?.error || silencesLoadError.message}\n </PFAlert>\n );\n};\n\n// Sort alerts by their state (sort first by the state itself, then by the timestamp relevant to\n// the state)\nconst alertStateOrder = (alert: Alert) => [\n [AlertStates.Firing, AlertStates.Pending, AlertStates.Silenced].indexOf(alertState(alert)),\n alertState(alert) === AlertStates.Silenced\n ? _.max(_.map(alert.silencedBy, 'endsAt'))\n : _.get(alert, 'activeAt'),\n];\n\nconst getAdditionalSources = <T extends Alert | Rule>(\n data: Array<T>,\n itemSource: (item: T) => string,\n) => {\n if (data) {\n const additionalSources = new Set<string>();\n data.forEach((item) => {\n const source = itemSource(item);\n if (source !== AlertSource.Platform && source !== AlertSource.User) {\n additionalSources.add(source);\n }\n });\n return Array.from(additionalSources).map((item) => ({ id: item, title: _.startCase(item) }));\n }\n return [];\n};\n\nconst AlertsPage_: React.FC<{}> = () => {\n const { t } = useTranslation();\n\n const { data, loaded = false, loadError }: Alerts = useSelector(\n ({ observe }: RootState) => observe.get('alerts') || {},\n );\n const silencesLoadError = useSelector(\n ({ observe }: RootState) => observe.get('silences')?.loadError,\n );\n const [isExactSearch] = useExactSearch();\n const matchFn: Function = isExactSearch ? exactMatch : fuzzyCaseInsensitive;\n\n const nameFilter: RowFilter = {\n filter: (filter, alert: Alert) => matchFn(filter.selected?.[0], alert.labels?.alertname),\n items: [],\n type: 'name',\n } as RowFilter;\n\n const alertAdditionalSources = React.useMemo(() => getAdditionalSources(data, alertSource), [\n data,\n ]);\n\n const rowFilters: RowFilter[] = [\n {\n defaultSelected: [AlertStates.Firing],\n filter: (filter, alert: Alert) =>\n filter.selected?.includes(alertState(alert)) || _.isEmpty(filter.selected),\n filterGroupName: t('public~Alert State'),\n items: [\n { id: AlertStates.Firing, title: t('public~Firing') },\n { id: AlertStates.Pending, title: t('public~Pending') },\n { id: AlertStates.Silenced, title: t('public~Silenced') },\n ],\n reducer: alertState,\n type: 'alert-state',\n },\n severityRowFilter(),\n {\n defaultSelected: [AlertSource.Platform],\n filter: (filter, alert: Alert) =>\n filter.selected?.includes(alertSource(alert)) || _.isEmpty(filter.selected),\n filterGroupName: t('public~Source'),\n items: [\n { id: AlertSource.Platform, title: t('public~Platform') },\n { id: AlertSource.User, title: t('public~User') },\n ...alertAdditionalSources,\n ],\n reducer: alertSource,\n type: 'alert-source',\n },\n ];\n\n const allFilters: RowFilter[] = [nameFilter, ...rowFilters];\n const [staticData, filteredData, onFilterChange] = useListPageFilter(data, allFilters);\n\n const columns = React.useMemo<TableColumn<Alert>[]>(\n () => [\n {\n id: 'name',\n props: { className: tableAlertClasses[0] },\n sort: 'labels.alertname',\n title: t('public~Name'),\n transforms: [sortable],\n },\n {\n id: 'severity',\n props: { className: tableAlertClasses[1] },\n sort: (alerts: Alert[], direction: 'asc' | 'desc') =>\n _.orderBy(alerts, alertSeverityOrder, [direction]) as Alert[],\n title: t('public~Severity'),\n transforms: [sortable],\n },\n {\n id: 'state',\n props: { className: tableAlertClasses[2] },\n sort: (alerts: Alert[], direction: 'asc' | 'desc') =>\n _.orderBy(alerts, alertStateOrder, [direction]),\n title: t('public~State'),\n transforms: [sortable],\n },\n {\n id: 'source',\n props: { className: tableAlertClasses[3] },\n sort: (alerts: Alert[], direction: 'asc' | 'desc') =>\n _.orderBy(alerts, alertSource, [direction]),\n title: t('public~Source'),\n transforms: [sortable],\n },\n {\n id: 'actions',\n props: { className: tableAlertClasses[4] },\n title: '',\n },\n ],\n [t],\n );\n\n return (\n <>\n <Helmet>\n <title>Alerting</title>\n </Helmet>\n <div className=\"co-m-pane__body\">\n <ListPageFilter\n data={staticData}\n labelFilter=\"alerts\"\n labelPath=\"labels\"\n loaded={loaded}\n onFilterChange={onFilterChange}\n rowFilters={rowFilters}\n />\n {silencesLoadError && <SilencesNotLoadedWarning silencesLoadError={silencesLoadError} />}\n <div className=\"row\">\n <div className=\"col-xs-12\">\n <VirtualizedTable<Alert>\n aria-label={t('public~Alerts')}\n columns={columns}\n data={filteredData ?? []}\n loaded={loaded}\n loadError={loadError}\n Row={AlertTableRow}\n unfilteredData={data}\n />\n </div>\n </div>\n </div>\n </>\n );\n};\nconst AlertsPage = withFallback(AlertsPage_);\n\nconst ruleHasAlertState = (rule: Rule, state: AlertStates): boolean =>\n state === AlertStates.NotFiring ? _.isEmpty(rule.alerts) : _.some(rule.alerts, { state });\n\nconst ruleAlertStateFilter = (filter, rule: Rule) =>\n (filter.selected?.includes(AlertStates.NotFiring) && _.isEmpty(rule.alerts)) ||\n _.some(rule.alerts, (a) => filter.selected?.includes(a.state)) ||\n _.isEmpty(filter.selected);\n\nexport const alertStateFilter = (): RowFilter => ({\n filter: ruleAlertStateFilter,\n filterGroupName: i18next.t('public~Alert State'),\n isMatch: ruleHasAlertState,\n items: [\n { id: AlertStates.Firing, title: i18next.t('public~Firing') },\n { id: AlertStates.Pending, title: i18next.t('public~Pending') },\n { id: AlertStates.Silenced, title: i18next.t('public~Silenced') },\n { id: AlertStates.NotFiring, title: i18next.t('public~Not Firing') },\n ],\n type: 'alerting-rule-has-alert-state',\n});\n\nconst tableRuleClasses = [\n 'pf-v5-u-w-50 pf-v5-u-w-33-on-sm', // Name\n 'pf-m-hidden pf-m-visible-on-sm', // Severity\n '', // Alert state\n 'pf-m-hidden pf-m-visible-on-sm', // Source\n];\n\nconst RuleTableRow: React.FC<RowProps<Rule>> = ({ obj }) => {\n const { t } = useTranslation();\n\n const title: string = obj.annotations?.description || obj.annotations?.message;\n\n const { ns: namespace } = useParams();\n\n return (\n <>\n <td className={tableRuleClasses[0]} title={title}>\n <div className=\"co-resource-item\">\n <MonitoringResourceIcon resource={RuleResource} />\n <Link to={ruleURL(obj, namespace)} className=\"co-resource-item__resource-name\">\n {obj.name}\n </Link>\n </div>\n </td>\n <td className={tableRuleClasses[1]} title={title}>\n <Severity severity={obj.labels?.severity} />\n </td>\n <td className={tableRuleClasses[2]} title={title}>\n {_.isEmpty(obj.alerts) ? '-' : <StateCounts alerts={obj.alerts} />}\n </td>\n <td className={tableRuleClasses[3]} title={title}>\n {getSourceKey(t, _.startCase(alertingRuleSource(obj)))}\n </td>\n </>\n );\n};\n\nconst RulesPage_: React.FC<{}> = () => {\n const { t } = useTranslation();\n\n const [isExactSearch] = useExactSearch();\n const matchFn: Function = isExactSearch ? exactMatch : fuzzyCaseInsensitive;\n\n const data: Rule[] = useSelector(({ observe }: RootState) => observe.get('rules'));\n const { loaded = false, loadError }: Alerts = useSelector(\n ({ observe }: RootState) => observe.get('alerts') || {},\n );\n const silencesLoadError = useSelector(\n ({ observe }: RootState) => observe.get('silences')?.loadError,\n );\n\n const nameFilter: RowFilter = {\n filter: (filter, rule: Rule) => matchFn(filter.selected?.[0], rule.name),\n items: [],\n type: 'name',\n } as RowFilter;\n\n const ruleAdditionalSources = React.useMemo(\n () => getAdditionalSources(data, alertingRuleSource),\n [data],\n );\n\n const rowFilters: RowFilter[] = [\n alertStateFilter(),\n severityRowFilter(),\n {\n defaultSelected: [AlertSource.Platform],\n filter: (filter, rule: Rule) =>\n filter.selected?.includes(alertingRuleSource(rule)) || _.isEmpty(filter.selected),\n filterGroupName: t('public~Source'),\n items: [\n { id: AlertSource.Platform, title: t('public~Platform') },\n { id: AlertSource.User, title: t('public~User') },\n ...ruleAdditionalSources,\n ],\n reducer: alertingRuleSource,\n type: 'alerting-rule-source',\n },\n ];\n\n const allFilters: RowFilter[] = [nameFilter, ...rowFilters];\n const [staticData, filteredData, onFilterChange] = useListPageFilter(data, allFilters);\n\n const columns = React.useMemo<TableColumn<Rule>[]>(\n () => [\n {\n id: 'name',\n props: { className: tableRuleClasses[0] },\n sort: 'name',\n title: t('public~Name'),\n transforms: [sortable],\n },\n {\n id: 'severity',\n props: { className: tableRuleClasses[1] },\n sort: (rules: Rule[], direction: 'asc' | 'desc') =>\n _.orderBy(rules, alertSeverityOrder, [direction]) as Rule[],\n title: t('public~Severity'),\n transforms: [sortable],\n },\n {\n id: 'state',\n props: { className: tableRuleClasses[2] },\n sort: (rules: Rule[], direction: 'asc' | 'desc') =>\n _.orderBy(rules, alertingRuleStateOrder, [direction]),\n title: t('public~Alert state'),\n transforms: [sortable],\n },\n {\n id: 'source',\n props: { className: tableRuleClasses[3] },\n sort: (rules: Rule[], direction: 'asc' | 'desc') =>\n _.orderBy(rules, alertingRuleSource, [direction]),\n title: t('public~Source'),\n transforms: [sortable],\n },\n ],\n [t],\n );\n\n return (\n <>\n <Helmet>\n <title>Alerting</title>\n </Helmet>\n <div className=\"co-m-pane__body\">\n <ListPageFilter\n data={staticData}\n labelFilter=\"observe-rules\"\n labelPath=\"labels\"\n loaded={loaded}\n onFilterChange={onFilterChange}\n rowFilters={rowFilters}\n />\n {silencesLoadError && <SilencesNotLoadedWarning silencesLoadError={silencesLoadError} />}\n <div className=\"row\">\n <div className=\"col-xs-12\">\n <VirtualizedTable<Rule>\n aria-label={t('public~Alerting rules')}\n columns={columns}\n data={filteredData ?? []}\n loaded={loaded}\n loadError={loadError}\n Row={RuleTableRow}\n unfilteredData={data}\n />\n </div>\n </div>\n </div>\n </>\n );\n};\nconst RulesPage = withFallback(RulesPage_);\n\nconst CreateSilenceButton: React.FC<{}> = React.memo(() => {\n const { t } = useTranslation();\n\n const { ns: namespace } = useParams();\n\n return (\n <Link\n className=\"co-m-primary-action\"\n to={namespace ? `/dev-monitoring/ns/${namespace}/silences/~new` : '/monitoring/silences/~new'}\n >\n <Button data-test=\"create-silence-btn\" variant=\"primary\">\n {t('public~Create silence')}\n </Button>\n </Link>\n );\n});\n\ntype ExpireAllSilencesButtonProps = {\n setErrorMessage: (string) => void;\n};\n\nconst ExpireAllSilencesButton: React.FC<ExpireAllSilencesButtonProps> = ({ setErrorMessage }) => {\n const { t } = useTranslation('public');\n\n const { ns: namespace } = useParams();\n\n const [isInProgress, , setInProgress, setNotInProgress] = useBoolean(false);\n\n const { selectedSilences, setSelectedSilences } = React.useContext(SelectedSilencesContext);\n\n const onClick = () => {\n setInProgress();\n Promise.allSettled(\n [...selectedSilences].map((silenceID) =>\n consoleFetchJSON.delete(\n namespace\n ? `api/alertmanager-tenancy/api/v2/silence/${silenceID}?namespace=${namespace}`\n : `${window.SERVER_FLAGS.alertManagerBaseURL}/api/v2/silence/${silenceID}`,\n ),\n ),\n ).then((values) => {\n setNotInProgress();\n setSelectedSilences(new Set());\n refreshNotificationPollers();\n const errors = values.filter((v) => v.status === 'rejected').map((v: any) => v.reason);\n if (errors.length > 0) {\n const messages = errors.map(\n (err) => _.get(err, 'json.error') || err.message || 'Error expiring silence',\n );\n setErrorMessage(messages.join(', '));\n }\n });\n };\n\n return (\n <Button\n isDisabled={selectedSilences.size === 0}\n isLoading={isInProgress}\n onClick={onClick}\n variant=\"secondary\"\n >\n {t('Expire {{count}} silence', { count: selectedSilences.size })}\n </Button>\n );\n};\n\nconst silenceFiringAlertsOrder = (silence: Silence) => {\n const counts = _.countBy(silence.firingAlerts, 'labels.severity');\n return [\n Number.MAX_SAFE_INTEGER - (counts[AlertSeverity.Critical] ?? 0),\n Number.MAX_SAFE_INTEGER - (counts[AlertSeverity.Warning] ?? 0),\n silence.firingAlerts.length,\n ];\n};\n\nconst silenceStateOrder = (silence: Silence) => [\n [SilenceStates.Active, SilenceStates.Pending, SilenceStates.Expired].indexOf(\n silenceState(silence),\n ),\n _.get(silence, silenceState(silence) === SilenceStates.Pending ? 'startsAt' : 'endsAt'),\n];\n\nconst SelectAllCheckbox: React.FC<{ silences: Silence[] }> = ({ silences }) => {\n const { selectedSilences, setSelectedSilences } = React.useContext(SelectedSilencesContext);\n\n const activeSilences = _.filter(silences, (s) => silenceState(s) !== SilenceStates.Expired);\n const isAllSelected =\n activeSilences.length > 0 && _.every(activeSilences, (s) => selectedSilences.has(s.id));\n\n const onChange = React.useCallback(\n (_event, isChecked: boolean) => {\n const ids = isChecked ? activeSilences.map((s) => s.id) : [];\n setSelectedSilences(new Set(ids));\n },\n [activeSilences, setSelectedSilences],\n );\n\n return (\n <Checkbox\n id=\"select-all-silences-checkbox\"\n isChecked={isAllSelected}\n isDisabled={activeSilences.length === 0}\n onChange={onChange}\n />\n );\n};\n\nconst SilencesPage_: React.FC<{}> = () => {\n const { t } = useTranslation();\n const { ns: namespace } = useParams();\n\n const [selectedSilences, setSelectedSilences] = React.useState(new Set());\n const [errorMessage, setErrorMessage] = React.useState();\n\n const [isExactSearch] = useExactSearch();\n const matchFn: Function = isExactSearch ? exactMatch : fuzzyCaseInsensitive;\n\n const { data, loaded = false, loadError }: Silences = useSelector(\n ({ observe }: RootState) => observe.get(namespace ? 'devSilences' : 'silences') || {},\n );\n\n const nameFilter: RowFilter = {\n filter: (filter, silence: Silence) => matchFn(filter.selected?.[0], silence.name),\n items: [],\n type: 'name',\n } as RowFilter;\n\n const rowFilters: RowFilter[] = [\n {\n defaultSelected: [SilenceStates.Active, SilenceStates.Pending],\n filter: (filter, silence: Silence) =>\n filter.selected?.includes(silenceState(silence)) || _.isEmpty(filter.selected),\n filterGroupName: t('public~Silence State'),\n items: [\n { id: SilenceStates.Active, title: t('public~Active') },\n { id: SilenceStates.Pending, title: t('public~Pending') },\n { id: SilenceStates.Expired, title: t('public~Expired') },\n ],\n reducer: silenceState,\n type: 'silence-state',\n },\n ];\n\n const allFilters: RowFilter[] = [nameFilter, ...rowFilters];\n let [staticData, filteredData, onFilterChange] = useListPageFilter(data, allFilters);\n\n if (namespace) {\n filteredData = filteredData?.filter((item) => {\n const matchers = item.matchers;\n const nsMatcher = matchers?.find((m) => m.name === 'namespace');\n return nsMatcher?.value === namespace;\n });\n }\n\n const columns = React.useMemo<TableColumn<Silence>[]>(\n () => [\n {\n id: 'checkbox',\n props: { className: tableSilenceClasses[0] },\n title: (<SelectAllCheckbox silences={filteredData} />) as any,\n },\n {\n id: 'name',\n props: { className: tableSilenceClasses[1] },\n sort: 'name',\n title: t('public~Name'),\n transforms: [sortable],\n },\n {\n id: 'firingAlerts',\n props: { className: tableSilenceClasses[2] },\n sort: (silences: Silence[], direction: 'asc' | 'desc') =>\n _.orderBy(silences, silenceFiringAlertsOrder, [direction]),\n title: t('public~Firing alerts'),\n transforms: [sortable],\n },\n {\n id: 'state',\n props: { className: tableSilenceClasses[3] },\n sort: (silences: Silence[], direction: 'asc' | 'desc') =>\n _.orderBy(silences, silenceStateOrder, [direction]),\n title: t('public~State'),\n transforms: [sortable],\n },\n {\n id: 'createdBy',\n props: { className: tableSilenceClasses[4] },\n sort: 'createdBy',\n title: t('public~Creator'),\n transforms: [sortable],\n },\n {\n id: 'actions',\n props: { className: tableSilenceClasses[5] },\n title: '',\n },\n ],\n [filteredData, t],\n );\n\n return (\n <>\n <Helmet>\n <title>Alerting</title>\n </Helmet>\n <div className=\"co-m-pane__body\">\n <SelectedSilencesContext.Provider value={{ selectedSilences, setSelectedSilences }}>\n <Flex>\n <FlexItem>\n <ListPageFilter\n data={staticData}\n hideLabelFilter\n loaded={loaded}\n onFilterChange={onFilterChange}\n rowFilters={rowFilters}\n />\n </FlexItem>\n <FlexItem>\n <CreateSilenceButton />\n </FlexItem>\n <FlexItem>\n <ExpireAllSilencesButton setErrorMessage={setErrorMessage} />\n </FlexItem>\n </Flex>\n {loadError && (\n <PFAlert\n className=\"co-alert\"\n isInline\n title={t(\n 'public~Error loading silences from Alertmanager. Alertmanager may be unavailable.',\n )}\n variant=\"danger\"\n >\n {typeof loadError === 'string' ? loadError : loadError.message}\n </PFAlert>\n )}\n {errorMessage && (\n <PFAlert className=\"co-alert\" isInline title={t('error')} variant=\"danger\">\n {errorMessage}\n </PFAlert>\n )}\n <div className=\"row\">\n <div className=\"col-xs-12\">\n <VirtualizedTable<Silence>\n aria-label={t('public~Silences')}\n columns={columns}\n data={filteredData ?? []}\n loaded={loaded}\n loadError={loadError}\n Row={SilenceTableRowWithCheckbox}\n unfilteredData={data}\n />\n </div>\n </div>\n </SelectedSilencesContext.Provider>\n </div>\n </>\n );\n};\nexport const SilencesPage = withFallback(SilencesPage_);\n\nconst Tab: React.FC<{ active: boolean; children: React.ReactNode }> = ({ active, children }) => (\n <li\n className={classNames('co-m-horizontal-nav__menu-item', {\n 'co-m-horizontal-nav-item--active': active,\n })}\n >\n {children}\n </li>\n);\n\nconst AlertingPage: React.FC<{}> = () => {\n const { t } = useTranslation();\n\n const alertsPath = '/monitoring/alerts';\n const rulesPath = '/monitoring/alertrules';\n const silencesPath = '/monitoring/silences';\n\n const { pathname: url } = useLocation();\n\n return (\n <>\n <div className=\"co-m-nav-title co-m-nav-title--detail\">\n <h1 className=\"co-m-pane__heading\">\n <div className=\"co-m-pane__name co-resource-item\">\n <span className=\"co-resource-item__resource-name\" data-test-id=\"resource-title\">\n {t('public~Alerting')}\n </span>\n </div>\n </h1>\n </div>\n <ul className=\"co-m-horizontal-nav__menu\">\n <Tab active={url === alertsPath}>\n <Link to={alertsPath}>{t('public~Alerts')}</Link>\n </Tab>\n <Tab active={url === silencesPath}>\n <Link to={silencesPath}>{t('public~Silences')}</Link>\n </Tab>\n <Tab active={url === rulesPath}>\n <Link to={rulesPath}>{t('public~Alerting rules')}</Link>\n </Tab>\n </ul>\n {url === alertsPath && <AlertsPage />}\n {url === rulesPath && <RulesPage />}\n {url === silencesPath && <SilencesPage />}\n </>\n );\n};\n\nconst PollerPages = () => {\n const dispatch = useDispatch();\n\n const [customExtensions] = useResolvedExtensions<AlertingRulesSourceExtension>(\n isAlertingRulesSource,\n );\n\n const alertsSource = React.useMemo(\n () =>\n customExtensions\n .filter((extension) => extension.properties.contextId === 'observe-alerting')\n .map((extension) => extension.properties),\n [customExtensions],\n );\n\n React.useEffect(() => {\n const { prometheusBaseURL } = window.SERVER_FLAGS;\n\n if (prometheusBaseURL) {\n const alertsKey = 'alerts';\n const rulesKey = 'rules';\n dispatch(alertingLoading(alertsKey));\n const url = getPrometheusURL({ endpoint: PrometheusEndpoint.RULES });\n const poller = (): void => {\n fetchAlerts(url, alertsSource)\n .then(({ data }) => {\n const { alerts, rules } = getAlertsAndRules(data);\n dispatch(alertingLoaded(alertsKey, alerts));\n dispatch(alertingSetRules(rulesKey, rules));\n })\n .catch((e) => {\n dispatch(alertingErrored(alertsKey, e));\n })\n .then(() => {\n if (pollerTimeouts[alertsKey]) {\n clearTimeout(pollerTimeouts[alertsKey]);\n }\n pollerTimeouts[alertsKey] = setTimeout(poller, 15 * 1000);\n });\n };\n pollers[alertsKey] = poller;\n poller();\n } else {\n dispatch(alertingErrored('alerts', new Error('prometheusBaseURL not set')));\n }\n return () => _.each(pollerTimeouts, clearTimeout);\n }, [alertsSource, dispatch]);\n\n return (\n <Routes>\n <Route path=\"alerts\" element={<AlertingPage />} />\n <Route path=\"alertrules\" element={<AlertingPage />} />\n <Route path=\"silences\" element={<AlertingPage />} />\n <Route path=\"alertrules/:id\" element={<AlertRulesDetailsPage />} />\n <Route path=\"alerts/:ruleID\" element={<AlertsDetailsPage />} />\n <Route path=\"silences/:id\" element={<SilencesDetailsPage />} />\n <Route path=\"silences/:id/edit\" element={<EditSilence />} />\n </Routes>\n );\n};\n\n// Handles links that have the Prometheus UI's URL format (expected for links in alerts sent by\n// Alertmanager). The Prometheus UI specifies the PromQL query with the GET param `g0.expr`, so we\n// use that if it exists. Otherwise, just go to the query browser page with no query.\nconst PrometheusUIRedirect = () => {\n const params = getURLSearchParams();\n return <Navigate to={`/monitoring/query-browser?query0=${params['g0.expr'] || ''}`} replace />;\n};\n\nexport const MonitoringUI = () => (\n <Routes>\n {/* This redirect also handles the `/monitoring/#/alerts?...` link URLs generated by\n Alertmanager (because the `#` is considered the end of the URL) */}\n <Route path=\"\" element={<Navigate to=\"/monitoring/alerts\" replace />} />\n <Route path=\"alertmanagerconfig\" element={<AlertmanagerConfig />} />\n <Route path=\"alertmanageryaml\" element={<AlertmanagerYAML />} />\n <Route path=\"dashboards\" element={<MonitoringDashboardsPage />} />\n <Route path=\"dashboards/:board\" element={<MonitoringDashboardsPage />} />\n <Route path=\"graph\" element={<PrometheusUIRedirect />} />\n <Route path=\"silences/~new\" element={<CreateSilence />} />\n <Route path=\"targets/*\" element={<TargetsUI />} />\n <Route element={PollerPages} />\n </Routes>\n);\n\ntype AlertStateProps = {\n state: AlertStates;\n};\n\ntype AlertMessageProps = {\n alertText: string;\n labels: PrometheusLabels;\n template: string;\n};\n\ntype GraphProps = {\n filterLabels?: PrometheusLabels;\n formatSeriesTitle?: FormatSeriesTitle;\n namespace?: string;\n query: string;\n ruleDuration: number;\n showLegend?: boolean;\n};\n\ntype MonitoringResourceIconProps = {\n className?: string;\n resource: MonitoringResource;\n};\n","/* eslint-disable tsdoc/syntax */\nimport * as _ from 'lodash-es';\nimport * as React from 'react';\nimport * as classnames from 'classnames';\nimport { Link } from 'react-router-dom-v5-compat';\n\nimport { coFetchJSON } from '../../co-fetch';\nimport { PROMETHEUS_BASE_PATH, PROMETHEUS_TENANCY_BASE_PATH } from '.';\n\nexport const errorStatus = (err) => {\n if (_.get(err.response, 'ok') === false) {\n return {\n short: '?',\n status: '', // Gray\n long: err.message,\n };\n }\n // Generic network error handling.\n return {\n short: 'ERROR',\n long: err.message,\n status: 'ERROR',\n };\n};\n\nconst fetchQuery = (q, long, namespace) => {\n const nsParam = namespace ? `&namespace=${encodeURIComponent(namespace)}` : '';\n const basePath = namespace ? PROMETHEUS_TENANCY_BASE_PATH : PROMETHEUS_BASE_PATH;\n return coFetchJSON(`${basePath}/api/v1/query?query=${encodeURIComponent(q)}${nsParam}`)\n .then((res) => {\n const short = parseInt(_.get(res, 'data.result[0].value[1]'), 10) || 0;\n return {\n short,\n long,\n status: short === 0 ? 'OK' : 'WARN',\n };\n })\n .catch(errorStatus);\n};\n\n/** @augments {React.Component<{fetch?: () => Promise<any>, query?: string, title: string, href?: string, rel?: string, target?: string}}>} */\nexport class Status extends React.Component {\n constructor(props) {\n super(props);\n this.interval = null;\n this.state = {\n status: '...',\n };\n this.clock = 0;\n }\n\n fetch(props = this.props) {\n const clock = this.clock;\n const promise = props.query\n ? fetchQuery(props.query, props.name, props.namespace)\n : props.fetch();\n\n const ignorePromise = (cb) => (...args) => {\n if (clock !== this.clock) {\n return;\n }\n cb(...args);\n };\n promise\n .then(ignorePromise(({ short, long, status }) => this.setState({ short, long, status })))\n .catch(ignorePromise(() => this.setState({ short: 'BAD', long: 'Error', status: 'ERROR' })))\n .then(\n ignorePromise(\n () =>\n (this.interval = setTimeout(() => {\n if (this.isMounted_) {\n this.fetch();\n }\n }, 30000)),\n ),\n );\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n if (_.isEqual(nextProps, this.props)) {\n return;\n }\n this.clock += 1;\n // Don't show stale data if we changed the query.\n this.setState({\n status: '...',\n short: undefined,\n long: undefined,\n });\n this.fetch(nextProps);\n }\n\n UNSAFE_componentWillMount() {\n clearInterval(this.interval);\n this.fetch();\n }\n\n componentWillUnmount() {\n clearInterval(this.interval);\n }\n\n render() {\n const title = this.props.title;\n const { short, long, status } = this.state;\n const shortStatusClassName = classnames('graph-status__short', {\n 'graph-status__short--ok': status === 'OK',\n 'graph-status__short--warn': status === 'WARN',\n 'graph-status__short--error': status === 'ERROR',\n });\n\n const statusElem = (\n <div className=\"graph-wrapper graph-wrapper--title-center graph-wrapper--status\">\n {title && <h5 className=\"graph-title\">{title}</h5>}\n <div className=\"graph-status\">\n <h1 className={shortStatusClassName}>{short}</h1>\n <div className=\"graph-status--long\">{long}</div>\n </div>\n </div>\n );\n const linkProps = _.pick(this.props, ['rel', 'target', 'to']);\n if (_.isEmpty(linkProps)) {\n return statusElem;\n }\n return (\n <Link {...linkProps} className=\"graph-status__link\">\n {statusElem}\n </Link>\n );\n }\n}\n","import * as React from 'react';\nimport { ModalComponent } from '@console/dynamic-plugin-sdk/src/app/modal-support/ModalProvider';\nimport { useModal } from '@console/dynamic-plugin-sdk/src/app/modal-support/useModal';\nimport { UseAnnotationsModal } from '@console/dynamic-plugin-sdk/src/extensions/console-types';\nimport { useK8sModel } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sModel';\nimport { getGroupVersionKindForResource } from '@console/dynamic-plugin-sdk/src/utils/k8s/k8s-ref';\nimport { ModalWrapper } from '@console/internal/components/factory/modal';\nimport { AnnotationsModal, AnnotationsModalProps } from '@console/internal/components/modals/tags';\n\nconst AnnotationsModalComponent: ModalComponent<AnnotationsModalProps> = ({\n closeModal,\n kind,\n resource,\n}) => {\n return (\n <ModalWrapper blocking onClose={closeModal}>\n <AnnotationsModal cancel={closeModal} close={closeModal} kind={kind} resource={resource} />\n </ModalWrapper>\n );\n};\n\nexport const useAnnotationsModal: UseAnnotationsModal = (resource) => {\n const launcher = useModal();\n const groupVersionKind = getGroupVersionKindForResource(resource);\n const [kind] = useK8sModel(groupVersionKind);\n return React.useCallback(\n () =>\n resource &&\n kind &&\n launcher<AnnotationsModalProps>(AnnotationsModalComponent, { kind, resource }),\n [launcher, kind, resource],\n );\n};\n","import * as classNames from 'classnames';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n BlueArrowCircleUpIcon,\n BlueInfoCircleIcon,\n GreenCheckCircleIcon,\n RedExclamationCircleIcon,\n YellowExclamationTriangleIcon,\n} from '@console/shared';\nimport { history, Timestamp, ExternalLink } from '@console/internal/components/utils';\nimport { Button, ButtonVariant } from '@patternfly/react-core';\n\n// eslint-disable-next-line no-shadow\nexport enum NotificationTypes {\n info = 'info',\n warning = 'warning',\n critical = 'danger',\n success = 'success',\n update = 'update',\n}\n\nconst NotificationIcon: React.FC<NotificationIconTypes> = ({ type }) => {\n switch (type) {\n case NotificationTypes.update:\n return <BlueArrowCircleUpIcon />;\n case NotificationTypes.success:\n return <GreenCheckCircleIcon />;\n case NotificationTypes.critical:\n return <RedExclamationCircleIcon />;\n case NotificationTypes.warning:\n return <YellowExclamationTriangleIcon />;\n case NotificationTypes.info:\n default:\n return <BlueInfoCircleIcon />;\n }\n};\n\nconst NotificationAction: React.FC<NotificationActionProps> = ({\n onClick,\n text,\n actionExternalLinkURL,\n}) => {\n return (\n <div className=\"pf-v5-c-notification-drawer__header-action\">\n {actionExternalLinkURL ? (\n <ExternalLink text={text} href={actionExternalLinkURL} />\n ) : (\n <Button\n onClick={(e) => {\n e.stopPropagation();\n onClick(e);\n }}\n variant={ButtonVariant.link}\n isInline\n >\n {text}\n </Button>\n )}\n </div>\n );\n};\n\nconst NotificationEntry: React.FC<NotificationEntryProps> = ({\n alertAction,\n actionPath,\n actionText,\n actionExternalLinkURL,\n title,\n description,\n isRead = false,\n timestamp,\n targetPath,\n toggleNotificationDrawer,\n type,\n}) => {\n const { t } = useTranslation();\n const notificationTypeString = (notificationType: NotificationTypes): string => {\n switch (notificationType) {\n case NotificationTypes.warning:\n return t('notification-drawer~Warning notification:');\n case NotificationTypes.critical:\n return t('notification-drawer~Critical notification:');\n case NotificationTypes.success:\n return t('notification-drawer~Success notification:');\n case NotificationTypes.update:\n return t('notification-drawer~Update notification:');\n default:\n return t('notification-drawer~Info notification:');\n }\n };\n const onClick = () => {\n toggleNotificationDrawer();\n alertAction ? alertAction() : history.push(actionPath);\n };\n return (\n <li\n className={classNames(\n `pf-v5-c-notification-drawer__list-item pf-m-hoverable`,\n type === NotificationTypes.update ? 'pf-m-default' : `pf-m-${type}`,\n {\n 'pf-m-read': isRead,\n },\n )}\n tabIndex={0}\n onClick={\n targetPath\n ? () => {\n history.push(targetPath);\n toggleNotificationDrawer();\n }\n : null\n }\n >\n <div className=\"pf-v5-c-notification-drawer__list-item-header\">\n <span className=\"pf-v5-c-notification-drawer__list-item-header-icon\">\n <NotificationIcon type={type} />\n </span>\n <h4 className=\"pf-v5-c-notification-drawer__list-item-header-title\">\n <span className=\"pf-v5-screen-reader\">{notificationTypeString(type)}</span>\n {title}\n </h4>\n {actionText && (actionPath || alertAction || actionExternalLinkURL) && (\n <NotificationAction\n text={actionText}\n onClick={onClick}\n actionExternalLinkURL={actionExternalLinkURL}\n />\n )}\n </div>\n <div className=\"pf-v5-c-notification-drawer__list-item-description\">{description}</div>\n <div className=\"pf-v5-c-notification-drawer__list-item-timestamp\">\n {timestamp && <Timestamp simple timestamp={timestamp} />}\n </div>\n </li>\n );\n};\n\nexport type NotificationEntryProps = {\n alertAction?: () => void;\n actionText?: string;\n actionPath?: string;\n actionExternalLinkURL?: string;\n description: React.ReactNode;\n isRead?: boolean;\n targetPath?: string;\n timestamp?: string;\n title: string;\n toggleNotificationDrawer?: () => any;\n type: NotificationTypes;\n};\n\ntype NotificationIconTypes = {\n type: NotificationTypes;\n};\n\ntype NotificationActionProps = {\n onClick: (event: React.MouseEvent<HTMLElement>) => void;\n text?: string;\n actionExternalLinkURL?: string;\n};\n\nexport default NotificationEntry;\n","import * as React from 'react';\nimport { WindowScroller, AutoSizer, Size, CellMeasurerCache } from 'react-virtualized';\nimport { VirtualizedGridProps } from '@console/dynamic-plugin-sdk/src/api/internal-types';\nimport { WithScrollContainer } from '@console/internal/components/utils';\nimport Cell from './Cell';\nimport {\n IDEAL_SPACE_BW_TILES,\n IDEAL_CELL_WIDTH,\n DEFAULT_CELL_HEIGHT,\n OVERSCAN_ROW_COUNT,\n HEADER_FIXED_HEIGHT,\n ESTIMATED_ROW_SIZE,\n} from './const';\nimport Grid from './Grid';\nimport GroupByFilterGrid from './GroupByFilterGrid';\nimport { Item, GroupedItems, GridChildrenProps } from './types';\nimport { CellMeasurementContext } from './utils';\n\nconst VirtualizedGrid: React.FC<VirtualizedGridProps> = ({\n items,\n className,\n isItemsGrouped = false,\n cellMargin = IDEAL_SPACE_BW_TILES,\n cellWidth = IDEAL_CELL_WIDTH,\n celldefaultHeight = DEFAULT_CELL_HEIGHT,\n overscanRowCount = OVERSCAN_ROW_COUNT,\n headerHeight = HEADER_FIXED_HEIGHT,\n estimatedCellHeight = ESTIMATED_ROW_SIZE,\n renderCell,\n renderHeader,\n}) => {\n const cache: CellMeasurerCache = new CellMeasurerCache({\n defaultHeight: celldefaultHeight,\n minHeight: 200,\n fixedWidth: true,\n });\n return (\n <CellMeasurementContext.Provider\n value={{\n cache,\n cellMargin,\n cellWidth,\n overscanRowCount,\n headerHeight,\n estimatedCellHeight,\n className,\n }}\n >\n <WithScrollContainer>\n {(scrollElement) => (\n <WindowScroller scrollElement={scrollElement ?? window}>\n {({ registerChild, ...props }) => (\n <AutoSizer disableHeight>\n {({ width }: Size) => (\n <div ref={registerChild}>\n {isItemsGrouped ? (\n <GroupByFilterGrid {...props} width={width} items={items as GroupedItems}>\n {(gridProps: GridChildrenProps) => {\n const {\n data: { key, style },\n } = gridProps;\n return (\n <Cell\n {...gridProps}\n key={key}\n style={style}\n renderHeader={renderHeader}\n renderCell={renderCell}\n />\n );\n }}\n </GroupByFilterGrid>\n ) : (\n <Grid {...props} width={width} items={items as Item[]}>\n {(gridProps: GridChildrenProps) => {\n const {\n data: { key, style },\n } = gridProps;\n return (\n <Cell {...gridProps} key={key} style={style} renderCell={renderCell} />\n );\n }}\n </Grid>\n )}\n </div>\n )}\n </AutoSizer>\n )}\n </WindowScroller>\n )}\n </WithScrollContainer>\n </CellMeasurementContext.Provider>\n );\n};\n\nexport default VirtualizedGrid;\n","import * as React from 'react';\nimport { ChartDonut } from '@patternfly/react-charts';\nimport { Stack, StackItem, pluralize } from '@patternfly/react-core';\nimport { ExclamationTriangleIcon } from '@patternfly/react-icons/dist/esm/icons/exclamation-triangle-icon';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { WatchK8sResults } from '@console/dynamic-plugin-sdk';\nimport { ExternalLink } from '@console/internal/components/utils/link';\nimport { referenceForModel } from '@console/internal/module/k8s';\nimport { ResourceHealthHandler } from '@console/plugin-sdk';\nimport { HealthState } from '@console/shared/src/components/dashboard/status-card/states';\nimport { vulnPriority, priorityFor } from '../const';\nimport { ImageManifestVulnModel } from '../models';\nimport { ImageManifestVuln, WatchImageVuln } from '../types';\n\nexport const securityHealthHandler: ResourceHealthHandler<WatchImageVuln> = ({\n imageManifestVuln,\n}) => {\n const { data, loaded, loadError } = imageManifestVuln;\n\n if (loadError) {\n return { state: HealthState.UNKNOWN, message: 'Not available' };\n }\n if (!loaded) {\n return {\n state: HealthState.LOADING,\n message: 'Scanning in progress',\n };\n }\n if (!_.isEmpty(data)) {\n return {\n state: HealthState.ERROR,\n message: pluralize(data.length, 'vulnerable image'),\n };\n }\n return { state: HealthState.OK, message: '0 vulnerable images' };\n};\n\nexport const quayURLFor = (vuln: ImageManifestVuln) =>\n // The first part of the url is the base\n vuln?.spec?.image\n ? `//${vuln.spec.image\n .replace('@sha256', '')\n .split('/')\n .reduce((url, part, i) => [...url, part, ...(i === 0 ? ['repository'] : [])], [])\n .join('/')}/manifest/${vuln.spec?.manifest}?tab=vulnerabilities`\n : '';\n\nexport const SecurityBreakdownPopup: React.FC<SecurityBreakdownPopupProps> = ({\n imageManifestVuln,\n namespace,\n}) => {\n const { t } = useTranslation();\n const resource = imageManifestVuln.data;\n const vulnsFor = (severity: string) =>\n resource.filter((v) => v.status?.highestSeverity === severity);\n const fixableVulns = resource\n .filter((v) => v.status?.fixableCount > 0)\n .reduce((all, v) => all.set(v.metadata.name, v), new Map<string, ImageManifestVuln>());\n const getVulnerabilityCountText = (v: ImageManifestVuln): string => {\n const {\n fixableCount = 0,\n highCount = 0,\n mediumCount = 0,\n lowCount = 0,\n unknownCount = 0,\n } = v.status;\n const totalCount = highCount + mediumCount + lowCount + unknownCount;\n return t('container-security~{{fixableCount, number}} of {{totalCount, number}} fixable', {\n fixableCount,\n totalCount,\n });\n };\n const imageNameClamped = (imageName: string): string =>\n imageName.length > 25 ? `${imageName.slice(0, 25)}...` : imageName;\n const baseVulnListUrl = namespace\n ? `/k8s/cluster/projects/${namespace}/vulnerabilities`\n : `/k8s/all-namespaces/${referenceForModel(ImageManifestVulnModel)}`;\n const vulnDetailsUrl = `/k8s/ns/${namespace}/${referenceForModel(ImageManifestVulnModel)}`;\n\n return (\n <Stack hasGutter data-test=\"vul popup\">\n <StackItem>\n {namespace\n ? t(\n `container-security~This project's container images from Quay are analyzed to identify vulnerabilities. Images from other registries are not scanned.`,\n )\n : t(\n 'container-security~Container images from Quay are analyzed to identify vulnerabilities. Images from other registries are not scanned.',\n )}\n </StackItem>\n {!_.isEmpty(resource) ? (\n <>\n <StackItem>\n <div className=\"co-status-popup__row\">\n <div className=\"co-status-popup__text--bold\">\n {t('container-security~Vulnerable Container Images')}\n </div>\n </div>\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <div style={{ width: '66%', marginRight: '24px' }}>\n {vulnPriority\n .map((priority) =>\n !_.isEmpty(vulnsFor(priority.value)) ? (\n <div className=\"co-status-popup__row\" key={priority.value}>\n <div>\n <ExclamationTriangleIcon\n color={priority.color.value}\n title={priority.title}\n />\n \n {vulnsFor(priority.value).length} {priority.title}\n </div>\n </div>\n ) : null,\n )\n .toArray()}\n </div>\n <div>\n <Link to={baseVulnListUrl} aria-label={t('container-security~View all')}>\n <ChartDonut\n colorScale={vulnPriority.map((priority) => priority.color.value).toArray()}\n data={vulnPriority\n .map((priority) => ({\n label: priority.title,\n x: priority.value,\n y: vulnsFor(priority.value).length,\n }))\n .toArray()}\n title={t('container-security~{{vulnImageCount, number}} total', {\n vulnImageCount: resource.length,\n })}\n />\n </Link>\n </div>\n </div>\n </StackItem>\n {!_.isEmpty(fixableVulns) && (\n <StackItem>\n <div className=\"co-status-popup__row\">\n <div>\n <span className=\"co-status-popup__text--bold\">\n {t('container-security~Fixable Container Images')}\n </span>\n <span className=\"text-secondary\">\n \n {t('container-security~{{vulnImageCount, number}} total', {\n vulnImageCount: fixableVulns.size,\n })}\n </span>\n </div>\n </div>\n <div className=\"co-status-popup__row\">\n <span className=\"co-status-popup__text--bold\">\n {namespace ? t('container-security~Image') : t('container-security~Impact')}\n </span>\n <span className=\"co-status-popup__text--bold\">\n {t('container-security~Vulnerabilities')}\n </span>\n </div>\n {_.sortBy(_.take([...fixableVulns.values()], 5), [\n (v) => priorityFor(v.status?.highestSeverity).index,\n ]).map((v, key) => (\n <div className=\"co-status-popup__row\" key={v.metadata.name}>\n <span>\n <ExclamationTriangleIcon\n color={priorityFor(v.status?.highestSeverity).color.value}\n />{' '}\n <Link\n to={\n namespace\n ? `${vulnDetailsUrl}/${v.metadata.name}`\n : `${baseVulnListUrl}?name=${v.metadata.name}`\n }\n data-test={`vuln-${key}`}\n >\n {namespace\n ? imageNameClamped(v.spec.image)\n : pluralize(\n resource.filter(({ metadata }) => metadata.name === v.metadata.name)\n .length,\n 'namespace',\n )}\n </Link>\n </span>\n <div className=\"text-secondary\">\n {quayURLFor(v) ? (\n <ExternalLink href={quayURLFor(v)} text={getVulnerabilityCountText(v)} />\n ) : (\n <span className=\"small text-muted\">-</span>\n )}\n </div>\n </div>\n ))}\n <div className=\"co-status-popup__row\">\n <Link\n to={{\n pathname: baseVulnListUrl,\n search: '?orderBy=desc&sortBy=Fixable',\n }}\n data-test=\"view-all\"\n >\n {t('container-security~View all')}\n </Link>\n </div>\n </StackItem>\n )}\n </>\n ) : (\n <StackItem>\n <span className=\"text-secondary\">\n {t('container-security~No vulnerabilities detected.')}\n </span>\n </StackItem>\n )}\n </Stack>\n );\n};\n\nexport type SecurityBreakdownPopupProps = WatchK8sResults<WatchImageVuln> & { namespace?: string };\n\nSecurityBreakdownPopup.displayName = 'SecurityBreakdownPopup';\n","import * as React from 'react';\nimport {\n Tabs,\n Tab,\n TabProps,\n TabTitleText,\n TabContent,\n TabContentProps,\n} from '@patternfly/react-core';\nimport Helmet from 'react-helmet';\nimport { useTranslation } from 'react-i18next';\nimport { useParams } from 'react-router-dom-v5-compat';\nimport {\n useResolvedExtensions,\n UserPreferenceGroup,\n isUserPreferenceGroup,\n UserPreferenceItem,\n isUserPreferenceItem,\n} from '@console/dynamic-plugin-sdk';\nimport { LoadingBox, history } from '@console/internal/components/utils';\nimport { useExtensions } from '@console/plugin-sdk/src';\nimport {\n isModifiedEvent,\n orderExtensionBasedOnInsertBeforeAndAfter,\n PageLayout,\n useQueryParams,\n Spotlight,\n} from '@console/shared';\nimport { USER_PREFERENCES_BASE_URL } from './const';\nimport {\n UserPreferenceTabGroup,\n ResolvedUserPreferenceItem,\n ResolvedUserPreferenceGroup,\n} from './types';\nimport UserPreferenceForm from './UserPreferenceForm';\nimport { getUserPreferenceGroups } from './utils/getUserPreferenceGroups';\nimport './UserPreferencePage.scss';\n\nconst UserPreferencePage: React.FC = () => {\n // resources and calls to hooks\n const { t } = useTranslation();\n\n const userPreferenceGroupExtensions = useExtensions<UserPreferenceGroup>(isUserPreferenceGroup);\n const sortedUserPreferenceGroups = orderExtensionBasedOnInsertBeforeAndAfter<\n ResolvedUserPreferenceGroup\n >(userPreferenceGroupExtensions.map(({ properties }) => properties));\n\n const [userPreferenceItemExtensions, userPreferenceItemResolved] = useResolvedExtensions<\n UserPreferenceItem\n >(isUserPreferenceItem);\n const sortedUserPreferenceItems = orderExtensionBasedOnInsertBeforeAndAfter<\n ResolvedUserPreferenceItem\n >(userPreferenceItemExtensions.map(({ properties }) => properties));\n\n // fetch the default user preference group from the url params if available\n const { group: groupIdFromUrl } = useParams();\n const initialTabId =\n sortedUserPreferenceGroups.find((extension) => extension.id === groupIdFromUrl)?.id ||\n sortedUserPreferenceGroups[0]?.id;\n const [activeTabId, setActiveTabId] = React.useState<string>(initialTabId);\n\n const [userPreferenceTabs, userPreferenceTabContents] = React.useMemo<\n [React.ReactElement<TabProps>[], React.ReactElement<TabContentProps>[]]\n >(() => {\n const populatedUserPreferenceGroups: UserPreferenceTabGroup[] = getUserPreferenceGroups(\n sortedUserPreferenceGroups,\n sortedUserPreferenceItems,\n );\n const [tabs, tabContents] = populatedUserPreferenceGroups.reduce(\n (acc, currGroup) => {\n const { id, label, items } = currGroup;\n const ref = React.createRef<HTMLElement>();\n acc[0].push(\n <Tab\n key={id}\n eventKey={id}\n title={<TabTitleText>{label}</TabTitleText>}\n href={`${USER_PREFERENCES_BASE_URL}/${id}`}\n tabContentId={id}\n tabContentRef={ref}\n data-test={`tab ${id}`}\n />,\n );\n acc[1].push(\n <TabContent\n key={id}\n eventKey={id}\n id={id}\n ref={ref}\n hidden={id !== activeTabId}\n data-test={`tab-content ${id}`}\n >\n <UserPreferenceForm items={items} />\n </TabContent>,\n );\n return acc;\n },\n [[], []],\n );\n return [tabs, tabContents];\n }, [activeTabId, sortedUserPreferenceGroups, sortedUserPreferenceItems]);\n\n const queryParams = useQueryParams();\n const spotlight = decodeURIComponent(queryParams.get('spotlight'));\n const [spotlightElement, setSpotlightElement] = React.useState<Element>(null);\n\n React.useEffect(() => {\n setActiveTabId(groupIdFromUrl ?? 'general');\n const element = document.querySelector(spotlight);\n setSpotlightElement(element);\n }, [groupIdFromUrl, spotlight, userPreferenceItemResolved, userPreferenceTabContents]);\n\n // utils and callbacks\n const handleTabClick = (event: React.MouseEvent<HTMLElement>, eventKey: string) => {\n if (isModifiedEvent(event)) {\n return;\n }\n event.preventDefault();\n setActiveTabId(eventKey);\n history.replace(`${USER_PREFERENCES_BASE_URL}/${eventKey}`);\n };\n const activeTab = sortedUserPreferenceGroups.find((group) => group.id === activeTabId)?.label;\n return (\n <div className=\"co-user-preference-page\">\n <Helmet>\n <title>\n {activeTab\n ? t('console-app~User Preferences {{activeTab}}', { activeTab })\n : t('console-app~User Preferences')}\n </title>\n </Helmet>\n <PageLayout\n title={t('console-app~User Preferences')}\n hint={t(\n 'console-app~Set your individual preferences for the console experience. Any changes will be autosaved.',\n )}\n >\n {userPreferenceItemResolved ? (\n <div className=\"co-user-preference-page-content\">\n <div className=\"co-user-preference-page-content__tabs\">\n <Tabs\n activeKey={activeTabId}\n onSelect={handleTabClick}\n isVertical\n variant=\"light300\"\n data-test=\"user-preferences tabs\"\n >\n <>{userPreferenceTabs}</>\n </Tabs>\n </div>\n <div className=\"co-user-preference-page-content__tab-content\">\n {userPreferenceTabContents}\n {spotlight && spotlightElement && <Spotlight selector={spotlight} interactive />}\n </div>\n </div>\n ) : (\n <LoadingBox />\n )}\n </PageLayout>\n </div>\n );\n};\n\nexport default UserPreferencePage;\n","import {\n LAST_NAMESPACE_NAME_USER_SETTINGS_KEY,\n LAST_NAMESPACE_NAME_LOCAL_STORAGE_KEY,\n} from '@console/shared/src/constants';\nimport { useUserSettingsCompatibility } from '@console/shared/src/hooks/useUserSettingsCompatibility';\n\nexport const useLastNamespace = (): [\n string,\n React.Dispatch<React.SetStateAction<string>>,\n boolean,\n] => {\n const [lastNamespace, setLastNamespace, lastNamespaceLoaded] = useUserSettingsCompatibility<\n string\n >(LAST_NAMESPACE_NAME_USER_SETTINGS_KEY, LAST_NAMESPACE_NAME_LOCAL_STORAGE_KEY);\n\n // This toString is workaround because the useUserSettings hook returns a number or boolean\n // when the saved value represents a number (1234) or boolean (true/false).\n // This is a workaround for https://bugzilla.redhat.com/show_bug.cgi?id=2009345.\n // We will implement a more generic fix with https://issues.redhat.com/browse/ODC-6514\n return [lastNamespace?.toString(), setLastNamespace, lastNamespaceLoaded];\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { k8sPatch } from '@console/dynamic-plugin-sdk/src/utils/k8s/k8s-resource';\nimport { K8sModel } from '@console/dynamic-plugin-sdk/src/api/common-types';\nimport { K8sResourceCommon } from '@console/dynamic-plugin-sdk/src/extensions/console-types';\nimport {\n createModalLauncher,\n ModalTitle,\n ModalBody,\n ModalSubmitFooter,\n ModalComponentProps,\n} from '../factory/modal';\nimport { NameValueEditorPair } from '../utils/types';\nimport { withHandlePromise, HandlePromiseProps } from '../utils/promise-component';\nimport { AsyncComponent } from '../utils/async';\nimport { useK8sWatchResource } from '../utils/k8s-watch-hook';\n\n/**\n * Set up an AsyncComponent to wrap the name-value-editor to allow on demand loading to reduce the\n * vendor footprint size.\n */\nconst NameValueEditorComponent = (props) => (\n <AsyncComponent\n loader={() => import('../utils/name-value-editor').then((c) => c.NameValueEditor)}\n {...props}\n />\n);\n\nexport const TagsModal = withHandlePromise<TagsModalProps & HandlePromiseProps>((props) => {\n // Track tags as an array instead of an object / Map so we can preserve the order during editing and so we can have\n // duplicate keys during editing. However, the ordering and any duplicate keys are lost when the form is submitted.\n const [tags, setTags] = React.useState(\n _.isEmpty(props.tags) ? [['', '']] : _.toPairs(props.tags),\n );\n const [errorMessage, setErrorMessage] = React.useState(props.errorMessage);\n const [watchedResource, watchedResourceLoaded] = useK8sWatchResource<K8sResourceCommon>({\n kind: props.resource?.kind,\n name: props.resource?.metadata?.name,\n namespace: props.resource?.metadata?.namespace,\n });\n const [stale, setStale] = React.useState(false);\n const { t } = useTranslation();\n\n React.useEffect(() => {\n if (watchedResourceLoaded && !_.isEmpty(watchedResource)) {\n setStale(!_.isEqual(props.tags, watchedResource?.metadata?.annotations));\n }\n }, [props.tags, watchedResource, watchedResourceLoaded]);\n\n const submit = (e) => {\n e.preventDefault();\n\n // We just throw away any rows where the key is blank\n const usedTags = _.reject(tags, (tag) => _.isEmpty(tag[NameValueEditorPair.Name]));\n\n const keys = usedTags.map((tag) => tag[NameValueEditorPair.Name]);\n if (_.uniq(keys).length !== keys.length) {\n setErrorMessage(t('public~Duplicate keys found.'));\n return;\n }\n // Make sure to 'add' if the path does not already exist, otherwise the patch request will fail\n const op = props.tags ? 'replace' : 'add';\n const patch = [{ path: props.path, op, value: _.fromPairs(usedTags) }];\n const promise = k8sPatch(props.kind, props.resource, patch);\n props.handlePromise(promise, props.close);\n };\n\n return (\n <form onSubmit={submit} className=\"modal-content\">\n <ModalTitle>{t(props.titleKey)}</ModalTitle>\n <ModalBody>\n <NameValueEditorComponent\n nameValuePairs={tags}\n submit={submit}\n updateParentData={({ nameValuePairs }) => setTags(nameValuePairs)}\n />\n </ModalBody>\n <ModalSubmitFooter\n submitText={t('public~Save')}\n submitDisabled={stale}\n cancel={props.cancel}\n errorMessage={props.errorMessage || errorMessage}\n message={\n stale\n ? t('public~Annotations have been updated. Click Cancel and reapply your changes.')\n : undefined\n }\n inProgress={props.inProgress}\n />\n </form>\n );\n});\n\nexport const AnnotationsModal: React.FC<AnnotationsModalProps> = (props) => (\n <TagsModal\n path=\"/metadata/annotations\"\n tags={props.resource?.metadata?.annotations}\n // t('public~Edit annotations')\n titleKey=\"public~Edit annotations\"\n {...props}\n />\n);\n\nexport const annotationsModalLauncher = createModalLauncher<AnnotationsModalProps>(\n AnnotationsModal,\n);\n\nTagsModal.displayName = 'TagsModal';\n\nexport type TagsModalProps = {\n kind: K8sModel;\n path: string;\n resource: K8sResourceCommon;\n tags?: { [key: string]: string };\n titleKey: string;\n} & ModalComponentProps;\n\nexport type AnnotationsModalProps = Omit<TagsModalProps, 'path' | 'tags' | 'titleKey'>;\n","import i18next from 'i18next';\n\nexport const displayDurationInWords = (start: string, stop: string): string => {\n if (!start) {\n return '-';\n }\n const startTime = new Date(start).getTime();\n const stopTime = stop ? new Date(stop).getTime() : new Date().getTime();\n let duration = Math.round((stopTime - startTime) / 1000);\n const time = [];\n let durationInWords = '';\n while (duration >= 60) {\n time.push(duration % 60);\n duration = Math.floor(duration / 60);\n }\n time.push(duration);\n if (time[2]) {\n durationInWords += `${time[2]} ${\n time[2] > 1 ? i18next.t('public~hours') : i18next.t('public~hour')\n } `;\n }\n if (time[1]) {\n durationInWords += `${time[1]} ${\n time[1] > 1 ? i18next.t('public~minutes') : i18next.t('public~minute')\n } `;\n }\n if (time[0]) {\n durationInWords += `${time[0]} ${\n time[0] > 1 ? i18next.t('public~seconds') : i18next.t('public~second')\n } `;\n }\n return durationInWords.trim();\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { Alert } from '@patternfly/react-core';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router-dom-v5-compat';\n\nimport { createModalLauncher, ModalTitle, ModalBody, ModalSubmitFooter } from '../factory/modal';\nimport { resourceListPathFromModel, withHandlePromise, HandlePromiseProps } from '../utils';\nimport {\n k8sKill,\n k8sList,\n referenceForOwnerRef,\n K8sResourceKind,\n K8sModel,\n K8sResourceCommon,\n OwnerReference,\n} from '../../module/k8s/';\nimport { YellowExclamationTriangleIcon } from '@console/shared';\nimport { ClusterServiceVersionModel } from '@console/operator-lifecycle-manager/src/models';\nimport { findOwner } from '../../module/k8s/managed-by';\nimport { ResourceLink } from '../utils/resource-link';\nimport { LocationDescriptor } from 'history';\n\n//Modal for resource deletion and allows cascading deletes if propagationPolicy is provided for the enum\nexport const DeleteModal = withHandlePromise((props: DeleteModalProps & HandlePromiseProps) => {\n const navigate = useNavigate();\n const [isChecked, setIsChecked] = React.useState(true);\n const [isDeleteOtherResourcesChecked, setIsDeleteOtherResourcesChecked] = React.useState(true);\n const [owner, setOwner] = React.useState<OwnerReference>(undefined);\n\n const { t } = useTranslation();\n\n const submit = (event) => {\n event.preventDefault();\n const { kind, resource, deleteAllResources } = props;\n\n //https://kubernetes.io/docs/concepts/workloads/controllers/garbage-collection/\n const propagationPolicy = isChecked && kind ? kind.propagationPolicy : 'Orphan';\n const json = propagationPolicy\n ? { kind: 'DeleteOptions', apiVersion: 'v1', propagationPolicy }\n : undefined;\n\n props.handlePromise(k8sKill(kind, resource, {}, {}, json), () => {\n props?.close && props.close();\n\n if (deleteAllResources && isDeleteOtherResourcesChecked) {\n deleteAllResources();\n }\n\n // If we are currently on the deleted resource's page, redirect to the resource list page\n const re = new RegExp(`/${resource?.metadata?.name}(/|$)`);\n if (re.test(window.location.pathname)) {\n const listPath = props.redirectTo\n ? props.redirectTo\n : resourceListPathFromModel(kind, _.get(resource, 'metadata.namespace'));\n navigate(listPath);\n }\n });\n };\n\n React.useEffect(() => {\n const { resource } = props;\n const namespace = resource?.metadata?.namespace;\n if (!namespace || !resource?.metadata?.ownerReferences?.length) {\n return;\n }\n k8sList(ClusterServiceVersionModel, { ns: namespace })\n .then((data) => {\n const resourceOwner = findOwner(props.resource, data);\n resourceOwner && setOwner(resourceOwner);\n })\n .catch((e) => {\n // eslint-disable-next-line no-console\n console.error('Could not fetch CSVs', e);\n });\n });\n\n const { kind, resource, message, errorMessage } = props;\n return (\n <form onSubmit={submit} name=\"form\" className=\"modal-content\">\n <ModalTitle>\n <YellowExclamationTriangleIcon className=\"co-icon-space-r\" />{' '}\n {t('public~Delete {{kind}}?', {\n kind: kind ? (kind.labelKey ? t(kind.labelKey) : kind.label) : '',\n })}\n </ModalTitle>\n <ModalBody className=\"modal-body\">\n {message}\n <div>\n {_.has(resource.metadata, 'namespace') ? (\n <Trans t={t} ns=\"public\">\n Are you sure you want to delete{' '}\n <strong className=\"co-break-word\">\n {{ resourceName: resource?.metadata?.name }}\n </strong>{' '}\n in namespace <strong>{{ namespace: resource?.metadata?.namespace }}</strong>?\n </Trans>\n ) : (\n <Trans t={t} ns=\"public\">\n Are you sure you want to delete{' '}\n <strong className=\"co-break-word\">\n {{ resourceName: resource?.metadata?.name }}\n </strong>\n ?\n </Trans>\n )}\n {_.has(kind, 'propagationPolicy') && (\n <div className=\"checkbox\">\n <label className=\"control-label\">\n <input\n type=\"checkbox\"\n onChange={() => setIsChecked(!isChecked)}\n checked={!!isChecked}\n />\n {t('public~Delete dependent objects of this resource')}\n </label>\n </div>\n )}\n {props.deleteAllResources && (\n <div className=\"checkbox\">\n <label className=\"control-label\">\n <input\n type=\"checkbox\"\n onChange={() => setIsDeleteOtherResourcesChecked(!isDeleteOtherResourcesChecked)}\n checked={!!isDeleteOtherResourcesChecked}\n />\n {t('public~Delete other resources created by console')}\n </label>\n </div>\n )}\n {owner && (\n <Alert\n className=\"co-alert co-alert--margin-top\"\n isInline\n variant=\"warning\"\n title={t('public~Managed resource')}\n >\n <Trans t={t} ns=\"public\">\n This resource is managed by{' '}\n <ResourceLink\n className=\"modal__inline-resource-link\"\n inline\n kind={referenceForOwnerRef(owner)}\n name={owner.name}\n namespace={resource.metadata.namespace}\n onClick={props.cancel}\n />{' '}\n and any modifications may be overwritten. Edit the managing resource to preserve\n changes.\n </Trans>\n </Alert>\n )}\n </div>\n </ModalBody>\n <ModalSubmitFooter\n errorMessage={errorMessage}\n inProgress={false}\n submitDanger\n submitText={props.btnText || t('public~Delete')}\n cancel={props.cancel}\n />\n </form>\n );\n});\n\nexport const deleteModal = createModalLauncher(DeleteModal);\n\nexport type DeleteModalProps = {\n kind: K8sModel;\n resource: K8sResourceCommon;\n close?: () => void;\n redirectTo?: LocationDescriptor;\n message?: JSX.Element;\n cancel?: () => void;\n btnText?: React.ReactNode;\n deleteAllResources?: () => Promise<K8sResourceKind[]>;\n};\n","import classNames from 'classnames';\nimport * as _ from 'lodash-es';\nimport {\n PrometheusEndpoint,\n RedExclamationCircleIcon,\n useResolvedExtensions,\n} from '@console/dynamic-plugin-sdk';\nimport {\n Button,\n Label,\n Card as PFCard,\n CardBody,\n CardHeader,\n CardTitle,\n Tooltip,\n} from '@patternfly/react-core';\nimport {\n Select as SelectDeprecated,\n SelectOption as SelectOptionDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { AngleDownIcon } from '@patternfly/react-icons/dist/esm/icons/angle-down-icon';\nimport { AngleRightIcon } from '@patternfly/react-icons/dist/esm/icons/angle-right-icon';\nimport * as React from 'react';\nimport { Helmet } from 'react-helmet';\nimport { useTranslation } from 'react-i18next';\nimport { useParams, Link, useNavigate } from 'react-router-dom-v5-compat';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Map as ImmutableMap } from 'immutable';\n\nimport { ErrorBoundaryFallbackPage, withFallback } from '@console/shared/src/components/error';\nimport ErrorAlert from '@console/shared/src/components/alerts/error';\nimport Dashboard from '@console/shared/src/components/dashboard/Dashboard';\n\nimport {\n DashboardsClearVariables,\n dashboardsPatchAllVariables,\n dashboardsPatchVariable,\n dashboardsSetEndTime,\n dashboardsSetPollInterval,\n dashboardsSetTimespan,\n dashboardsVariableOptionsLoaded,\n queryBrowserDeleteAllQueries,\n} from '../../../actions/observe';\nimport { RootState } from '../../../redux';\nimport { getPrometheusURL } from '../../graphs/helpers';\nimport {\n getQueryArgument,\n LoadingInline,\n removeQueryArgument,\n setQueryArgument,\n setQueryArguments,\n useSafeFetch,\n} from '../../utils';\nimport IntervalDropdown from '../poll-interval-dropdown';\nimport BarChart from './bar-chart';\nimport Graph from './graph';\nimport SingleStat from './single-stat';\nimport Table from './table';\nimport TimespanDropdown from './timespan-dropdown';\nimport {\n MONITORING_DASHBOARDS_DEFAULT_TIMESPAN,\n MONITORING_DASHBOARDS_VARIABLE_ALL_OPTION_KEY,\n Panel,\n Row,\n TimeDropdownsProps,\n} from './types';\nimport { useBoolean } from '../hooks/useBoolean';\nimport { useIsVisible } from '../hooks/useIsVisible';\nimport { useFetchDashboards } from './useFetchDashboards';\nimport {\n DEFAULT_GRAPH_SAMPLES,\n getActivePerspective,\n getAllVariables,\n} from './monitoring-dashboard-utils';\n\nimport {\n isDataSource,\n DataSource as DataSourceExtension,\n CustomDataSource,\n} from '@console/dynamic-plugin-sdk/src/extensions/dashboard-data-source';\n\nconst intervalVariableRegExps = ['__interval', '__rate_interval', '__auto_interval_[a-z]+'];\n\nconst isIntervalVariable = (itemKey: string): boolean =>\n _.some(intervalVariableRegExps, (re) => itemKey?.match(new RegExp(`\\\\$${re}`, 'g')));\n\nconst evaluateTemplate = (\n template: string,\n variables: ImmutableMap<string, Variable>,\n timespan: number,\n): string => {\n if (_.isEmpty(template)) {\n return undefined;\n }\n\n const range: Variable = { value: `${Math.floor(timespan / 1000)}s` };\n const allVariables = {\n ...variables.toJS(),\n __range: range,\n /* eslint-disable camelcase */\n __range_ms: range,\n __range_s: range,\n /* eslint-enable camelcase */\n };\n\n // Handle the special \"interval\" variables\n const intervalMS = timespan / DEFAULT_GRAPH_SAMPLES;\n const intervalMinutes = Math.floor(intervalMS / 1000 / 60);\n // Use a minimum of 5m to make sure we have enough data to perform `irate` calculations, which\n // require 2 data points each. Otherwise, there could be gaps in the graph.\n const interval: Variable = { value: `${Math.max(intervalMinutes, 5)}m` };\n // Add these last to ensure they are applied after other variable substitutions (because the other\n // variable substitutions may result in interval variables like $__interval being inserted)\n intervalVariableRegExps.forEach((k) => (allVariables[k] = interval));\n\n let result = template;\n _.each(allVariables, (v, k) => {\n const re = new RegExp(`\\\\$${k}`, 'g');\n if (result.match(re)) {\n if (v.isLoading) {\n result = undefined;\n return false;\n }\n const replacement =\n v.value === MONITORING_DASHBOARDS_VARIABLE_ALL_OPTION_KEY ? '.+' : v.value || '';\n result = result.replace(re, replacement);\n }\n });\n\n return result;\n};\n\nconst NamespaceContext = React.createContext('');\n\nconst FilterSelect: React.FC<FilterSelectProps> = ({\n items,\n onChange,\n OptionComponent,\n selectedKey,\n}) => {\n const { t } = useTranslation();\n\n const [isOpen, , open, close] = useBoolean(false);\n const [filterText, setFilterText] = React.useState<string>();\n\n const onSelect = (e, v: string): void => {\n onChange(v);\n close();\n setFilterText(undefined);\n };\n\n const onToggle = (_event, isExpanded: boolean) => {\n if (isExpanded) {\n open();\n } else {\n close();\n setFilterText(undefined);\n }\n };\n\n // filterText is lower-cased before being saved in state\n const filteredItems = filterText\n ? _.pickBy(items, (v) => v.toLowerCase().includes(filterText))\n : items;\n\n return (\n <SelectDeprecated\n className=\"monitoring-dashboards__variable-dropdown\"\n hasInlineFilter={_.size(items) > 1}\n inlineFilterPlaceholderText={t('public~Filter options')}\n isOpen={isOpen}\n onFilter={() => null}\n onSelect={onSelect}\n onToggle={onToggle}\n onTypeaheadInputChanged={(v) => setFilterText(v.toLowerCase())}\n placeholderText={\n Object.keys(items).includes(selectedKey) ? (\n isIntervalVariable(selectedKey) ? (\n 'Auto interval'\n ) : (\n items[selectedKey]\n )\n ) : (\n <>\n <RedExclamationCircleIcon /> {t('public~Select a dashboard from the dropdown')}\n </>\n )\n }\n >\n {_.map(filteredItems, (v, k) => (\n <OptionComponent key={k} itemKey={k} />\n ))}\n </SelectDeprecated>\n );\n};\n\nconst VariableOption = ({ itemKey }) =>\n isIntervalVariable(itemKey) ? (\n <Tooltip content={itemKey}>\n <SelectOptionDeprecated key={itemKey} value={itemKey}>\n Auto interval\n </SelectOptionDeprecated>\n </Tooltip>\n ) : (\n <SelectOptionDeprecated key={itemKey} value={itemKey}>\n {itemKey === MONITORING_DASHBOARDS_VARIABLE_ALL_OPTION_KEY ? 'All' : itemKey}\n </SelectOptionDeprecated>\n );\n\nconst VariableDropdown: React.FC<VariableDropdownProps> = ({ id, name, namespace }) => {\n const { t } = useTranslation();\n\n const activePerspective = getActivePerspective(namespace);\n\n const timespan = useSelector(({ observe }: RootState) =>\n observe.getIn(['dashboards', activePerspective, 'timespan']),\n );\n\n const variables = useSelector(({ observe }: RootState) =>\n observe.getIn(['dashboards', activePerspective, 'variables']),\n );\n const variable = variables.toJS()[name];\n const query = evaluateTemplate(variable.query, variables, timespan);\n\n const dispatch = useDispatch();\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const safeFetch = React.useCallback(useSafeFetch(), []);\n\n const [isError, setIsError] = React.useState(false);\n\n const customDataSourceName = variable?.datasource?.name;\n const [extensions] = useResolvedExtensions<DataSourceExtension>(isDataSource);\n const hasExtensions = !_.isEmpty(extensions);\n\n const getURL = React.useCallback(\n async (prometheusProps) => {\n try {\n if (!customDataSourceName) {\n return getPrometheusURL(prometheusProps);\n } else if (hasExtensions) {\n const extension = extensions.find(\n (ext) => ext?.properties?.contextId === 'monitoring-dashboards',\n );\n const getDataSource = extension?.properties?.getDataSource;\n const dataSource = await getDataSource(customDataSourceName);\n return getPrometheusURL(prometheusProps, dataSource?.basePath);\n }\n } catch (error) {\n setIsError(true);\n }\n },\n [customDataSourceName, extensions, hasExtensions],\n );\n\n React.useEffect(() => {\n if (query) {\n // Convert label_values queries to something Prometheus can handle\n // TODO: Once the Prometheus /series endpoint is available through the API proxy, this should\n // be converted to use that instead\n const prometheusQuery = query.replace(/label_values\\((.*), (.*)\\)/, 'count($1) by ($2)');\n\n const prometheusProps = {\n endpoint: PrometheusEndpoint.QUERY_RANGE,\n query: prometheusQuery,\n samples: DEFAULT_GRAPH_SAMPLES,\n timeout: '60s',\n timespan,\n namespace,\n };\n\n getURL(prometheusProps).then((url) =>\n safeFetch(url)\n .then(({ data }) => {\n setIsError(false);\n const newOptions = _.flatMap(data?.result, ({ metric }) => _.values(metric)).sort();\n dispatch(dashboardsVariableOptionsLoaded(name, newOptions, activePerspective));\n })\n .catch((err) => {\n dispatch(dashboardsPatchVariable(name, { isLoading: false }, activePerspective));\n if (err.name !== 'AbortError') {\n setIsError(true);\n }\n }),\n );\n }\n }, [activePerspective, dispatch, getURL, name, namespace, query, safeFetch, timespan]);\n\n React.useEffect(() => {\n if (variable.value && variable.value !== getQueryArgument(name)) {\n if (activePerspective === 'dev' && name !== 'namespace') {\n setQueryArgument(name, variable.value);\n } else if (activePerspective === 'admin') {\n setQueryArgument(name, variable.value);\n }\n }\n }, [activePerspective, name, variable.value]);\n\n const onChange = React.useCallback(\n (v: string) => {\n if (v !== variable.value) {\n if (activePerspective === 'dev' && name !== 'namespace') {\n setQueryArgument(name, v);\n } else if (activePerspective === 'admin') {\n setQueryArgument(name, v);\n }\n dispatch(dashboardsPatchVariable(name, { value: v }, activePerspective));\n }\n },\n [activePerspective, dispatch, name, variable.value],\n );\n\n if (variable.isHidden || (!isError && _.isEmpty(variable.options))) {\n return null;\n }\n\n const items = variable.includeAll\n ? { [MONITORING_DASHBOARDS_VARIABLE_ALL_OPTION_KEY]: 'All' }\n : {};\n _.each(variable.options, (option) => {\n items[option] = option;\n });\n\n return (\n <div\n className=\"form-group monitoring-dashboards__dropdown-wrap\"\n data-test={`${name.toLowerCase()}-dropdown`}\n >\n <label htmlFor={`${id}-dropdown`} className=\"monitoring-dashboards__dropdown-title\">\n {name}\n </label>\n {isError ? (\n <SelectDeprecated\n isDisabled={true}\n onToggle={() => {}}\n placeholderText={\n <>\n <RedExclamationCircleIcon /> {t('public~Error loading options')}\n </>\n }\n />\n ) : (\n <FilterSelect\n items={items}\n onChange={onChange}\n OptionComponent={VariableOption}\n selectedKey={variable.value}\n />\n )}\n </div>\n );\n};\n\nconst AllVariableDropdowns = () => {\n const namespace = React.useContext(NamespaceContext);\n const variables = useSelector(({ observe }: RootState) =>\n observe.getIn(['dashboards', getActivePerspective(namespace), 'variables']),\n );\n\n return (\n <>\n {variables.keySeq().map((name: string) => (\n <VariableDropdown key={name} id={name} name={name} namespace={namespace} />\n ))}\n </>\n );\n};\n\ntype TagColor = 'red' | 'purple' | 'blue' | 'green' | 'cyan' | 'orange';\nconst tagColors: TagColor[] = ['red', 'purple', 'blue', 'green', 'cyan', 'orange'];\n\nconst Tag: React.FC<{ color: TagColor; text: string }> = React.memo(({ color, text }) => (\n <Label className=\"monitoring-dashboards__dashboard_dropdown_tag\" color={color}>\n {text}\n </Label>\n));\n\nconst DashboardDropdown: React.FC<DashboardDropdownProps> = React.memo(\n ({ items, onChange, selectedKey }) => {\n const { t } = useTranslation();\n\n const allTags = _.flatMap(items, 'tags');\n const uniqueTags = _.uniq(allTags);\n\n const OptionComponent = ({ itemKey }) => (\n <SelectOptionDeprecated\n className=\"monitoring-dashboards__dashboard_dropdown_item\"\n value={itemKey}\n >\n {items[itemKey]?.title}\n {items[itemKey]?.tags?.map((tag, i) => (\n <Tag\n color={tagColors[_.indexOf(uniqueTags, tag) % tagColors.length]}\n key={i}\n text={tag}\n />\n ))}\n </SelectOptionDeprecated>\n );\n\n const selectItems = _.mapValues(items, 'title');\n\n return (\n <div\n className=\"form-group monitoring-dashboards__dropdown-wrap\"\n data-test=\"dashboard-dropdown\"\n >\n <label\n className=\"monitoring-dashboards__dropdown-title\"\n htmlFor=\"monitoring-board-dropdown\"\n >\n {t('public~Dashboard')}\n </label>\n <FilterSelect\n items={selectItems}\n onChange={onChange}\n OptionComponent={OptionComponent}\n selectedKey={selectedKey}\n />\n </div>\n );\n },\n);\n\nexport const PollIntervalDropdown: React.FC<TimeDropdownsProps> = ({ namespace }) => {\n const { t } = useTranslation();\n\n const refreshIntervalFromParams = getQueryArgument('refreshInterval');\n const activePerspective = getActivePerspective(namespace);\n const interval = useSelector(({ observe }: RootState) =>\n observe.getIn(['dashboards', activePerspective, 'pollInterval']),\n );\n\n const dispatch = useDispatch();\n const setInterval = React.useCallback(\n (v: number) => {\n if (v) {\n setQueryArgument('refreshInterval', v.toString());\n } else {\n removeQueryArgument('refreshInterval');\n }\n dispatch(dashboardsSetPollInterval(v, activePerspective));\n },\n [dispatch, activePerspective],\n );\n\n return (\n <div className=\"form-group monitoring-dashboards__dropdown-wrap\">\n <label htmlFor=\"refresh-interval-dropdown\" className=\"monitoring-dashboards__dropdown-title\">\n {t('public~Refresh interval')}\n </label>\n <IntervalDropdown\n id=\"refresh-interval-dropdown\"\n interval={_.toNumber(refreshIntervalFromParams) || interval}\n setInterval={setInterval}\n />\n </div>\n );\n};\n\nconst TimeDropdowns: React.FC<{}> = React.memo(() => {\n const namespace = React.useContext(NamespaceContext);\n return (\n <div className=\"monitoring-dashboards__options\">\n <TimespanDropdown namespace={namespace} />\n <PollIntervalDropdown namespace={namespace} />\n </div>\n );\n});\n\nconst HeaderTop: React.FC<{}> = React.memo(() => {\n const { t } = useTranslation();\n\n return (\n <div className=\"monitoring-dashboards__header\">\n <h1 className=\"co-m-pane__heading\">\n <span>{t('public~Dashboards')}</span>\n </h1>\n <TimeDropdowns />\n </div>\n );\n});\n\nconst QueryBrowserLink = ({ queries }) => {\n const { t } = useTranslation();\n\n const params = new URLSearchParams();\n queries.forEach((q, i) => params.set(`query${i}`, q));\n const namespace = React.useContext(NamespaceContext);\n\n return (\n <Link\n aria-label={t('public~Inspect')}\n to={\n namespace\n ? `/dev-monitoring/ns/${namespace}/metrics?${params.toString()}`\n : `/monitoring/query-browser?${params.toString()}`\n }\n >\n {t('public~Inspect')}\n </Link>\n );\n};\n\n// Determine how many columns a panel should span. If panel specifies a `span`, use that. Otherwise\n// look for a `breakpoint` percentage. If neither are specified, default to 12 (full width).\nconst getPanelSpan = (panel: Panel): number => {\n if (panel.span) {\n return panel.span;\n }\n const breakpoint = _.toInteger(_.trimEnd(panel.breakpoint, '%'));\n if (breakpoint > 0) {\n return Math.round(12 * (breakpoint / 100));\n }\n return 12;\n};\n\nconst getPanelClassModifier = (panel: Panel): string => {\n const span: number = getPanelSpan(panel);\n switch (span) {\n case 6:\n return 'max-2';\n case 2:\n // fallthrough\n case 4:\n // fallthrough\n case 5:\n return 'max-3';\n case 3:\n return 'max-4';\n default:\n return 'max-1';\n }\n};\n\nconst Card: React.FC<CardProps> = React.memo(({ panel }) => {\n const { t } = useTranslation();\n\n const namespace = React.useContext(NamespaceContext);\n const activePerspective = getActivePerspective(namespace);\n const pollInterval = useSelector(({ observe }: RootState) =>\n observe.getIn(['dashboards', activePerspective, 'pollInterval']),\n );\n const timespan = useSelector(({ observe }: RootState) =>\n observe.getIn(['dashboards', activePerspective, 'timespan']),\n );\n const variables = useSelector(({ observe }: RootState) =>\n observe.getIn(['dashboards', activePerspective, 'variables']),\n );\n\n const ref = React.useRef();\n const [, wasEverVisible] = useIsVisible(ref);\n\n const [isError, setIsError] = React.useState<boolean>(false);\n const [dataSourceInfoLoading, setDataSourceInfoLoading] = React.useState<boolean>(true);\n const [customDataSource, setCustomDataSource] = React.useState<CustomDataSource>(undefined);\n const customDataSourceName = panel.datasource?.name;\n const [extensions] = useResolvedExtensions<DataSourceExtension>(isDataSource);\n const hasExtensions = !_.isEmpty(extensions);\n\n React.useEffect(() => {\n const getCustomDataSource = async () => {\n if (!customDataSourceName) {\n setDataSourceInfoLoading(false);\n setCustomDataSource(null);\n } else if (hasExtensions) {\n setDataSourceInfoLoading(true);\n const extension = extensions.find(\n (ext) => ext?.properties?.contextId === 'monitoring-dashboards',\n );\n const getDataSource = extension?.properties?.getDataSource;\n const dataSource = await getDataSource(customDataSourceName);\n setCustomDataSource(dataSource);\n setDataSourceInfoLoading(false);\n } else {\n setDataSourceInfoLoading(false);\n setIsError(true);\n }\n };\n getCustomDataSource().catch(() => {\n setIsError(true);\n });\n }, [extensions, customDataSourceName, hasExtensions]);\n\n const formatSeriesTitle = React.useCallback(\n (labels, i) => {\n const title = panel.targets?.[i]?.legendFormat;\n if (_.isNil(title)) {\n return _.isEmpty(labels) ? '{}' : '';\n }\n // Replace Prometheus labels surrounded by {{ }} in the graph legend label templates\n // Regex is based on https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels\n // with additional matchers to allow leading and trailing whitespace\n return title.replace(\n /{{\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*}}/g,\n (match, key) => labels[key] ?? '',\n );\n },\n [panel],\n );\n\n const handleZoom = React.useCallback((timeRange: number, endTime: number) => {\n setQueryArguments({\n endTime: endTime.toString(),\n timeRange: timeRange.toString(),\n });\n }, []);\n\n if (panel.type === 'row') {\n return (\n <>\n {_.map(panel.panels, (p) => (\n <Card key={p.id} panel={p} />\n ))}\n </>\n );\n }\n\n if (!['gauge', 'grafana-piechart-panel', 'graph', 'singlestat', 'table'].includes(panel.type)) {\n return null;\n }\n\n const rawQueries = _.map(panel.targets, 'expr');\n if (!rawQueries.length) {\n return null;\n }\n const queries = rawQueries.map((expr) => evaluateTemplate(expr, variables, timespan));\n const isLoading =\n (_.some(queries, _.isUndefined) && dataSourceInfoLoading) || customDataSource === undefined;\n\n const panelClassModifier = getPanelClassModifier(panel);\n\n return (\n <div\n className={`monitoring-dashboards__panel monitoring-dashboards__panel--${panelClassModifier}`}\n >\n <PFCard\n className={classNames('monitoring-dashboards__card', {\n 'co-overview-card--gradient': panel.type === 'grafana-piechart-panel',\n })}\n data-test={`${panel.title.toLowerCase().replace(/\\s+/g, '-')}-chart`}\n isClickable\n isSelectable\n data-test-id={panel.id ? `chart-${panel.id}` : undefined}\n >\n <CardHeader\n actions={{\n actions: <>{!isLoading && <QueryBrowserLink queries={queries} />}</>,\n hasNoOffset: false,\n className: 'co-overview-card__actions',\n }}\n className=\"monitoring-dashboards__card-header\"\n >\n <CardTitle>{panel.title}</CardTitle>\n </CardHeader>\n <CardBody className=\"co-dashboard-card__body--dashboard\">\n {isError ? (\n <>\n <RedExclamationCircleIcon /> {t('public~Error loading card')}\n </>\n ) : (\n <div className=\"monitoring-dashboards__card-body-content\" ref={ref}>\n {isLoading || !wasEverVisible ? (\n <div className={panel.type === 'graph' ? 'query-browser__wrapper' : ''}>\n <LoadingInline />\n </div>\n ) : (\n <>\n {panel.type === 'grafana-piechart-panel' && (\n <BarChart\n pollInterval={pollInterval}\n query={queries[0]}\n namespace={namespace}\n customDataSource={customDataSource}\n />\n )}\n {panel.type === 'graph' && (\n <Graph\n formatSeriesTitle={formatSeriesTitle}\n isStack={panel.stack}\n pollInterval={pollInterval}\n queries={queries}\n showLegend={panel.legend?.show}\n units={panel.yaxes?.[0]?.format}\n onZoomHandle={handleZoom}\n namespace={namespace}\n customDataSource={customDataSource}\n />\n )}\n {(panel.type === 'singlestat' || panel.type === 'gauge') && (\n <SingleStat\n panel={panel}\n pollInterval={pollInterval}\n query={queries[0]}\n namespace={namespace}\n customDataSource={customDataSource}\n />\n )}\n {panel.type === 'table' && (\n <Table\n panel={panel}\n pollInterval={pollInterval}\n queries={queries}\n namespace={namespace}\n customDataSource={customDataSource}\n />\n )}\n </>\n )}\n </div>\n )}\n </CardBody>\n </PFCard>\n </div>\n );\n});\n\nconst PanelsRow: React.FC<{ row: Row }> = ({ row }) => {\n const showButton = row.showTitle && !_.isEmpty(row.title);\n\n const [isExpanded, toggleIsExpanded] = useBoolean(showButton ? !row.collapse : true);\n\n const Icon = isExpanded ? AngleDownIcon : AngleRightIcon;\n const title = isExpanded ? 'Hide' : 'Show';\n\n return (\n <div data-test-id={`panel-${_.kebabCase(row?.title)}`}>\n {showButton && (\n <Button\n aria-label={title}\n className=\"pf-m-link--align-left\"\n onClick={toggleIsExpanded}\n style={{ fontSize: 24 }}\n title={title}\n variant=\"plain\"\n >\n <Icon />\n {row.title}\n </Button>\n )}\n {isExpanded && (\n <div className=\"monitoring-dashboards__row\">\n {_.map(row.panels, (panel) => (\n <Card key={panel.id} panel={panel} />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nconst Board: React.FC<BoardProps> = ({ rows }) => (\n <>\n {_.map(rows, (row) => (\n <PanelsRow key={_.map(row.panels, 'id').join()} row={row} />\n ))}\n </>\n);\n\nconst MonitoringDashboardsPage: React.FC = () => {\n const { t } = useTranslation();\n const params = useParams();\n const navigate = useNavigate();\n\n const dispatch = useDispatch();\n const namespace = params?.ns;\n const activePerspective = getActivePerspective(namespace);\n const [board, setBoard] = React.useState<string>();\n const [boards, isLoading, error] = useFetchDashboards(namespace);\n\n // Clear queries on unmount\n React.useEffect(() => () => dispatch(queryBrowserDeleteAllQueries()), [dispatch]);\n\n // Clear variables on unmount for dev perspective\n React.useEffect(\n () => () => {\n if (activePerspective === 'dev') {\n dispatch(DashboardsClearVariables(activePerspective));\n }\n },\n [activePerspective, dispatch],\n );\n\n const boardItems = React.useMemo(\n () =>\n _.mapValues(_.mapKeys(boards, 'name'), (b, name) => ({\n tags: b.data?.tags,\n title: b.data?.title ?? name,\n })),\n [boards],\n );\n\n const changeBoard = React.useCallback(\n (newBoard: string) => {\n let timeSpan: string;\n let endTime: string;\n let url = namespace\n ? `/dev-monitoring/ns/${namespace}?dashboard=${newBoard}`\n : `/monitoring/dashboards/${newBoard}`;\n\n const refreshInterval = getQueryArgument('refreshInterval');\n\n if (board) {\n timeSpan = null;\n endTime = null;\n // persist only the refresh Interval when dashboard is changed\n if (refreshInterval) {\n const urlParams = new URLSearchParams({ refreshInterval });\n url = `${url}?${urlParams.toString()}`;\n }\n } else {\n timeSpan = getQueryArgument('timeRange');\n endTime = getQueryArgument('endTime');\n // persist all query params on page reload\n if (window.location.search) {\n url = `${url}${window.location.search}`;\n }\n }\n if (newBoard !== board) {\n if (getQueryArgument('dashboard') !== newBoard) {\n navigate(url, { replace: true });\n }\n\n const allVariables = getAllVariables(boards, newBoard, namespace);\n dispatch(dashboardsPatchAllVariables(allVariables, activePerspective));\n\n // Set time range and poll interval options to their defaults or from the query params if\n // available\n if (refreshInterval) {\n dispatch(dashboardsSetPollInterval(_.toNumber(refreshInterval), activePerspective));\n }\n dispatch(dashboardsSetEndTime(_.toNumber(endTime) || null, activePerspective));\n dispatch(\n dashboardsSetTimespan(\n _.toNumber(timeSpan) || MONITORING_DASHBOARDS_DEFAULT_TIMESPAN,\n activePerspective,\n ),\n );\n\n setBoard(newBoard);\n }\n },\n [activePerspective, board, boards, dispatch, namespace, navigate],\n );\n\n // Display dashboard present in the params or show the first board\n React.useEffect(() => {\n if (!board && !_.isEmpty(boards)) {\n const boardName = getQueryArgument('dashboard');\n changeBoard((namespace ? boardName : params.board) || boards?.[0]?.name);\n }\n }, [board, boards, changeBoard, params.board, namespace]);\n\n React.useEffect(() => {\n const newBoard = getQueryArgument('dashboard');\n const allVariables = getAllVariables(boards, newBoard, namespace);\n dispatch(dashboardsPatchAllVariables(allVariables, activePerspective));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [namespace]);\n\n // If we don't find any rows, build the rows array based on what we have in `data.panels`\n const rows = React.useMemo(() => {\n const data = _.find(boards, { name: board })?.data;\n\n return data?.rows?.length\n ? data.rows\n : data?.panels?.reduce((acc, panel) => {\n if (panel.type === 'row') {\n acc.push(_.cloneDeep(panel));\n } else if (acc.length === 0) {\n acc.push({ panels: [panel] });\n } else {\n const row = acc[acc.length - 1];\n if (_.isNil(row.panels)) {\n row.panels = [];\n }\n row.panels.push(panel);\n }\n return acc;\n }, []);\n }, [board, boards]);\n\n if (error) {\n return <ErrorAlert message={error} />;\n }\n\n return (\n <>\n {!namespace && (\n <Helmet>\n <title>{t('public~Metrics dashboards')}</title>\n </Helmet>\n )}\n <NamespaceContext.Provider value={namespace}>\n <div className=\"co-m-nav-title co-m-nav-title--detail\">\n {!namespace && <HeaderTop />}\n <div className=\"monitoring-dashboards__variables\">\n <div className=\"monitoring-dashboards__dropdowns\">\n {!_.isEmpty(boardItems) && (\n <DashboardDropdown items={boardItems} onChange={changeBoard} selectedKey={board} />\n )}\n <AllVariableDropdowns key={board} />\n </div>\n {namespace && <TimeDropdowns />}\n </div>\n </div>\n <Dashboard>{isLoading ? <LoadingInline /> : <Board key={board} rows={rows} />}</Dashboard>\n </NamespaceContext.Provider>\n </>\n );\n};\n\ntype Variable = {\n isHidden?: boolean;\n isLoading?: boolean;\n options?: string[];\n query?: string;\n value?: string;\n};\n\ntype FilterSelectProps = {\n items: { [key: string]: string };\n onChange: (v: string) => void;\n OptionComponent: React.FC<{ itemKey: string }>;\n selectedKey: string;\n};\n\ntype VariableDropdownProps = {\n id: string;\n name: string;\n namespace?: string;\n};\n\ntype DashboardDropdownProps = {\n items: {\n [key: string]: {\n tags: string[];\n title: string;\n };\n };\n onChange: (v: string) => void;\n selectedKey: string;\n};\n\ntype BoardProps = {\n rows: Row[];\n};\n\ntype CardProps = {\n panel: Panel;\n};\n\nexport default withFallback(MonitoringDashboardsPage, ErrorBoundaryFallbackPage);\n","import * as _ from 'lodash-es';\nimport { getUser, Silence, SilenceStates } from '@console/dynamic-plugin-sdk';\nimport {\n formatPrometheusDuration,\n parsePrometheusDuration,\n} from '@openshift-console/plugin-shared/src/datetime/prometheus';\nimport { Alert, ActionGroup, Button, TextArea, TextInput, Tooltip } from '@patternfly/react-core';\nimport {\n Dropdown as DropdownDeprecated,\n DropdownItem as DropdownItemDeprecated,\n DropdownToggle as DropdownToggleDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { MinusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/minus-circle-icon';\nimport { PlusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon';\nimport * as React from 'react';\nimport { Helmet } from 'react-helmet';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { useParams, useNavigate } from 'react-router-dom-v5-compat';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useSelector } from 'react-redux';\n\nimport { consoleFetchJSON } from '@console/dynamic-plugin-sdk/src/utils/fetch';\nimport { withFallback } from '@console/shared/src/components/error';\nimport { useActiveNamespace } from '@console/shared/src/hooks/useActiveNamespace';\nimport { RootState } from '../../redux';\nimport { refreshNotificationPollers } from '../notification-drawer';\nimport { ButtonBar } from '../utils/button-bar';\nimport { PageHeading, SectionHeading } from '../utils/headings';\nimport { ExternalLink, getURLSearchParams } from '../utils/link';\nimport { StatusBox } from '../utils/status-box';\nimport { useBoolean } from './hooks/useBoolean';\nimport { Silences } from './types';\nimport { SilenceResource, silenceState } from './utils';\n\nconst pad = (i: number): string => (i < 10 ? `0${i}` : String(i));\n\nconst formatDate = (d: Date): string =>\n `${d.getFullYear()}/${pad(d.getMonth() + 1)}/${pad(d.getDate())} ${pad(d.getHours())}:${pad(\n d.getMinutes(),\n )}:${pad(d.getSeconds())}`;\n\nconst DatetimeTextInput = (props) => {\n const { t } = useTranslation();\n\n const pattern =\n '\\\\d{4}/(0?[1-9]|1[012])/(0?[1-9]|[12]\\\\d|3[01]) (0?\\\\d|1\\\\d|2[0-3]):[0-5]\\\\d(:[0-5]\\\\d)?';\n const isValid = new RegExp(`^${pattern}$`).test(props.value);\n\n return (\n <div>\n <Tooltip\n content={[\n <span className=\"co-nowrap\" key=\"co-timestamp\">\n {isValid ? new Date(props.value).toISOString() : t('public~Invalid date / time')}\n </span>,\n ]}\n >\n <TextInput\n {...props}\n aria-label={t('public~Datetime')}\n data-test-id=\"silence-datetime\"\n validated={isValid || !!props.isDisabled ? 'default' : 'error'}\n pattern={pattern}\n placeholder=\"YYYY/MM/DD hh:mm:ss\"\n />\n </Tooltip>\n </div>\n );\n};\n\nconst NegativeMatcherHelp = () => {\n const { t } = useTranslation();\n\n return (\n <dl>\n <dd>\n {t('Select the negative matcher option to update the label value to a not equals matcher.')}\n </dd>\n <dd>\n {t(\n 'If both the RegEx and negative matcher options are selected, the label value must not match the regular expression.',\n )}\n </dd>\n </dl>\n );\n};\n\nconst SilenceForm_: React.FC<SilenceFormProps> = ({ defaults, Info, title }) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n\n const { ns: namespace } = useParams();\n\n const durationOff = '-';\n const durations = {\n [durationOff]: durationOff,\n '30m': t('public~30m'),\n '1h': t('public~1h'),\n '2h': t('public~2h'),\n '6h': t('public~6h'),\n '12h': t('public~12h'),\n '1d': t('public~1d'),\n '2d': t('public~2d'),\n '1w': t('public~1w'),\n };\n\n const now = new Date();\n\n // Default to starting now if we have no default start time or if the default start time is in the\n // past (because Alertmanager will change a time in the past to the current time on save anyway)\n const defaultIsStartNow = _.isEmpty(defaults.startsAt) || new Date(defaults.startsAt) < now;\n\n let defaultDuration = _.isEmpty(defaults.endsAt) ? '2h' : durationOff;\n\n // If we have both a default start and end time and the difference between them exactly matches\n // one of the duration options, automatically select that option in the duration menu\n if (!defaultIsStartNow && defaults.startsAt && defaults.endsAt) {\n const durationFromDefaults = formatPrometheusDuration(\n Date.parse(defaults.endsAt) - Date.parse(defaults.startsAt),\n );\n if (Object.keys(durations).includes(durationFromDefaults)) {\n defaultDuration = durationFromDefaults;\n }\n }\n\n const [isOpen, setIsOpen, , setClosed] = useBoolean(false);\n\n const [comment, setComment] = React.useState(defaults.comment ?? '');\n const [createdBy, setCreatedBy] = React.useState(defaults.createdBy ?? '');\n const [duration, setDuration] = React.useState(defaultDuration);\n const [endsAt, setEndsAt] = React.useState(\n defaults.endsAt ?? formatDate(new Date(new Date(now).setHours(now.getHours() + 2))),\n );\n const [error, setError] = React.useState<string>();\n const [inProgress, setInProgress] = React.useState(false);\n const [isStartNow, setIsStartNow] = React.useState(defaultIsStartNow);\n const [matchers, setMatchers] = React.useState(\n defaults.matchers ?? [{ isRegex: false, name: '', value: '' }],\n );\n const [startsAt, setStartsAt] = React.useState(defaults.startsAt ?? formatDate(now));\n\n const user = useSelector(getUser);\n\n React.useEffect(() => {\n if (!createdBy && user) {\n setCreatedBy(user.metadata?.name || user.username);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user]);\n\n React.useEffect(() => {\n if (namespace) {\n setMatchers([\n { isRegex: false, name: 'namespace', value: namespace },\n ...matchers.filter((m) => m.name !== 'namespace'),\n ]);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [namespace]);\n\n const getEndsAtValue = (): string => {\n const startsAtDate = Date.parse(startsAt);\n return startsAtDate\n ? formatDate(new Date(startsAtDate + parsePrometheusDuration(duration)))\n : '-';\n };\n\n const setMatcherField = (i: number, field: string, v: any): void => {\n const newMatchers = _.clone(matchers);\n _.set(newMatchers, [i, field], v);\n setMatchers(newMatchers);\n };\n\n const addMatcher = (): void => {\n setMatchers([...matchers, { isRegex: false, name: '', value: '' }]);\n };\n\n const removeMatcher = (i: number): void => {\n const newMatchers = _.clone(matchers);\n newMatchers.splice(i, 1);\n\n // If all matchers have been removed, add back a single blank matcher\n setMatchers(_.isEmpty(newMatchers) ? [{ isRegex: false, name: '', value: '' }] : newMatchers);\n };\n\n const onSubmit: React.FormEventHandler<HTMLFormElement> = (e) => {\n e.preventDefault();\n\n // Don't allow comments to only contain whitespace\n if (_.trim(comment) === '') {\n setError('Comment is required.');\n return;\n }\n\n const url = namespace\n ? `api/alertmanager-tenancy/api/v2/silences?namespace=${namespace}`\n : `${window.SERVER_FLAGS.alertManagerBaseURL}/api/v2/silences`;\n if (!url) {\n setError('Alertmanager URL not set');\n return;\n }\n\n setInProgress(true);\n\n const saveStartsAt: Date = isStartNow ? new Date() : new Date(startsAt);\n const saveEndsAt: Date =\n duration === durationOff\n ? new Date(endsAt)\n : new Date(saveStartsAt.getTime() + parsePrometheusDuration(duration));\n\n const body = {\n comment,\n createdBy,\n endsAt: saveEndsAt.toISOString(),\n id: defaults.id,\n matchers,\n startsAt: saveStartsAt.toISOString(),\n };\n\n consoleFetchJSON\n .post(url, body)\n .then(({ silenceID }) => {\n setError(undefined);\n refreshNotificationPollers();\n navigate(\n namespace\n ? `/dev-monitoring/ns/${namespace}/silences/${encodeURIComponent(silenceID)}`\n : `/monitoring/silences/${encodeURIComponent(silenceID)}`,\n );\n })\n .catch((err) => {\n const errorMessage =\n typeof _.get(err, 'json') === 'string'\n ? _.get(err, 'json')\n : err.message || 'Error saving Silence';\n setError(errorMessage);\n setInProgress(false);\n });\n };\n\n const dropdownItems = _.map(durations, (displayText, key) => (\n <DropdownItemDeprecated key={key} onClick={() => setDuration(key)}>\n {displayText}\n </DropdownItemDeprecated>\n ));\n\n return (\n <>\n <Helmet>\n <title>{title}</title>\n </Helmet>\n <PageHeading\n title={title}\n helpText={t(\n 'public~Silences temporarily mute alerts based on a set of label selectors that you define. Notifications will not be sent for alerts that match all the listed values or regular expressions.',\n )}\n detail\n />\n\n {Info && <Info />}\n\n <div className=\"co-m-pane__body\">\n <form onSubmit={onSubmit} className=\"monitoring-silence-alert\">\n <div className=\"co-m-pane__body-group\">\n <SectionHeading text={t('public~Duration')} />\n <div className=\"row\">\n <div className=\"form-group col-sm-4 col-md-5\">\n <label>{t('public~Silence alert from...')}</label>\n {isStartNow ? (\n <DatetimeTextInput isDisabled data-test=\"silence-from\" value={t('public~Now')} />\n ) : (\n <DatetimeTextInput\n data-test=\"silence-from\"\n isRequired\n onChange={(_event, value: string) => setStartsAt(value)}\n value={startsAt}\n />\n )}\n </div>\n <div className=\"form-group col-sm-4 col-md-2\">\n <label>{t('public~For...')}</label>\n <DropdownDeprecated\n className=\"dropdown--full-width\"\n data-test=\"silence-for\"\n dropdownItems={dropdownItems}\n isOpen={isOpen}\n onSelect={setClosed}\n toggle={\n <DropdownToggleDeprecated data-test=\"silence-for-toggle\" onToggle={setIsOpen}>\n {duration}\n </DropdownToggleDeprecated>\n }\n />\n </div>\n <div className=\"form-group col-sm-4 col-md-5\">\n <label>{t('public~Until...')}</label>\n {duration === durationOff ? (\n <DatetimeTextInput\n data-test=\"silence-until\"\n isRequired\n onChange={(_event, value: string) => setEndsAt(value)}\n value={endsAt}\n />\n ) : (\n <DatetimeTextInput\n data-test=\"silence-until\"\n isDisabled\n value={\n isStartNow\n ? t('public~{{duration}} from now', { duration: durations[duration] })\n : getEndsAtValue()\n }\n />\n )}\n </div>\n </div>\n <div className=\"form-group\">\n <label>\n <input\n data-test=\"silence-start-immediately\"\n checked={isStartNow}\n onChange={(e) => setIsStartNow(e.currentTarget.checked)}\n type=\"checkbox\"\n />\n {t('public~Start immediately')}\n </label>\n </div>\n </div>\n\n <div className=\"co-m-pane__body-group\">\n <SectionHeading text={t('public~Alert labels')} />\n <p className=\"co-help-text monitoring-silence-alert__paragraph\">\n <Trans t={t} ns=\"public\">\n Alerts with labels that match these selectors will be silenced instead of firing.\n Label values can be matched exactly or with a{' '}\n <ExternalLink\n href=\"https://github.com/google/re2/wiki/Syntax\"\n text={t('public~regular expression')}\n />\n </Trans>\n </p>\n\n {_.map(matchers, (matcher, i: number) => {\n const isNamespace = !!namespace && matcher.name === 'namespace';\n return (\n <div className=\"row\" key={i}>\n <div className=\"form-group col-sm-4\">\n <label>{t('public~Label name')}</label>\n <TextInput\n aria-label={t('public~Label name')}\n isDisabled={isNamespace}\n isRequired\n onChange={(_event, v: string) => setMatcherField(i, 'name', v)}\n placeholder={t('public~Name')}\n value={matcher.name}\n />\n </div>\n <div className=\"form-group col-sm-4\">\n <label>{t('public~Label value')}</label>\n <TextInput\n aria-label={t('public~Label value')}\n isDisabled={isNamespace}\n isRequired\n onChange={(_event, v: string) => setMatcherField(i, 'value', v)}\n placeholder={t('public~Value')}\n value={matcher.value}\n />\n </div>\n {!isNamespace && (\n <div className=\"form-group col-sm-4\">\n <div className=\"monitoring-silence-alert__label-options\">\n <label>\n <input\n checked={matcher.isRegex}\n onChange={(e) => setMatcherField(i, 'isRegex', e.currentTarget.checked)}\n type=\"checkbox\"\n />\n {t('public~RegEx')}\n </label>\n <Tooltip content={<NegativeMatcherHelp />}>\n <label>\n <input\n checked={matcher.isEqual === false}\n onChange={(e) =>\n setMatcherField(i, 'isEqual', !e.currentTarget.checked)\n }\n type=\"checkbox\"\n />\n {t('public~Negative matcher')}\n </label>\n </Tooltip>\n <Tooltip content={t('public~Remove')}>\n <Button\n type=\"button\"\n onClick={() => removeMatcher(i)}\n aria-label={t('public~Remove')}\n variant=\"plain\"\n >\n <MinusCircleIcon />\n </Button>\n </Tooltip>\n </div>\n </div>\n )}\n </div>\n );\n })}\n\n <div className=\"form-group\">\n <Button\n className=\"pf-m-link--align-left\"\n onClick={addMatcher}\n type=\"button\"\n variant=\"link\"\n >\n <PlusCircleIcon className=\"co-icon-space-r\" />\n {t('public~Add label')}\n </Button>\n </div>\n </div>\n\n <div className=\"co-m-pane__body-group\">\n <SectionHeading text={t('public~Info')} />\n <div className=\"form-group\">\n <label className=\"co-required\">{t('public~Creator')}</label>\n <TextInput\n aria-label={t('public~Creator')}\n onChange={(_event, v: string) => setCreatedBy(v)}\n value={createdBy}\n />\n </div>\n <div className=\"form-group\">\n <label className=\"co-required\">{t('public~Comment')}</label>\n <TextArea\n aria-label={t('public~Comment')}\n isRequired\n onChange={(_event, v: string) => setComment(v)}\n data-test=\"silence-comment\"\n value={comment}\n />\n </div>\n <ButtonBar errorMessage={error} inProgress={inProgress}>\n <ActionGroup className=\"pf-v5-c-form\">\n <Button type=\"submit\" variant=\"primary\">\n {t('public~Silence')}\n </Button>\n <Button onClick={() => navigate(-1)} variant=\"secondary\">\n {t('public~Cancel')}\n </Button>\n </ActionGroup>\n </ButtonBar>\n </div>\n </form>\n </div>\n </>\n );\n};\nconst SilenceForm = withFallback(SilenceForm_);\n\nconst EditInfo = () => {\n const { t } = useTranslation();\n\n return (\n <Alert\n className=\"co-alert\"\n isInline\n title={t('public~Overwriting current silence')}\n variant=\"info\"\n >\n {t(\n 'public~When changes are saved, the currently existing silence will be expired and a new silence with the new configuration will take its place.',\n )}\n </Alert>\n );\n};\n\nexport const EditSilence = () => {\n const { t } = useTranslation();\n const params = useParams();\n\n const [namespace] = useActiveNamespace();\n\n const silences: Silences = useSelector(({ observe }: RootState) =>\n observe.get(namespace ? 'devSilences' : 'silences'),\n );\n\n const silence: Silence = _.find(silences?.data, { id: params.id });\n const isExpired = silenceState(silence) === SilenceStates.Expired;\n const defaults = _.pick(silence, [\n 'comment',\n 'createdBy',\n 'endsAt',\n 'id',\n 'matchers',\n 'startsAt',\n ]);\n defaults.startsAt = isExpired ? undefined : formatDate(new Date(defaults.startsAt));\n defaults.endsAt = isExpired ? undefined : formatDate(new Date(defaults.endsAt));\n\n return (\n <StatusBox\n data={silence}\n label={SilenceResource.label}\n loaded={silences?.loaded}\n loadError={silences?.loadError}\n >\n <SilenceForm\n defaults={defaults}\n Info={isExpired ? undefined : EditInfo}\n title={isExpired ? t('public~Recreate silence') : t('public~Edit silence')}\n />\n </StatusBox>\n );\n};\n\nexport const CreateSilence = () => {\n const { t } = useTranslation();\n\n const matchers = _.map(getURLSearchParams(), (value, name) => ({ name, value, isRegex: false }));\n\n return _.isEmpty(matchers) ? (\n <SilenceForm defaults={{}} title={t('public~Create silence')} />\n ) : (\n <SilenceForm defaults={{ matchers }} title={t('public~Silence alert')} />\n );\n};\n\ntype SilenceFormProps = {\n defaults: any;\n Info?: React.ComponentType<{}>;\n title: string;\n};\n","import * as React from 'react';\nimport * as PropTypes from 'prop-types';\nimport * as _ from 'lodash-es';\nimport * as fuzzy from 'fuzzysearch';\nimport { useTranslation } from 'react-i18next';\n\nimport { Dropdown, ResourceName } from './';\n\n// https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/#envvarsource-v1-core\n// valueFrom:\n// fieldRef:\n// fieldPath: spec.nodeName\n\n// valueFrom:\n// secretKeyRef:\n// name: mysecret\n// key: username\n\n// valueFrom:\n// configMapKeyRef:\n// name: tectonic-config\n// key: consoleBaseAddress\n\n// valueFrom:\n// resourceFieldRef:\n// containerName: test-container\n// resource: requests.cpu\n// divisor: 1 // 1 is default\n\nconst getSpacer = (configMap, secret) => {\n const spacerBefore = new Set();\n return _.isEmpty(configMap) || _.isEmpty(secret) ? spacerBefore : spacerBefore.add(secret);\n};\n\nconst getKeys = (keyMap) => {\n const itemKeys = {};\n _.mapKeys(keyMap, (value, key) => (itemKeys[key] = key));\n return itemKeys;\n};\n\nexport const NameKeyDropdownPair = ({\n name,\n pairKey,\n configMaps,\n secrets,\n serviceAccounts,\n onChange,\n kind,\n nameTitle,\n placeholderString,\n isKeyRef = true,\n}) => {\n const { t } = useTranslation();\n\n const getHeaders = (configMap, secret, serviceAccount) => {\n const headers = {};\n if (configMap && !_.isEmpty(configMap)) {\n headers[configMap] = t('public~ConfigMaps');\n }\n if (secret && !_.isEmpty(secret)) {\n headers[secret] = t('public~Secrets');\n }\n if (serviceAccount && !_.isEmpty(serviceAccount)) {\n headers[serviceAccount] = t('public~ServiceAccounts');\n }\n\n return headers;\n };\n\n let itemKeys = {};\n let refProperty;\n const cmItems = {};\n const secretItems = {};\n const saItems = {};\n const nameAutocompleteFilter = (text, item) => fuzzy(text, item.props.name);\n const keyAutocompleteFilter = (text, item) => fuzzy(text, item);\n const keyTitle = _.isEmpty(pairKey) ? t('public~Select a key') : pairKey;\n const cmRefProperty = isKeyRef ? 'configMapKeyRef' : 'configMapRef';\n const secretRefProperty = isKeyRef ? 'secretKeyRef' : 'secretRef';\n const serviceAccountRefProperty = isKeyRef ? 'serviceAccountKeyRef' : 'serviceAccountRef';\n\n _.each(configMaps.items, (v) => {\n cmItems[`${v.metadata.name}:${cmRefProperty}`] = (\n <ResourceName kind=\"ConfigMap\" name={v.metadata.name} />\n );\n if (kind === 'ConfigMap' && _.isEqual(v.metadata.name, name)) {\n refProperty = cmRefProperty;\n itemKeys = getKeys(v.data);\n }\n });\n _.each(secrets.items, (v) => {\n secretItems[`${v.metadata.name}:${secretRefProperty}`] = (\n <ResourceName kind=\"Secret\" name={v.metadata.name} />\n );\n if (kind === 'Secret' && _.isEqual(v.metadata.name, name)) {\n refProperty = secretRefProperty;\n itemKeys = getKeys(v.data);\n }\n });\n serviceAccounts &&\n _.each(serviceAccounts.items, (v) => {\n saItems[`${v.metadata.name}:${serviceAccountRefProperty}`] = (\n <ResourceName kind=\"ServiceAccount\" name={v.metadata.name} />\n );\n if (kind === 'ServiceAccount' && _.isEqual(v.metadata.name, name)) {\n refProperty = serviceAccountRefProperty;\n itemKeys = getKeys(v.data);\n }\n });\n\n const firstConfigMap = _.isEmpty(cmItems) ? {} : Object.keys(cmItems)[0];\n const firstSecret = _.isEmpty(secretItems) ? {} : Object.keys(secretItems)[0];\n const firstServiceAccount = saItems && !_.isEmpty(saItems) ? Object.keys(saItems)[0] : {};\n const headerBefore = getHeaders(firstConfigMap, firstSecret, firstServiceAccount);\n const spacerBefore = getSpacer(firstConfigMap, firstSecret);\n const items = _.assign({}, cmItems, secretItems, saItems);\n return (\n <>\n <Dropdown\n menuClassName=\"value-from__menu dropdown-menu--text-wrap\"\n className=\"value-from\"\n autocompleteFilter={nameAutocompleteFilter}\n autocompletePlaceholder={placeholderString}\n items={items}\n selectedKey={name}\n title={nameTitle}\n headerBefore={headerBefore}\n spacerBefore={spacerBefore}\n onChange={(val) => {\n const keyValuePair = _.split(val, ':');\n onChange({\n [keyValuePair[1]]: isKeyRef\n ? { name: keyValuePair[0], pairKey: '' }\n : { name: keyValuePair[0] },\n });\n }}\n />\n {isKeyRef && (\n <Dropdown\n menuClassName=\"value-from__menu dropdown-menu--text-wrap\"\n className=\"value-from value-from--key\"\n autocompleteFilter={keyAutocompleteFilter}\n autocompletePlaceholder={t('public~Key')}\n items={itemKeys}\n selectedKey={pairKey}\n title={keyTitle}\n onChange={(val) => onChange({ [refProperty]: { name, key: val } })}\n />\n )}\n </>\n );\n};\n\nconst FieldRef = ({ data: { fieldPath } }) => (\n <>\n <div className=\"pairs-list__value-ro-field\">\n <input type=\"text\" className=\"pf-v5-c-form-control\" value=\"FieldRef\" disabled />\n </div>\n <div className=\"pairs-list__value-ro-field\">\n <input type=\"text\" className=\"pf-v5-c-form-control\" value={fieldPath} disabled />\n </div>\n </>\n);\n\nconst ConfigMapSecretKeyRef = ({\n data: { name, key },\n configMaps,\n secrets,\n serviceAccounts,\n onChange,\n disabled,\n kind,\n}) => {\n const { t } = useTranslation();\n const placeholderString = t('public~ConfigMap or Secret');\n const nameTitle = _.isEmpty(name) ? (\n t('public~Select a resource')\n ) : (\n <ResourceName kind={kind} name={name} />\n );\n\n if (disabled) {\n return (\n <>\n <div className=\"pairs-list__value-ro-field\">\n <input\n type=\"text\"\n className=\"pf-v5-c-form-control\"\n value={`${name} - ${kind}`}\n disabled\n />\n </div>\n <div className=\"pairs-list__value-ro-field\">\n <input type=\"text\" className=\"pf-v5-c-form-control\" value={key} disabled />\n </div>\n </>\n );\n }\n return (\n <NameKeyDropdownPair\n pairKey={key}\n name={name}\n configMaps={configMaps}\n secrets={secrets}\n serviceAccounts={serviceAccounts}\n onChange={onChange}\n kind={kind}\n nameTitle={nameTitle}\n placeholderString={placeholderString}\n />\n );\n};\n\nconst ConfigMapSecretRef = ({\n data: { name, key },\n configMaps,\n secrets,\n serviceAccounts,\n onChange,\n disabled,\n kind,\n}) => {\n const { t } = useTranslation();\n const placeholderString = t('public~ConfigMap or Secret');\n const nameTitle = _.isEmpty(name) ? (\n t('public~Select a resource')\n ) : (\n <ResourceName kind={kind} name={name} />\n );\n const isKeyRef = false;\n const nameString = _.isEmpty(name) ? '' : `${name} - ${kind}`;\n\n if (disabled) {\n return (\n <div className=\"pairs-list__value-ro-field\">\n <input\n type=\"text\"\n className=\"pf-v5-c-form-control\"\n value={nameString}\n disabled\n placeholder={t('public~ConfigMap/Secret')}\n />\n </div>\n );\n }\n return (\n <NameKeyDropdownPair\n pairKey={key}\n name={name}\n configMaps={configMaps}\n secrets={secrets}\n serviceAccounts={serviceAccounts}\n onChange={onChange}\n kind={kind}\n nameTitle={nameTitle}\n placeholderString={placeholderString}\n isKeyRef={isKeyRef}\n />\n );\n};\n\nconst ResourceFieldRef = ({ data: { containerName, resource } }) => (\n <>\n <div className=\"pairs-list__value-ro-field\">\n <input\n type=\"text\"\n className=\"pf-v5-c-form-control value-from\"\n value={`${containerName} - Resource Field`}\n disabled\n />\n </div>\n <div className=\"pairs-list__value-ro-field\">\n <input type=\"text\" className=\"pf-v5-c-form-control value-from\" value={resource} disabled />\n </div>\n </>\n);\n\nconst keyStringToComponent = {\n fieldRef: {\n component: FieldRef,\n },\n secretKeyRef: {\n component: ConfigMapSecretKeyRef,\n kind: 'Secret',\n },\n configMapKeyRef: {\n component: ConfigMapSecretKeyRef,\n kind: 'ConfigMap',\n },\n configMapSecretKeyRef: {\n component: ConfigMapSecretKeyRef,\n },\n resourceFieldRef: {\n component: ResourceFieldRef,\n },\n configMapRef: {\n component: ConfigMapSecretRef,\n kind: 'ConfigMap',\n },\n secretRef: {\n component: ConfigMapSecretRef,\n kind: 'Secret',\n },\n serviceAccountRef: {\n component: ConfigMapSecretRef,\n kind: 'ServiceAccount',\n },\n configMapSecretRef: {\n component: ConfigMapSecretRef,\n },\n};\n\nexport class ValueFromPair extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.onChangeVal = (...args) => this._onChangeVal(...args);\n }\n\n _onChangeVal(value) {\n const { onChange } = this.props;\n const e = { target: { value } };\n return onChange(e);\n }\n\n render() {\n const { pair, configMaps, secrets, serviceAccounts, disabled } = this.props;\n const valueFromKey = Object.keys(this.props.pair)[0];\n const componentInfo = keyStringToComponent[valueFromKey];\n if (!componentInfo) {\n return null;\n }\n\n const Component = componentInfo.component;\n return (\n <Component\n data={pair[valueFromKey]}\n configMaps={configMaps}\n secrets={secrets}\n serviceAccounts={serviceAccounts}\n kind={componentInfo.kind}\n onChange={this.onChangeVal}\n disabled={disabled}\n />\n );\n }\n}\nValueFromPair.propTypes = {\n pair: PropTypes.object.isRequired,\n configMaps: PropTypes.object,\n secrets: PropTypes.object,\n onChange: PropTypes.func,\n disabled: PropTypes.bool,\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { Helmet } from 'react-helmet';\nimport { useTranslation } from 'react-i18next';\nimport { useParams } from 'react-router-dom-v5-compat';\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionToggle,\n Button,\n ButtonVariant,\n Divider,\n PageSection,\n PageSectionVariants,\n Text,\n Toolbar,\n ToolbarChip,\n ToolbarContent,\n ToolbarFilter,\n ToolbarItem,\n} from '@patternfly/react-core';\nimport { PlusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon';\nimport { MinusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/minus-circle-icon';\nimport { getBadgeFromType, usePinnedResources } from '@console/shared';\nimport { connectToModel } from '../kinds';\nimport { DefaultPage } from './default-resource';\nimport { requirementFromString } from '../module/k8s/selector-requirement';\nimport { ResourceListDropdown } from './resource-dropdown';\nimport { getResourceListPages } from './resource-pages';\nimport { withStartGuide } from './start-guide';\nimport { split, selectorFromString } from '../module/k8s/selector';\nimport {\n kindForReference,\n modelFor,\n referenceForModel,\n K8sResourceKindReference,\n} from '../module/k8s';\nimport { LoadingBox, MsgBox, ResourceIcon, setQueryArgument, AsyncComponent } from './utils';\nimport confirmNavUnpinModal from '@console/app/src/components/nav/confirmNavUnpinModal';\nimport { SearchFilterDropdown, searchFilterValues } from './search-filter-dropdown';\nimport { useExtensions, isResourceListPage, ResourceListPage } from '@console/plugin-sdk';\nimport {\n ResourceListPage as DynamicResourceListPage,\n isResourceListPage as isDynamicResourceListPage,\n useActivePerspective,\n} from '@console/dynamic-plugin-sdk';\n\nconst ResourceList = connectToModel(({ kindObj, mock, namespace, selector, nameFilter }) => {\n const resourceListPageExtensions = useExtensions<ResourceListPage>(isResourceListPage);\n const dynamicResourceListPageExtensions = useExtensions<DynamicResourceListPage>(\n isDynamicResourceListPage,\n );\n if (!kindObj) {\n return <LoadingBox />;\n }\n\n const componentLoader = getResourceListPages(\n resourceListPageExtensions,\n dynamicResourceListPageExtensions,\n ).get(referenceForModel(kindObj), () => Promise.resolve(DefaultPage));\n const ns = kindObj.namespaced ? namespace : undefined;\n\n return (\n <AsyncComponent\n loader={componentLoader}\n namespace={ns}\n selector={selector}\n nameFilter={nameFilter}\n kind={kindObj.crd ? referenceForModel(kindObj) : kindObj.kind}\n showTitle={false}\n hideTextFilter\n autoFocus={false}\n mock={mock}\n badge={getBadgeFromType(kindObj.badge)}\n hideNameLabelFilters\n hideColumnManagement\n />\n );\n});\n\nconst SearchPage_: React.FC<SearchProps> = (props) => {\n const [perspective] = useActivePerspective();\n const [selectedItems, setSelectedItems] = React.useState(new Set<string>([]));\n const [collapsedKinds, setCollapsedKinds] = React.useState(new Set<string>([]));\n const [labelFilter, setLabelFilter] = React.useState([]);\n const [labelFilterInput, setLabelFilterInput] = React.useState('');\n const [typeaheadNameFilter, setTypeaheadNameFilter] = React.useState('');\n const [pinnedResources, setPinnedResources, pinnedResourcesLoaded] = usePinnedResources();\n const { noProjectsAvailable } = props;\n const { t } = useTranslation();\n const { ns: namespace } = useParams();\n // Set state variables from the URL\n React.useEffect(() => {\n let kind: string, q: string, name: string;\n\n if (window.location.search) {\n const sp = new URLSearchParams(window.location.search);\n kind = sp.get('kind');\n q = sp.get('q');\n name = sp.get('name');\n }\n // Ensure that the \"kind\" route parameter is a valid resource kind ID\n kind = kind || '';\n if (kind !== '') {\n setSelectedItems(new Set(kind.split(',')));\n }\n const tags = split(q || '');\n const validTags = _.reject(tags, (tag) => requirementFromString(tag) === undefined);\n setLabelFilter(validTags);\n setTypeaheadNameFilter(name || '');\n }, []);\n\n const updateSelectedItems = (selection: string) => {\n const updateItems = selectedItems;\n updateItems.has(selection) ? updateItems.delete(selection) : updateItems.add(selection);\n setSelectedItems(updateItems);\n setQueryArgument('kind', [...updateItems].join(','));\n };\n\n const updateNewItems = (filter: string, { key }: ToolbarChip) => {\n const updateItems = selectedItems;\n updateItems.has(key) ? updateItems.delete(key) : updateItems.add(key);\n setSelectedItems(updateItems);\n setQueryArgument('kind', [...updateItems].join(','));\n };\n\n const clearSelectedItems = () => {\n setSelectedItems(new Set([]));\n setQueryArgument('kind', '');\n };\n\n const clearNameFilter = () => {\n setTypeaheadNameFilter('');\n setQueryArgument('name', '');\n };\n\n const clearLabelFilter = () => {\n setLabelFilter([]);\n setQueryArgument('q', '');\n };\n\n const clearAll = () => {\n clearSelectedItems();\n clearNameFilter();\n clearLabelFilter();\n };\n\n const pinToggle = (e: React.MouseEvent<HTMLElement>, resource: string) => {\n e.preventDefault();\n e.stopPropagation();\n const index = pinnedResources.indexOf(resource);\n if (index >= 0) {\n confirmNavUnpinModal(resource, pinnedResources, setPinnedResources);\n return;\n }\n setPinnedResources([resource, ...pinnedResources]);\n };\n\n const toggleKindExpanded = (kindView: string) => {\n const newCollasped = new Set(collapsedKinds);\n newCollasped.has(kindView) ? newCollasped.delete(kindView) : newCollasped.add(kindView);\n setCollapsedKinds(newCollasped);\n };\n\n const updateNameFilter = (value: string) => {\n setTypeaheadNameFilter(value);\n setQueryArgument('name', value);\n };\n\n const updateLabelFilter = (value: string, endOfString: boolean) => {\n setLabelFilterInput(value);\n if (requirementFromString(value) !== undefined && endOfString) {\n const updatedLabels = _.uniq([...labelFilter, value]);\n setLabelFilter(updatedLabels);\n setQueryArgument('q', updatedLabels.join(','));\n setLabelFilterInput('');\n }\n };\n\n const updateSearchFilter = (type: string, value: string, endOfString: boolean) => {\n type === searchFilterValues.Label\n ? updateLabelFilter(value, endOfString)\n : updateNameFilter(value);\n };\n\n const removeLabelFilter = (filter: string, value: string) => {\n const newLabels = labelFilter.filter((keepItem: string) => keepItem !== value);\n setLabelFilter(newLabels);\n setQueryArgument('q', newLabels.join(','));\n };\n\n const getToggleText = (item: string) => {\n const model = modelFor(item);\n // API discovery happens asynchronously. Avoid runtime errors if the model hasn't loaded.\n if (!model) {\n return '';\n }\n const { labelPlural, labelPluralKey, apiVersion, apiGroup } = model;\n return (\n <span className=\"co-search-group__accordion-label\">\n {labelPluralKey ? t(labelPluralKey) : labelPlural}{' '}\n <div className=\"text-muted small\">\n {apiGroup || 'core'}/{apiVersion}\n </div>\n </span>\n );\n };\n\n const getChipText = (reference: K8sResourceKindReference) => {\n const model = modelFor(reference);\n // API discovery happens asynchronously. Avoid runtime errors if the model hasn't loaded.\n if (!model) {\n return kindForReference(reference);\n }\n return model.labelKey ? t(model.labelKey) : model.label;\n };\n\n return (\n <>\n <Helmet>\n <title>{t('public~Search')}</title>\n </Helmet>\n <PageSection variant={PageSectionVariants.light}>\n <Text component=\"h1\">{t('public~Search')}</Text>\n <Toolbar\n className=\"co-toolbar-no-padding\"\n id=\"search-toolbar\"\n clearAllFilters={clearAll}\n collapseListedFiltersBreakpoint=\"xl\"\n clearFiltersButtonText={t('public~Clear all filters')}\n >\n <ToolbarContent>\n <ToolbarItem>\n <ToolbarFilter\n deleteChipGroup={clearSelectedItems}\n chips={[...selectedItems].map((resourceKind) => ({\n key: resourceKind,\n node: (\n <>\n <ResourceIcon kind={resourceKind} />\n {getChipText(resourceKind)}\n </>\n ),\n }))}\n deleteChip={updateNewItems}\n categoryName={t('public~Resource')}\n chipGroupCollapsedText={t('public~{{numRemaining}} more', {\n numRemaining: '${remaining}',\n })}\n chipGroupExpandedText={t('public~Show less')}\n >\n <ResourceListDropdown\n selected={[...selectedItems]}\n onChange={updateSelectedItems}\n recentList={true}\n />\n </ToolbarFilter>\n </ToolbarItem>\n <ToolbarItem className=\"co-search-group__filter\">\n <ToolbarFilter\n deleteChipGroup={clearLabelFilter}\n chips={[...labelFilter]}\n deleteChip={removeLabelFilter}\n categoryName={t('public~Label')}\n >\n <ToolbarFilter\n chips={typeaheadNameFilter.length > 0 ? [typeaheadNameFilter] : []}\n deleteChip={clearNameFilter}\n categoryName={t('public~Name')}\n >\n <SearchFilterDropdown\n onChange={updateSearchFilter}\n nameFilterInput={typeaheadNameFilter}\n labelFilterInput={labelFilterInput}\n />\n </ToolbarFilter>\n </ToolbarFilter>\n </ToolbarItem>\n </ToolbarContent>\n </Toolbar>\n </PageSection>\n <Divider component=\"div\" />\n <PageSection variant={PageSectionVariants.light}>\n <Accordion asDefinitionList={false}>\n {[...selectedItems].map((resource) => {\n const isCollapsed = collapsedKinds.has(resource);\n return (\n <div key={resource} className=\"co-search__accordion\">\n <AccordionItem>\n <AccordionToggle\n className=\"co-search__accordion-toggle\"\n onClick={() => toggleKindExpanded(resource)}\n isExpanded={!isCollapsed}\n id={`${resource}-toggle`}\n >\n {getToggleText(resource)}\n {perspective !== 'admin' && pinnedResourcesLoaded && (\n <Button\n className=\"co-search-group__pin-toggle\"\n variant={ButtonVariant.link}\n onClick={(e) => pinToggle(e, resource)}\n >\n {pinnedResources.includes(resource) ? (\n <>\n <MinusCircleIcon className=\"co-search-group__pin-toggle__icon\" />\n {t('public~Remove from navigation')}\n </>\n ) : (\n <>\n <PlusCircleIcon className=\"co-search-group__pin-toggle__icon\" />\n {t('public~Add to navigation')}\n </>\n )}\n </Button>\n )}\n </AccordionToggle>\n <AccordionContent isHidden={isCollapsed}>\n {!isCollapsed && (\n <ResourceList\n kind={resource}\n selector={selectorFromString(labelFilter.join(','))}\n nameFilter={typeaheadNameFilter}\n namespace={namespace}\n mock={noProjectsAvailable}\n key={resource}\n />\n )}\n </AccordionContent>\n </AccordionItem>\n </div>\n );\n })}\n </Accordion>\n {selectedItems.size === 0 && (\n <MsgBox\n title={t('public~No resources selected')}\n detail={<p>{t('public~Select one or more resources from the dropdown.')}</p>}\n />\n )}\n </PageSection>\n </>\n );\n};\n\nexport const SearchPage = withStartGuide(SearchPage_);\n\nexport type SearchProps = {\n namespace?: string;\n noProjectsAvailable?: boolean;\n};\n","const SDK_API_DISCOVERY_RESOURCES_LOCAL_STORAGE_KEY = 'sdk/api-discovery-resources';\n\nexport const cacheResources = (resources) => {\n try {\n localStorage.setItem(SDK_API_DISCOVERY_RESOURCES_LOCAL_STORAGE_KEY, JSON.stringify(resources));\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Error caching API resources in localStorage', e);\n throw new Error(e);\n }\n};\n\nexport const getCachedResources = async () => {\n const resourcesJSON = localStorage.getItem(SDK_API_DISCOVERY_RESOURCES_LOCAL_STORAGE_KEY);\n if (!resourcesJSON) {\n throw new Error(\n `No API resources found in localStorage for key ${SDK_API_DISCOVERY_RESOURCES_LOCAL_STORAGE_KEY}`,\n );\n }\n\n // Clear cached resources after load as a safeguard. If there's any errors\n // with the content that prevents the console from working, the bad data\n // will not be loaded when the user refreshes the console. The cache will\n // be refreshed when discovery completes.\n localStorage.removeItem(SDK_API_DISCOVERY_RESOURCES_LOCAL_STORAGE_KEY);\n\n const resources = JSON.parse(resourcesJSON);\n // eslint-disable-next-line no-console\n console.log('Loaded cached API resources from localStorage');\n return resources;\n};\n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"SSARQuery\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"resource\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"verb\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"group\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"namespace\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"selfSubjectAccessReview\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"resource\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"resource\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"verb\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"verb\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"group\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"group\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"namespace\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"namespace\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"allowed\"},\"arguments\":[],\"directives\":[]}]}}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"SSRQuery\"},\"variableDefinitions\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"selfSubjectReview\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"userInfo\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"uid\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"username\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"groups\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"extra\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":378}};\n doc.loc.source = {\"body\":\"query SSARQuery($resource: String, $verb: String, $group: String, $namespace: String) {\\n selfSubjectAccessReview(resource: $resource, verb: $verb, group: $group, namespace: $namespace) {\\n status {\\n allowed\\n }\\n }\\n}\\n\\nquery SSRQuery {\\n selfSubjectReview {\\n status {\\n userInfo {\\n uid,\\n username,\\n groups,\\n extra\\n }\\n }\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n\n module.exports = doc;\n \n module.exports[\"SSARQuery\"] = oneQuery(doc, \"SSARQuery\");\n \n module.exports[\"SSRQuery\"] = oneQuery(doc, \"SSRQuery\");\n \n","import {\n ClusterUpdateStatus,\n getClusterUpdateStatus,\n} from '@console/internal/module/k8s/cluster-settings';\nimport { ClusterVersionKind } from '@console/internal/module/k8s/types';\n\nexport const isClusterUpdateActivity = (cv: ClusterVersionKind) =>\n getClusterUpdateStatus(cv) === ClusterUpdateStatus.Updating;\n\nexport const getClusterUpdateTimestamp = (cv: ClusterVersionKind) =>\n cv && cv.status && cv.status.history[0] ? new Date(cv.status.history[0].startedTime) : null;\n","import * as React from 'react';\n\nexport const usePrevious = <P = any>(value: P, deps?: any[]): P => {\n const ref = React.useRef<P>();\n React.useEffect(() => {\n ref.current = value;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps || [value]);\n return ref.current;\n};\n","import { NamespaceModel, ProjectModel } from '@console/internal/models';\nimport { k8sGet } from '@console/internal/module/k8s';\nimport { ALL_NAMESPACES_KEY } from '@console/shared/src/constants';\n\nexport const checkNamespaceExists = async (ns: string, useProjects: boolean): Promise<boolean> => {\n if (!ns) {\n return false;\n }\n if (ns === ALL_NAMESPACES_KEY) {\n return true;\n }\n try {\n await k8sGet(useProjects ? ProjectModel : NamespaceModel, ns);\n return true;\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('Error fetching namespace', e);\n return false;\n }\n};\n","import * as React from 'react';\nimport { useResolvedExtensions } from '@console/dynamic-plugin-sdk/src/api/useResolvedExtensions';\nimport { K8sResourceCommon } from '@console/dynamic-plugin-sdk/src/extensions/console-types';\nimport {\n isDetailsItem,\n DetailsItem,\n DetailsItemColumn,\n} from '@console/dynamic-plugin-sdk/src/extensions/details-item';\nimport { ResolvedExtension, ExtensionTypeGuard } from '@console/dynamic-plugin-sdk/src/types';\nimport { referenceFor, referenceForExtensionModel } from '@console/internal/module/k8s/k8s';\n\n/**\n * A hook to retrieve sorted details item extensions for a given resource and column.\n *\n * @param obj The k8s resource for which details are being rendered.\n * @param column The column in which the details item will be rendered.\n * @returns A sorted list of details item extensions for the given resource and column. Null safe.\n */\nexport const useDetailsItemExtensionsForResource: UseDetailsItemExtensionsForResource = (\n obj,\n column,\n) => {\n const typeGuard = React.useCallback<ExtensionTypeGuard<DetailsItem>>(\n (e): e is DetailsItem => {\n const columnMatches = e.properties.column === column;\n const modelMatches = referenceFor(obj) === referenceForExtensionModel(e.properties.model);\n return isDetailsItem(e) && modelMatches && columnMatches;\n },\n [obj, column],\n );\n\n const [extensions] = useResolvedExtensions<DetailsItem>(typeGuard);\n\n return React.useMemo(\n () =>\n (extensions ?? []).sort((a, b) => {\n const aWeight = Number(a.properties.sortWeight);\n const bWeight = Number(b.properties.sortWeight);\n if (Number.isNaN(aWeight)) {\n return 1;\n }\n if (Number.isNaN(bWeight)) {\n return -1;\n }\n return aWeight - bWeight;\n }),\n [extensions],\n );\n};\n\ntype UseDetailsItemExtensionsForResource = (\n obj: K8sResourceCommon,\n column: DetailsItemColumn,\n) => ResolvedExtension<DetailsItem>[];\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport { K8sResourceCommon } from '@console/dynamic-plugin-sdk/src/extensions/console-types';\nimport { DetailsItem as DetailsItemExtension } from '@console/dynamic-plugin-sdk/src/extensions/details-item';\nimport { ResolvedExtension } from '@console/dynamic-plugin-sdk/src/types';\nimport { DetailsItem } from '@console/internal/components/utils/details-item';\n\nexport const ExtensionDetailsItem: ExtensionDetailsItemComponent = ({ extension, obj }) => {\n const { path, title, component: Component, id } = extension.properties;\n const sortWeight = extension.properties.sortWeight ?? 'none';\n const value = _.get(obj, path);\n if (!Component && typeof value === 'object') {\n // eslint-disable-next-line no-console\n console.warn(\n `Invalid 'console.resource/details-item' extension: '${id}'. The value referenced at path '${path}' must be primitive if not accompanied by a custom component.`,\n );\n }\n const content = Component ? (\n <Component obj={obj} path={path} value={value} />\n ) : (\n (value ?? '-').toString()\n );\n\n return (\n <DetailsItem\n obj={obj}\n path={path}\n label={title}\n labelClassName={`details-item__sort-weight-${sortWeight}`} // for visibility\n >\n {content}\n </DetailsItem>\n );\n};\n\ntype ExtensionDetailsItemProps = {\n obj: K8sResourceCommon;\n extension: ResolvedExtension<DetailsItemExtension>;\n};\ntype ExtensionDetailsItemComponent = (props: ExtensionDetailsItemProps) => React.ReactElement;\n","module.exports = __webpack_public_path__ + \"assets/packages/knative-plugin/src/imgs/event-sink.svg\";","module.exports = __webpack_public_path__ + \"assets/packages/knative-plugin/src/imgs/event-source.svg\";","import { Extension, ExtensionDeclaration, CodeRef } from '../types';\n\nexport type DataSource = ExtensionDeclaration<\n 'console.dashboards/datasource',\n {\n contextId: string;\n /** Returns a extension function that provides a custom data source object */\n getDataSource: CodeRef<(dataSourceID: string) => Promise<CustomDataSource>>;\n }\n>;\n\nexport const isDataSource = (e: Extension): e is DataSource => {\n return e.type === 'console.dashboards/datasource';\n};\n\nexport type CustomDataSource = {\n basePath: string;\n dataSourceType: string;\n};\n","import classNames from 'classnames';\nimport * as _ from 'lodash-es';\nimport {\n PrometheusData,\n PrometheusEndpoint,\n PrometheusLabels,\n YellowExclamationTriangleIcon,\n} from '@console/dynamic-plugin-sdk';\nimport { Alert, Button } from '@patternfly/react-core';\nimport { ChartLineIcon } from '@patternfly/react-icons/dist/esm/icons/chart-line-icon';\nimport { CompressIcon } from '@patternfly/react-icons/dist/esm/icons/compress-icon';\nimport {\n ISortBy,\n sortable,\n TableGridBreakpoint,\n TableVariant,\n wrappable,\n} from '@patternfly/react-table';\nimport {\n Table as TableDeprecated,\n TableHeader as TableHeaderDeprecated,\n TableBody as TableBodyDeprecated,\n} from '@patternfly/react-table/deprecated';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { queryBrowserTheme } from '@console/shared/src/components/query-browser';\n\nimport {\n queryBrowserToggleAllSeries,\n queryBrowserToggleSeries,\n toggleGraphs,\n} from '../../actions/observe';\nimport { RootState } from '../../redux';\nimport { getPrometheusURL } from '../graphs/helpers';\nimport { LoadingInline, usePoll, useSafeFetch } from '../utils';\nimport TablePagination from './table-pagination';\nimport { PrometheusAPIError } from './types';\n\nexport const ToggleGraph: React.FC = () => {\n const { t } = useTranslation();\n\n const hideGraphs = useSelector(({ observe }: RootState) => !!observe.get('hideGraphs'));\n\n const dispatch = useDispatch();\n const toggle = React.useCallback(() => dispatch(toggleGraphs()), [dispatch]);\n\n const icon = hideGraphs ? <ChartLineIcon /> : <CompressIcon />;\n\n return (\n <Button\n type=\"button\"\n className=\"pf-m-link--align-right query-browser__toggle-graph\"\n onClick={toggle}\n variant=\"link\"\n >\n {icon} {hideGraphs ? t('public~Show graph') : t('public~Hide graph')}\n </Button>\n );\n};\n\nconst SeriesButton: React.FC<SeriesButtonProps> = ({ index, labels }) => {\n const { t } = useTranslation();\n\n const colors = queryBrowserTheme.line.colorScale;\n\n const [colorIndex, isDisabled, isSeriesEmpty] = useSelector(({ observe }: RootState) => {\n const disabledSeries = observe.getIn(['queryBrowser', 'queries', index, 'disabledSeries']);\n if (_.some(disabledSeries, (s) => _.isEqual(s, labels))) {\n return [null, true, false];\n }\n\n const series = observe.getIn(['queryBrowser', 'queries', index, 'series']);\n if (_.isEmpty(series)) {\n return [null, false, true];\n }\n\n const colorOffset = observe\n .getIn(['queryBrowser', 'queries'])\n .take(index)\n .filter((q) => q.get('isEnabled'))\n .reduce((sum, q) => sum + _.size(q.get('series')), 0);\n const seriesIndex = _.findIndex(series, (s) => _.isEqual(s, labels));\n return [(colorOffset + seriesIndex) % colors.length, false, false];\n });\n\n const dispatch = useDispatch();\n const toggleSeries = React.useCallback(() => dispatch(queryBrowserToggleSeries(index, labels)), [\n dispatch,\n index,\n labels,\n ]);\n\n if (isSeriesEmpty) {\n return <div className=\"query-browser__series-btn-wrap\"></div>;\n }\n const title = isDisabled ? t('public~Show series') : t('public~Hide series');\n\n return (\n <div className=\"query-browser__series-btn-wrap\">\n <Button\n aria-label={title}\n className={classNames('query-browser__series-btn', {\n 'query-browser__series-btn--disabled': isDisabled,\n })}\n onClick={toggleSeries}\n style={colorIndex === null ? undefined : { backgroundColor: colors[colorIndex] }}\n title={title}\n type=\"button\"\n variant=\"plain\"\n />\n </div>\n );\n};\n\nexport const QueryTable: React.FC<QueryTableProps> = ({ index, namespace }) => {\n const { t } = useTranslation();\n\n const [data, setData] = React.useState<PrometheusData>();\n const [error, setError] = React.useState<PrometheusAPIError>();\n const [page, setPage] = React.useState(1);\n const [perPage, setPerPage] = React.useState(50);\n const [sortBy, setSortBy] = React.useState<ISortBy>({});\n\n const isEnabled = useSelector(({ observe }: RootState) =>\n observe.getIn(['queryBrowser', 'queries', index, 'isEnabled']),\n );\n const isExpanded = useSelector(({ observe }: RootState) =>\n observe.getIn(['queryBrowser', 'queries', index, 'isExpanded']),\n );\n const pollInterval = useSelector(({ observe }: RootState) =>\n observe.getIn(['queryBrowser', 'pollInterval'], 15 * 1000),\n );\n const query = useSelector(({ observe }: RootState) =>\n observe.getIn(['queryBrowser', 'queries', index, 'query']),\n );\n const series = useSelector(({ observe }: RootState) =>\n observe.getIn(['queryBrowser', 'queries', index, 'series']),\n );\n const span = useSelector(({ observe }: RootState) => observe.getIn(['queryBrowser', 'timespan']));\n\n const lastRequestTime = useSelector(({ observe }: RootState) =>\n observe.getIn(['queryBrowser', 'lastRequestTime']),\n );\n\n const dispatch = useDispatch();\n\n const toggleAllSeries = React.useCallback(() => dispatch(queryBrowserToggleAllSeries(index)), [\n dispatch,\n index,\n ]);\n\n const isDisabledSeriesEmpty = useSelector(({ observe }: RootState) =>\n _.isEmpty(observe.getIn(['queryBrowser', 'queries', index, 'disabledSeries'])),\n );\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const safeFetch = React.useCallback(useSafeFetch(), []);\n\n const tick = () => {\n if (isEnabled && isExpanded && query) {\n safeFetch(getPrometheusURL({ endpoint: PrometheusEndpoint.QUERY, namespace, query }))\n .then((response) => {\n setData(_.get(response, 'data'));\n setError(undefined);\n })\n .catch((err) => {\n if (err.name !== 'AbortError') {\n setData(undefined);\n setError(err);\n }\n });\n }\n };\n\n usePoll(tick, pollInterval, namespace, query, span, lastRequestTime);\n\n React.useEffect(() => {\n setData(undefined);\n setError(undefined);\n setPage(1);\n setSortBy({});\n }, [namespace, query]);\n\n if (!isEnabled || !isExpanded || !query) {\n return null;\n }\n\n if (error) {\n return (\n <div className=\"query-browser__table-message\">\n <Alert\n className=\"co-alert\"\n isInline\n title={t('public~Error loading values')}\n variant=\"danger\"\n >\n {_.get(error, 'json.error', error.message)}\n </Alert>\n </div>\n );\n }\n\n if (!data) {\n return (\n <div className=\"query-browser__table-message\">\n <LoadingInline />\n </div>\n );\n }\n\n // Add any data series from `series` (those displayed in the graph) that are not in `data.result`.\n // This happens for queries that exclude a series currently, but included that same series at some\n // point during the graph's range.\n const expiredSeries = _.differenceWith(series, data.result, (s, r) => _.isEqual(s, r.metric));\n const result = expiredSeries.length\n ? [...data.result, ...expiredSeries.map((metric) => ({ metric }))]\n : data.result;\n\n if (!result || result.length === 0) {\n return (\n <div className=\"query-browser__table-message\">\n <YellowExclamationTriangleIcon /> {t('public~No datapoints found.')}\n </div>\n );\n }\n\n const transforms = [sortable, wrappable];\n\n const buttonCell = (labels) => ({ title: <SeriesButton index={index} labels={labels} /> });\n\n let columns, rows;\n if (data.resultType === 'scalar') {\n columns = ['', { title: t('public~Value'), transforms }];\n rows = [[buttonCell({}), _.get(result, '[1]')]];\n } else if (data.resultType === 'string') {\n columns = [{ title: t('public~Value'), transforms }];\n rows = [[result?.[1]]];\n } else {\n const allLabelKeys = _.uniq(_.flatMap(result, ({ metric }) => Object.keys(metric))).sort();\n\n columns = [\n '',\n ...allLabelKeys.map((k) => ({\n title: <span>{k === '__name__' ? t('public~Name') : k}</span>,\n transforms,\n })),\n { title: t('public~Value'), transforms },\n ];\n\n let rowMapper;\n if (data.resultType === 'matrix') {\n rowMapper = ({ metric, values }) => [\n '',\n ..._.map(allLabelKeys, (k) => metric[k]),\n {\n title: (\n <>\n {_.map(values, ([time, v]) => (\n <div key={time}>\n {v} @{time}\n </div>\n ))}\n </>\n ),\n },\n ];\n } else {\n rowMapper = ({ metric, value }) => [\n buttonCell(metric),\n ..._.map(allLabelKeys, (k) => metric[k]),\n _.get(value, '[1]', { title: <span className=\"text-muted\">{t('public~None')}</span> }),\n ];\n }\n\n rows = _.map(result, rowMapper);\n if (sortBy) {\n // Sort Values column numerically and sort all the other columns alphabetically\n const valuesColIndex = allLabelKeys.length + 1;\n const sort =\n sortBy.index === valuesColIndex\n ? (cells) => {\n const v = Number(cells[valuesColIndex]);\n return Number.isNaN(v) ? 0 : v;\n }\n : `${sortBy.index}`;\n rows = _.orderBy(rows, [sort], [sortBy.direction]);\n }\n }\n\n const onSort = (e, i, direction) => setSortBy({ index: i, direction });\n\n const tableRows = rows.slice((page - 1) * perPage, page * perPage).map((cells) => ({ cells }));\n\n return (\n <>\n <div className=\"query-browser__table-wrapper\">\n <div className=\"horizontal-scroll\">\n <Button\n variant=\"link\"\n isInline\n onClick={toggleAllSeries}\n className=\"query-browser__series-select-all-btn\"\n >\n {isDisabledSeriesEmpty ? t('public~Unselect all') : t('public~Select all')}\n </Button>\n <TableDeprecated\n aria-label={t('public~query results table')}\n cells={columns}\n gridBreakPoint={TableGridBreakpoint.none}\n onSort={onSort}\n rows={tableRows}\n sortBy={sortBy}\n variant={TableVariant.compact}\n >\n <TableHeaderDeprecated />\n <TableBodyDeprecated />\n </TableDeprecated>\n </div>\n </div>\n <TablePagination\n itemCount={rows.length}\n page={page}\n perPage={perPage}\n setPage={setPage}\n setPerPage={setPerPage}\n />\n </>\n );\n};\n\ntype QueryTableProps = {\n index: number;\n namespace?: string;\n};\n\ntype SeriesButtonProps = {\n index: number;\n labels: PrometheusLabels;\n};\n","export * from './usePreferredCreateEditMethod';\n","import * as React from 'react';\nimport { CellMeasurer } from 'react-virtualized';\nimport { RenderCell, RenderHeader, GridChildrenProps, Item, CellItem } from './types';\nimport { CellMeasurementContext } from './utils';\n\ntype CellProps = {\n renderCell: RenderCell;\n renderHeader?: RenderHeader;\n style?: React.CSSProperties;\n} & GridChildrenProps;\n\nconst Cell: React.FC<CellProps> = ({\n data,\n columnCount,\n items,\n rowCount,\n style: { width, ...style },\n renderCell,\n renderHeader,\n}) => {\n const { cache, cellMargin } = React.useContext(CellMeasurementContext);\n const { key, columnIndex, rowIndex, parent } = data;\n const index = rowIndex * columnCount + columnIndex;\n const item: CellItem = items[index];\n const isItemString = typeof item === 'string';\n\n const cellStyle = {\n ...style,\n width: isItemString ? '100%' : width,\n padding: `${cellMargin}px ${cellMargin}px ${\n rowIndex === rowCount - 1 ? `${cellMargin}px` : 0\n } ${cellMargin}px`,\n };\n\n return item ? (\n <CellMeasurer\n cache={cache}\n columnIndex={columnIndex}\n key={key}\n parent={parent}\n rowIndex={rowIndex}\n >\n <div role=\"gridcell\" style={cellStyle}>\n {isItemString ? renderHeader(item as string) : renderCell(item as Item)}\n </div>\n </CellMeasurer>\n ) : null;\n};\n\nexport default Cell;\n","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/apache.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/golang.svg\";","export * from './gitops';\n","import * as _ from 'lodash';\nimport { KebabAction } from '@console/internal/components/utils';\nimport { DeploymentConfigModel, DeploymentModel } from '@console/internal/models';\nimport { K8sKind, referenceForModel } from '@console/internal/module/k8s';\nimport { setKnatify, addTrigger, addSubscription, setSinkSource } from '../actions';\nimport { CamelKameletBindingModel, EventingBrokerModel } from '../models';\nimport {\n getDynamicEventSourcesModelRefs,\n isEventingChannelResourceKind,\n} from './fetch-dynamic-eventsources-utils';\n\nexport const getKebabActionsForKind = (resourceKind: K8sKind): KebabAction[] => {\n const menuActions: KebabAction[] = [];\n const eventSourceModelrefs: string[] = getDynamicEventSourcesModelRefs();\n if (resourceKind) {\n // remove this after migrating the menu actions in the DefaultDetailsPage and DefaultListPage\n if (\n _.includes(eventSourceModelrefs, referenceForModel(resourceKind)) ||\n referenceForModel(resourceKind) === referenceForModel(CamelKameletBindingModel)\n ) {\n menuActions.push(setSinkSource);\n }\n if (referenceForModel(resourceKind) === referenceForModel(EventingBrokerModel)) {\n menuActions.push(addTrigger);\n }\n if (isEventingChannelResourceKind(referenceForModel(resourceKind))) {\n menuActions.push(addSubscription);\n }\n }\n return menuActions;\n};\n\nexport const getKebabActionsForWorkload = (resourceKind: K8sKind): KebabAction[] => {\n const menuActions: KebabAction[] = [];\n if (\n resourceKind &&\n (referenceForModel(resourceKind) === referenceForModel(DeploymentModel) ||\n referenceForModel(resourceKind) === referenceForModel(DeploymentConfigModel))\n ) {\n menuActions.push(setKnatify);\n }\n return menuActions;\n};\n","import { WatchK8sResources } from '@console/dynamic-plugin-sdk';\nimport { referenceForModel } from '@console/internal/module/k8s';\nimport { ClusterServiceVersionModel } from '@console/operator-lifecycle-manager/src';\nimport { ServiceBindingModel } from '@console/service-binding-plugin/src/models';\n\nexport const getOperatorWatchedResources = (namespace: string): WatchK8sResources<any> => {\n return {\n clusterServiceVersions: {\n isList: true,\n kind: referenceForModel(ClusterServiceVersionModel),\n namespace,\n optional: true,\n },\n };\n};\n\nexport const getServiceBindingWatchedResources = (namespace: string): WatchK8sResources<any> => {\n return {\n serviceBindingRequests: {\n isList: true,\n kind: referenceForModel(ServiceBindingModel),\n namespace,\n optional: true,\n },\n };\n};\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n Dropdown as DropdownDeprecated,\n DropdownToggle as DropdownToggleDeprecated,\n DropdownItem as DropdownItemDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { CaretDownIcon } from '@patternfly/react-icons/dist/esm/icons/caret-down-icon';\nimport { FilterIcon } from '@patternfly/react-icons/dist/esm/icons/filter-icon';\nimport { TextFilter } from './factory';\n\nexport enum searchFilterValues {\n // t('public~Label')\n Label = 'Label',\n // t('public~Name')\n Name = 'Name',\n}\n\nexport const SearchFilterDropdown: React.SFC<SearchFilterDropdownProps> = (props) => {\n const [isOpen, setOpen] = React.useState(false);\n const [selected, setSelected] = React.useState(searchFilterValues.Label);\n\n const { onChange, nameFilterInput, labelFilterInput } = props;\n\n const { t } = useTranslation();\n\n const onToggle = (_event, open: boolean) => setOpen(open);\n const onSelect = (event: React.SyntheticEvent) => {\n setSelected((event.target as HTMLInputElement).name as searchFilterValues);\n setOpen(!isOpen);\n };\n const dropdownItems = [\n <DropdownItemDeprecated\n key=\"label-action\"\n data-test=\"label-filter\"\n name={searchFilterValues.Label}\n component=\"button\"\n >\n {t(searchFilterValues.Label)}\n </DropdownItemDeprecated>,\n <DropdownItemDeprecated\n key=\"name-action\"\n data-test=\"name-filter\"\n name={searchFilterValues.Name}\n component=\"button\"\n >\n {t(searchFilterValues.Name)}\n </DropdownItemDeprecated>,\n ];\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n const { value } = e.target as HTMLInputElement;\n onChange(selected, value, true);\n }\n };\n\n const handleInputValue = (_event, value: string) => {\n onChange(selected, value, false);\n };\n\n return (\n <div className=\"pf-v5-c-input-group\">\n <DropdownDeprecated\n onSelect={onSelect}\n toggle={\n <DropdownToggleDeprecated\n id=\"toggle-id\"\n onToggle={onToggle}\n toggleIndicator={CaretDownIcon}\n >\n <>\n <FilterIcon className=\"span--icon__right-margin\" /> {t(selected)}\n </>\n </DropdownToggleDeprecated>\n }\n isOpen={isOpen}\n dropdownItems={dropdownItems}\n />\n <TextFilter\n parentClassName=\"co-search__filter-input\"\n onChange={handleInputValue}\n placeholder={selected === searchFilterValues.Label ? 'app=frontend' : 'my-resource'}\n name=\"search-filter-input\"\n id=\"search-filter-input\"\n value={selected === searchFilterValues.Label ? labelFilterInput : nameFilterInput}\n onKeyDown={handleKeyDown}\n aria-labelledby=\"toggle-id\"\n />\n </div>\n );\n};\n\nexport type SearchFilterDropdownProps = {\n onChange: (type: string, value: string, endOfString: boolean) => void;\n nameFilterInput: string;\n labelFilterInput: string;\n};\n","import * as React from 'react';\nimport { useParams } from 'react-router-dom-v5-compat';\nimport { useCreateResourceExtension } from '@console/shared/src/hooks/create-resource-hook';\nimport { ErrorBoundaryPage } from '@console/shared/src/components/error';\nimport { AsyncComponent } from './utils';\n\nconst CreateResource: React.FC = () => {\n const params = useParams();\n const createResourceExtension = useCreateResourceExtension(params.plural);\n\n return createResourceExtension ? (\n <ErrorBoundaryPage>\n <AsyncComponent loader={createResourceExtension.properties.component} namespace={params.ns} />\n </ErrorBoundaryPage>\n ) : (\n <AsyncComponent\n loader={() =>\n import('./create-yaml' /* webpackChunkName: \"create-yaml\" */).then((m) => m.CreateYAML)\n }\n />\n );\n};\n\nexport default CreateResource;\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\n\nimport { FLAGS } from '@console/shared';\nimport { connectToFlags } from '../reducers/connectToFlags';\nimport { Firehose, FirehoseResult } from './utils';\nimport { referenceForModel } from '../module/k8s';\nimport { ConsoleNotificationModel } from '../models/index';\n\nconst ConsoleNotifier_: React.FC<ConsoleNotifierProps> = ({ obj, location }) => {\n if (_.isEmpty(obj)) {\n return null;\n }\n\n return (\n <>\n {_.map(_.get(obj, 'data'), (notification) =>\n notification.spec.location === location ||\n notification.spec.location === 'BannerTopBottom' ||\n // notification.spec.location is optional\n // render the notification BannerTop if location is not specified\n (!notification.spec.location && location === 'BannerTop') ? (\n <div\n key={notification.metadata.uid}\n className=\"co-global-notification\"\n style={{\n backgroundColor: notification.spec.backgroundColor,\n color: notification.spec.color,\n }}\n data-test={`${notification.metadata.name}-${notification.spec.location}`}\n >\n <div className=\"co-global-notification__content\">\n <p className=\"co-global-notification__text\">\n {notification.spec.text}{' '}\n {_.get(notification.spec, ['link', 'href']) && (\n <a\n href={notification.spec.link.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"co-external-link\"\n style={{ color: notification.spec.color }}\n >\n {notification.spec.link.text || 'More info'}\n </a>\n )}\n </p>\n </div>\n </div>\n ) : null,\n )}\n </>\n );\n};\nConsoleNotifier_.displayName = 'ConsoleNotifier_';\n\nexport const ConsoleNotifier = connectToFlags(FLAGS.CONSOLE_NOTIFICATION)(({ flags, ...props }) => {\n const resources = flags[FLAGS.CONSOLE_NOTIFICATION]\n ? [\n {\n kind: referenceForModel(ConsoleNotificationModel),\n isList: true,\n prop: 'obj',\n },\n ]\n : [];\n return (\n <Firehose resources={resources}>\n <ConsoleNotifier_ {...(props as ConsoleNotifierProps)} />\n </Firehose>\n );\n});\nConsoleNotifier.displayName = 'ConsoleNotifier';\n\ntype ConsoleNotifierProps = {\n obj: FirehoseResult;\n location: 'BannerTop' | 'BannerBottom' | 'BannerTopBottom';\n};\n","import { STORAGE_PREFIX, CONFIG_STORAGE_CONSOLE } from '@console/shared';\n\nconst STORAGE_CLOUDSHELL = 'terminal';\n\nexport const CLOUD_SHELL_NAMESPACE = `${STORAGE_PREFIX}/command-line-terminal-namespace`;\nexport const CLOUD_SHELL_NAMESPACE_CONFIG_STORAGE_KEY = `${CONFIG_STORAGE_CONSOLE}.${STORAGE_CLOUDSHELL}.namespace`;\n","/* eslint-disable no-console */\n\nimport * as _ from 'lodash';\nimport * as semver from 'semver';\nimport { PluginStore } from '@console/plugin-sdk/src/store';\nimport { getRandomChars } from '@console/shared/src/utils/utils';\nimport {\n AnyConsolePluginManifest,\n StandardConsolePluginManifest,\n isStandardPluginManifest,\n} from '../build-types';\nimport { resolveEncodedCodeRefs } from '../coderefs/coderef-resolver';\nimport { initSharedPluginModules } from '../shared-modules-init';\nimport { RemoteEntryModule } from '../types';\nimport { ErrorWithCause } from '../utils/error/custom-error';\nimport { settleAllPromises } from '../utils/promise';\nimport { resolveURL } from '../utils/url';\nimport { resolvePluginDependencies } from './plugin-dependencies';\nimport { fetchPluginManifest } from './plugin-manifest';\nimport { getPluginID } from './plugin-utils';\n\ntype ConsolePluginData = {\n /** The manifest containing plugin metadata and extension declarations. */\n manifest: StandardConsolePluginManifest;\n /** Indicates if `window.loadPluginEntry` callback has been fired for this plugin. */\n entryCallbackFired: boolean;\n};\n\nconst pluginMap = new Map<string, ConsolePluginData>();\n\nexport const getScriptElementID = (pluginName: string, scriptName: string) =>\n `${pluginName}/${scriptName}`;\n\nconst injectScriptElement = (url: string, id: string) =>\n new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n\n script.async = true;\n script.src = url;\n script.id = id;\n\n script.onload = () => {\n resolve();\n };\n\n script.onerror = (event) => {\n reject(event);\n };\n\n document.head.appendChild(script);\n });\n\nexport const loadDynamicPlugin = (manifest: StandardConsolePluginManifest) =>\n new Promise<string>((resolve, reject) => {\n const pluginID = getPluginID(manifest);\n\n const existingPluginData = Array.from(pluginMap.values()).find(\n (p) => p.manifest.name === manifest.name,\n );\n\n if (existingPluginData) {\n const existingPluginID = getPluginID(existingPluginData.manifest);\n reject(new Error(`Attempt to reload plugin ${existingPluginID} with ${pluginID}`));\n return;\n }\n\n if (manifest.registrationMethod !== 'callback') {\n reject(new Error(`Plugin ${pluginID} does not use callback registration method`));\n return;\n }\n\n pluginMap.set(pluginID, {\n manifest,\n entryCallbackFired: false,\n });\n\n console.info(`Loading scripts of plugin ${pluginID}`);\n\n // eslint-disable-next-line promise/catch-or-return\n settleAllPromises(\n manifest.loadScripts.map((scriptName) => {\n const scriptID = getScriptElementID(manifest.name, scriptName);\n\n const scriptURL = resolveURL(manifest.baseURL, scriptName, (url) => {\n url.search = `?cacheBuster=${getRandomChars()}`;\n return url;\n });\n\n console.info(`Loading plugin script from ${scriptURL}`);\n\n return injectScriptElement(scriptURL, scriptID);\n }),\n ).then(([, rejectedReasons]) => {\n if (rejectedReasons.length > 0) {\n reject(\n new ErrorWithCause(`Detected errors while loading plugin entry scripts`, rejectedReasons),\n );\n return;\n }\n\n if (!pluginMap.get(pluginID).entryCallbackFired) {\n reject(new Error(`Scripts of plugin ${pluginID} loaded without entry callback`));\n return;\n }\n\n resolve(pluginID);\n });\n });\n\nexport const getPluginEntryCallback = (\n pluginStore: PluginStore,\n initSharedPluginModulesCallback: typeof initSharedPluginModules,\n resolveEncodedCodeRefsCallback: typeof resolveEncodedCodeRefs,\n) => (pluginID: string, entryModule: RemoteEntryModule) => {\n if (!pluginMap.has(pluginID)) {\n console.error(`Received callback for unknown plugin ${pluginID}`);\n return;\n }\n\n const pluginData = pluginMap.get(pluginID);\n\n if (pluginData.entryCallbackFired) {\n console.error(`Received callback for already loaded plugin ${pluginID}`);\n return;\n }\n\n pluginData.entryCallbackFired = true;\n\n try {\n initSharedPluginModulesCallback(entryModule);\n } catch (error) {\n console.error(`Failed to initialize shared modules for plugin ${pluginID}`, error);\n return;\n }\n\n const resolvedExtensions = resolveEncodedCodeRefsCallback(\n pluginData.manifest.extensions,\n entryModule,\n pluginID,\n () => {\n console.error(`Code reference resolution failed for plugin ${pluginID}`);\n },\n );\n\n pluginStore.addDynamicPlugin(pluginID, pluginData.manifest, resolvedExtensions);\n};\n\nexport const registerPluginEntryCallback = (pluginStore: PluginStore) => {\n window.loadPluginEntry = getPluginEntryCallback(\n pluginStore,\n initSharedPluginModules,\n resolveEncodedCodeRefs,\n );\n};\n\nexport const adaptPluginManifest = (\n manifest: AnyConsolePluginManifest,\n baseURL: string,\n): StandardConsolePluginManifest => {\n if (isStandardPluginManifest(manifest)) {\n return manifest;\n }\n\n const {\n name,\n version,\n extensions,\n dependencies,\n displayName,\n description,\n disableStaticPlugins,\n } = manifest;\n\n return {\n name,\n version,\n extensions,\n dependencies,\n customProperties: { console: { displayName, description, disableStaticPlugins } },\n baseURL,\n loadScripts: ['plugin-entry.js'],\n registrationMethod: 'callback',\n };\n};\n\nexport const loadAndEnablePlugin = async (\n pluginName: string,\n pluginStore: PluginStore,\n onError: (errorMessage: string, errorCause?: unknown) => void = _.noop,\n) => {\n const baseURL = `${window.SERVER_FLAGS.basePath}api/plugins/${pluginName}/`;\n let manifest: StandardConsolePluginManifest;\n\n try {\n manifest = adaptPluginManifest(await fetchPluginManifest(baseURL), baseURL);\n } catch (e) {\n onError(`Failed to get a valid plugin manifest from ${baseURL}`, e);\n return;\n }\n\n try {\n await resolvePluginDependencies(\n manifest,\n semver.valid(window.SERVER_FLAGS.releaseVersion),\n pluginStore.getAllowedDynamicPluginNames(),\n );\n } catch (e) {\n onError(`Failed to resolve dependencies of plugin ${pluginName}`, e);\n return;\n }\n\n try {\n await loadDynamicPlugin(manifest);\n } catch (e) {\n onError(`Failed to load scripts of plugin ${pluginName}`, e);\n return;\n }\n\n pluginStore.setDynamicPluginEnabled(getPluginID(manifest), true);\n};\n\nexport const getStateForTestPurposes = () => ({\n pluginMap,\n});\n\nexport const resetStateAndEnvForTestPurposes = () => {\n pluginMap.clear();\n\n Array.from(document.scripts).forEach((element) => {\n element.remove();\n });\n\n window.loadPluginEntry = undefined;\n};\n","import { STORAGE_PREFIX } from '@console/shared/src/constants/common';\n\nexport const TYPE_WORKLOAD = 'workload';\nexport const TYPE_CONNECTS_TO = 'connects-to';\nexport const TYPE_AGGREGATE_EDGE = 'aggregate-edge';\nexport const TYPE_SERVICE_BINDING = 'service-binding';\nexport const TYPE_APPLICATION_GROUP = 'part-of';\nexport const TYPE_TRAFFIC_CONNECTOR = 'traffic-connector';\nexport const LAST_TOPOLOGY_VIEW_LOCAL_STORAGE_KEY = `${STORAGE_PREFIX}/last-topology-view`;\nexport const TOPOLOGY_LAYOUT_LOCAL_STORAGE_KEY = `${STORAGE_PREFIX}/topology-layout`;\nexport const LAST_TOPOLOGY_OVERVIEW_OPEN_STORAGE_KEY = `${STORAGE_PREFIX}/last-topology-overview-open`;\n\nconst STORAGE_TOPOLOGY = 'topology';\nconst CONFIG_STORAGE_DEVCONSOLE = 'devconsole';\n\nexport const TOPOLOGY_VIEW_CONFIG_STORAGE_KEY = `${CONFIG_STORAGE_DEVCONSOLE}.${STORAGE_TOPOLOGY}.lastView`;\nexport const TOPOLOGY_LAYOUT_CONFIG_STORAGE_KEY = `${CONFIG_STORAGE_DEVCONSOLE}.${STORAGE_TOPOLOGY}.layout`;\nexport const TOPOLOGY_SIDE_BAR_WIDTH_STORAGE_KEY = `${CONFIG_STORAGE_DEVCONSOLE}.${STORAGE_TOPOLOGY}.sideBarSize`;\n\nexport const DEFAULT_NODE_PAD = 20;\nexport const DEFAULT_GROUP_PAD = 40;\n\nexport const NODE_WIDTH = 104;\nexport const NODE_HEIGHT = 104;\nexport const NODE_PADDING = [0, DEFAULT_NODE_PAD];\n\nexport const GROUP_WIDTH = 300;\nexport const GROUP_HEIGHT = 180;\nexport const GROUP_PADDING = [\n DEFAULT_GROUP_PAD,\n DEFAULT_GROUP_PAD,\n DEFAULT_GROUP_PAD + 20,\n DEFAULT_GROUP_PAD,\n];\n\nexport const CREATE_APPLICATION_KEY = '#CREATE_APPLICATION_KEY#';\nexport const UNASSIGNED_KEY = '#UNASSIGNED_APP#';\n\nexport const ALLOW_EXPORT_APP = 'ALLOW_EXPORT_APP';\nexport const EXPORT_CR_NAME = 'primer';\nexport const EXPORT_JOB_PREFIX = 'primer-export-';\n\nexport const ROUTE_URL_ANNOTATION = 'app.openshift.io/route-url';\nexport const ROUTE_DISABLED_ANNOTATION = 'app.openshift.io/route-disabled';\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport * as classNames from 'classnames';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { Button, Popover } from '@patternfly/react-core';\nimport { sortable } from '@patternfly/react-table';\nimport { EyeIcon } from '@patternfly/react-icons/dist/esm/icons/eye-icon';\nimport { EyeSlashIcon } from '@patternfly/react-icons/dist/esm/icons/eye-slash-icon';\nimport { QuestionCircleIcon } from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';\nimport i18next from 'i18next';\n\nimport { Status } from '@console/shared';\nimport { FLAGS } from '@console/shared/src/constants';\nimport { DetailsPage, ListPage, RowFunctionArgs, Table, TableData } from './factory';\nimport {\n CopyToClipboard,\n DetailsItem,\n Kebab,\n ResourceKebab,\n ResourceLink,\n ResourceSummary,\n SectionHeading,\n detailsPage,\n navFactory,\n ExternalLinkWithCopy,\n} from './utils';\nimport { MaskedData } from './configmap-and-secret-data';\nimport {\n K8sResourceKindReference,\n RouteKind,\n RouteIngress,\n RouteTarget,\n K8sResourceCondition,\n} from '../module/k8s';\nimport { RouteModel } from '../models';\nimport { connectToFlags, WithFlagsProps } from '../reducers/connectToFlags';\nimport { Conditions } from './conditions';\nimport { RouteMetrics } from './routes/route-metrics';\n\nconst RoutesReference: K8sResourceKindReference = 'Route';\nconst menuActions = [...Kebab.getExtensionsActionsForKind(RouteModel), ...Kebab.factory.common];\n\nexport type IngressStatusProps = {\n host: string;\n routerName: string;\n conditions: K8sResourceCondition[];\n wildcardPolicy: string;\n routerCanonicalHostname: string;\n};\n\nconst getRouteHost = (route: RouteKind, onlyAdmitted: boolean): string => {\n let oldestAdmittedIngress: RouteIngress;\n let oldestTransitionTime: string;\n _.each(route.status.ingress, (ingress) => {\n const admittedCondition = _.find(ingress.conditions, { type: 'Admitted', status: 'True' });\n if (\n admittedCondition &&\n (!oldestTransitionTime || oldestTransitionTime > admittedCondition.lastTransitionTime)\n ) {\n oldestAdmittedIngress = ingress;\n oldestTransitionTime = admittedCondition.lastTransitionTime;\n }\n });\n\n if (oldestAdmittedIngress) {\n return oldestAdmittedIngress.host;\n }\n\n return onlyAdmitted ? null : route.spec.host;\n};\n\nconst isWebRoute = (route: RouteKind): boolean => {\n return !!getRouteHost(route, true) && _.get(route, 'spec.wildcardPolicy') !== 'Subdomain';\n};\n\nexport const getRouteWebURL = (route: RouteKind): string => {\n const scheme = _.get(route, 'spec.tls.termination') ? 'https' : 'http';\n let url = `${scheme}://${getRouteHost(route, false)}`;\n if (route.spec.path) {\n url += route.spec.path;\n }\n return url;\n};\n\nconst getSubdomain = (route: RouteKind): string => {\n const hostname = _.get(route, 'spec.host', '');\n return hostname.replace(/^[a-z0-9]([-a-z0-9]*[a-z0-9])\\./, '');\n};\n\nexport const getRouteLabel = (route: RouteKind): string => {\n if (isWebRoute(route)) {\n return getRouteWebURL(route);\n }\n\n let label = getRouteHost(route, false);\n if (!label) {\n return i18next.t('public~unknown host');\n }\n\n if (_.get(route, 'spec.wildcardPolicy') === 'Subdomain') {\n label = `*.${getSubdomain(route)}`;\n }\n\n if (route.spec.path) {\n label += route.spec.path;\n }\n return label;\n};\n\nexport const RouteLinkAndCopy: React.FC<RouteLinkAndCopyProps> = ({\n route,\n additionalClassName,\n}) => {\n const link = getRouteWebURL(route);\n return (\n <ExternalLinkWithCopy\n additionalClassName={additionalClassName}\n link={link}\n text={link}\n dataTestID=\"route-link\"\n />\n );\n};\n\n// Renders LinkAndCopy for non subdomains\nexport const RouteLocation: React.FC<RouteHostnameProps> = ({ obj }) => (\n <div className=\"co-break-word\">\n {isWebRoute(obj) ? (\n <RouteLinkAndCopy route={obj} additionalClassName=\"co-external-link--block\" />\n ) : (\n getRouteLabel(obj)\n )}\n </div>\n);\nRouteLocation.displayName = 'RouteLocation';\n\nexport const routeStatus = (route: RouteKind): string => {\n let atLeastOneAdmitted: boolean = false;\n\n if (!route.status || !route.status.ingress) {\n return 'Pending';\n }\n\n _.each(route.status.ingress, (ingress) => {\n const isAdmitted = _.some(ingress.conditions, { type: 'Admitted', status: 'True' });\n if (isAdmitted) {\n atLeastOneAdmitted = true;\n }\n });\n\n return atLeastOneAdmitted ? 'Accepted' : 'Rejected';\n};\n\nexport const RouteStatus: React.FC<RouteStatusProps> = ({ obj: route }) => {\n const status: string = routeStatus(route);\n return <Status status={status} />;\n};\nRouteStatus.displayName = 'RouteStatus';\n\nconst tableColumnClasses = [\n '',\n '',\n // Status is less important than Location, so hide it earlier, but maintain its position for consistency with other tables\n classNames('pf-m-hidden', 'pf-m-visible-on-lg', 'pf-v5-u-w-16-on-lg'),\n classNames('pf-m-hidden', 'pf-m-visible-on-sm'),\n classNames('pf-m-hidden', 'pf-m-visible-on-lg'),\n Kebab.columnClass,\n];\n\nconst kind = 'Route';\n\nconst RouteTableRow: React.FC<RowFunctionArgs<RouteKind>> = ({ obj: route }) => {\n return (\n <>\n <TableData className={tableColumnClasses[0]}>\n <ResourceLink kind={kind} name={route.metadata.name} namespace={route.metadata.namespace} />\n </TableData>\n <TableData\n className={classNames(tableColumnClasses[1], 'co-break-word')}\n columnID=\"namespace\"\n >\n <ResourceLink kind=\"Namespace\" name={route.metadata.namespace} />\n </TableData>\n <TableData className={tableColumnClasses[2]}>\n <RouteStatus obj={route} />\n </TableData>\n <TableData className={classNames(tableColumnClasses[3], 'co-break-word')}>\n <RouteLocation obj={route} />\n </TableData>\n <TableData className={tableColumnClasses[4]}>\n <ResourceLink\n kind=\"Service\"\n name={route.spec.to.name}\n namespace={route.metadata.namespace}\n title={route.spec.to.name}\n />\n </TableData>\n <TableData className={tableColumnClasses[5]}>\n <ResourceKebab actions={menuActions} kind={kind} resource={route} />\n </TableData>\n </>\n );\n};\n\nconst TLSSettings: React.FC<TLSSettingsProps> = ({ route }) => {\n const [showKey, setShowKey] = React.useState(false);\n const { t } = useTranslation();\n const { tls } = route.spec;\n if (!tls) {\n return <>{t('public~TLS is not enabled')}.</>;\n }\n\n const visibleKeyValue = showKey ? tls.key : <MaskedData />;\n return (\n <dl>\n <DetailsItem label={t('public~Termination type')} obj={route} path=\"spec.tls.termination\" />\n <DetailsItem\n label={t('public~Insecure traffic')}\n obj={route}\n path=\"spec.tls.insecureEdgeTerminationPolicy\"\n />\n <DetailsItem label={t('public~Certificate')} obj={route} path=\"spec.tls.certificate\">\n {tls.certificate ? <CopyToClipboard value={tls.certificate} /> : '-'}\n </DetailsItem>\n <dt className=\"co-m-route-tls-reveal__title\">\n {t('public~Key')}{' '}\n {tls.key && (\n <Button\n className=\"pf-m-link--align-left\"\n type=\"button\"\n onClick={() => setShowKey(!showKey)}\n variant=\"link\"\n >\n {showKey ? (\n <>\n <EyeSlashIcon className=\"co-icon-space-r\" />\n {t('public~Hide')}\n </>\n ) : (\n <>\n <EyeIcon className=\"co-icon-space-r\" />\n {t('public~Reveal')}\n </>\n )}\n </Button>\n )}\n </dt>\n <dd>{tls.key ? <CopyToClipboard value={tls.key} visibleValue={visibleKeyValue} /> : '-'}</dd>\n <DetailsItem label={t('public~CA certificate')} obj={route} path=\"spec.tls.caCertificate\">\n {tls.certificate ? <CopyToClipboard value={tls.caCertificate} /> : '-'}\n </DetailsItem>\n {tls.termination === 'reencrypt' && (\n <DetailsItem\n label={t('public~Destination CA certificate')}\n obj={route}\n path=\"spec.tls.destinationCACertificate\"\n >\n {tls.destinationCACertificate ? (\n <CopyToClipboard value={tls.destinationCACertificate} />\n ) : (\n '-'\n )}\n </DetailsItem>\n )}\n </dl>\n );\n};\n\nconst calcTrafficPercentage = (weight: number, route: any) => {\n if (!weight) {\n return '-';\n }\n\n const totalWeight = _.reduce(\n route.spec.alternateBackends,\n (result, alternate) => {\n return (result += alternate.weight);\n },\n route.spec.to.weight,\n );\n\n const percentage = (weight / totalWeight) * 100;\n\n return `${percentage.toFixed(1)}%`;\n};\n\nconst getIngressStatusForHost = (\n hostname: string,\n ingresses: RouteIngress[],\n): IngressStatusProps => {\n return _.find(ingresses, { host: hostname }) as IngressStatusProps;\n};\n\nconst showCustomRouteHelp = (\n ingress: RouteIngress,\n annotations: RouteKind['metadata']['annotations'],\n) => {\n if (!ingress || !_.some(ingress.conditions, { type: 'Admitted', status: 'True' })) {\n return false;\n }\n\n if (_.get(annotations, 'openshift.io/host.generated') === 'true') {\n return false;\n }\n\n if (!ingress.host || !ingress.routerCanonicalHostname) {\n return false;\n }\n\n return true;\n};\n\nconst RouteTargetRow: React.FC<RouteTargetRowProps> = ({ route, target }) => (\n <tr className=\"pf-v5-c-table__tr\">\n <td className=\"pf-v5-c-table__td\">\n <ResourceLink\n kind={target.kind}\n name={target.name}\n namespace={route.metadata.namespace}\n title={target.name}\n />\n </td>\n <td className=\"pf-v5-c-table__td\">{target.weight}</td>\n <td className=\"pf-v5-c-table__td\">{calcTrafficPercentage(target.weight, route)}</td>\n </tr>\n);\n\nconst CustomRouteHelp: React.FC<CustomRouteHelpProps> = ({ host, routerCanonicalHostname }) => {\n const { t } = useTranslation();\n return (\n <Popover\n headerContent={<>{t('public~Custom route')}</>}\n bodyContent={\n <div>\n <p>\n <Trans t={t} ns=\"public\">\n To use a custom route, you must update your DNS provider by creating a canonical name\n (CNAME) record. Your CNAME record should point to your custom domain{' '}\n <strong>{{ host }}</strong>, to the OpenShift canonical router hostname,{' '}\n <strong>{{ routerCanonicalHostname }}</strong>, as the alias.\n </Trans>\n </p>\n </div>\n }\n >\n <Button className=\"pf-m-link--align-left\" type=\"button\" variant=\"link\">\n <QuestionCircleIcon /> {t('public~Do you need to set up custom DNS?')}\n </Button>\n </Popover>\n );\n};\n\nconst RouteIngressStatus: React.FC<RouteIngressStatusProps> = ({ route }) => {\n const { t } = useTranslation();\n return (\n <>\n {_.map(route.status.ingress, (ingress: RouteIngress) => (\n <div key={ingress.routerName} className=\"co-m-route-ingress-status\">\n <SectionHeading\n text={`${t('public~Router: {{routerName}}', {\n routerName: ingress.routerName,\n })}`}\n />\n <dl>\n <DetailsItem label={t('public~Host')} obj={route} path=\"status.ingress.host\">\n {ingress.host}\n </DetailsItem>\n <DetailsItem\n label={t('public~Wildcard policy')}\n obj={route}\n path=\"status.ingress.wildcardPolicy\"\n >\n {ingress.wildcardPolicy}\n </DetailsItem>\n <DetailsItem\n label={t('public~Router canonical hostname')}\n obj={route}\n path=\"status.ingress.routerCanonicalHostname\"\n >\n <div>{ingress.routerCanonicalHostname || '-'}</div>\n {showCustomRouteHelp(ingress, route.metadata.annotations) && (\n <CustomRouteHelp\n host={ingress.host}\n routerCanonicalHostname={ingress.routerCanonicalHostname}\n />\n )}\n </DetailsItem>\n </dl>\n <h3 className=\"co-section-heading-secondary\">{t('public~Conditions')}</h3>\n <Conditions conditions={ingress.conditions} />\n </div>\n ))}\n </>\n );\n};\n\nconst RouteDetails: React.FC<RoutesDetailsProps> = ({ obj: route }) => {\n const { t } = useTranslation();\n const primaryIngressStatus: IngressStatusProps = getIngressStatusForHost(\n route.spec.host,\n route.status.ingress,\n );\n return (\n <>\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Route details')} />\n <div className=\"row\">\n <div className=\"col-sm-6\">\n <ResourceSummary resource={route}>\n <DetailsItem label={t('public~Service')} obj={route} path=\"spec.to.name\">\n <ResourceLink\n kind={route.spec.to.kind}\n name={route.spec.to.name}\n namespace={route.metadata.namespace}\n title={route.spec.to.name}\n />\n </DetailsItem>\n <DetailsItem\n label={t('public~Target port')}\n obj={route}\n path=\"spec.port.targetPort\"\n />\n </ResourceSummary>\n </div>\n <div className=\"col-sm-6\">\n <dl className=\"co-m-pane__details\">\n <dt>{t('public~Location')}</dt>\n <dd>\n <RouteLocation obj={route} />\n </dd>\n <dt>{t('public~Status')}</dt>\n <dd>\n <RouteStatus obj={route} />\n </dd>\n <DetailsItem label={t('public~Host')} obj={route} path=\"spec.host\" />\n <DetailsItem label={t('public~Path')} obj={route} path=\"spec.path\" />\n {primaryIngressStatus && (\n <DetailsItem\n label={t('public~Router canonical hostname')}\n obj={route}\n path=\"status.ingress.routerCanonicalHostname\"\n >\n <div>{primaryIngressStatus.routerCanonicalHostname || '-'}</div>\n {showCustomRouteHelp(primaryIngressStatus, route.metadata.annotations) && (\n <CustomRouteHelp\n host={primaryIngressStatus.host}\n routerCanonicalHostname={primaryIngressStatus.routerCanonicalHostname}\n />\n )}\n </DetailsItem>\n )}\n </dl>\n </div>\n </div>\n </div>\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~TLS settings')} />\n <TLSSettings route={route} />\n </div>\n {!_.isEmpty(route.spec.alternateBackends) && (\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Traffic')} />\n <p className=\"co-m-pane__explanation\">\n {t('public~This route splits traffic across multiple services.')}\n </p>\n <div className=\"co-table-container\">\n <table className=\"pf-v5-c-table pf-m-compact pf-m-border-rows\">\n <thead className=\"pf-v5-c-table__thead\">\n <tr className=\"pf-v5-c-table__tr\">\n <th className=\"pf-v5-c-table__th\">{t('public~Service')}</th>\n <th className=\"pf-v5-c-table__th\">{t('public~Weight')}</th>\n <th className=\"pf-v5-c-table__th\">{t('public~Percent')}</th>\n </tr>\n </thead>\n <tbody className=\"pf-v5-c-table__tbody\">\n <RouteTargetRow route={route} target={route.spec.to} />\n {_.map(route.spec.alternateBackends, (alternate, i) => (\n <RouteTargetRow key={i} route={route} target={alternate} />\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n {_.isEmpty(route.status.ingress) ? (\n <div className=\"cos-status-box\">\n <div className=\"pf-v5-u-text-align-center\">{t('public~No route status')}</div>\n </div>\n ) : (\n <div className=\"co-m-pane__body\">\n <RouteIngressStatus route={route} />\n </div>\n )}\n </>\n );\n};\n\nexport const RoutesDetailsPage = connectToFlags<RoutesDetailsPageProps>(\n FLAGS.CAN_GET_NS,\n)((props) => (\n <DetailsPage\n {..._.omit(props, 'flags')}\n getResourceStatus={routeStatus}\n kind={RoutesReference}\n menuActions={menuActions}\n pages={[\n navFactory.details(detailsPage(RouteDetails)),\n ...(props.flags[FLAGS.CAN_GET_NS] ? [navFactory.metrics(RouteMetrics)] : []),\n navFactory.editYaml(),\n ]}\n />\n));\n\nexport const RoutesList: React.FC = (props) => {\n const { t } = useTranslation();\n const RouteTableHeader = () => {\n return [\n {\n title: t('public~Name'),\n sortField: 'metadata.name',\n transforms: [sortable],\n props: { className: tableColumnClasses[0] },\n },\n {\n title: t('public~Namespace'),\n sortField: 'metadata.namespace',\n transforms: [sortable],\n props: { className: tableColumnClasses[1] },\n id: 'namespace',\n },\n {\n title: t('public~Status'),\n props: { className: tableColumnClasses[2] },\n },\n {\n title: t('public~Location'),\n sortField: 'spec.host',\n transforms: [sortable],\n props: { className: tableColumnClasses[3] },\n },\n {\n title: t('public~Service'),\n sortField: 'spec.to.name',\n transforms: [sortable],\n props: { className: tableColumnClasses[4] },\n },\n {\n title: '',\n props: { className: tableColumnClasses[5] },\n },\n ];\n };\n return (\n <Table\n {...props}\n aria-label={t('public~Routes')}\n Header={RouteTableHeader}\n Row={RouteTableRow}\n virtualize\n />\n );\n};\n\nexport const RoutesPage: React.FC<RoutesPageProps> = (props) => {\n const { t } = useTranslation();\n const createProps = {\n to: `/k8s/ns/${props.namespace || 'default'}/routes/~new/form`,\n };\n\n const filters = [\n {\n filterGroupName: t('public~Status'),\n type: 'route-status',\n reducer: routeStatus,\n items: [\n { id: 'Accepted', title: t('public~Accepted') },\n { id: 'Rejected', title: t('public~Rejected') },\n { id: 'Pending', title: t('public~Pending') },\n ],\n },\n ];\n\n return (\n <ListPage\n ListComponent={RoutesList}\n kind={RoutesReference}\n canCreate={true}\n createProps={createProps}\n rowFilters={filters}\n {...props}\n />\n );\n};\n\nexport type RouteHostnameProps = {\n obj: RouteKind;\n};\n\nexport type RouteStatusProps = {\n obj: RouteKind;\n};\n\nexport type RouteTargetRowProps = {\n route: RouteKind;\n target: RouteTarget;\n};\n\nexport type TLSSettingsProps = {\n route: RouteKind;\n};\n\nexport type RouteHeaderProps = {\n obj: RouteKind;\n};\n\nexport type RoutesPageProps = {\n obj: RouteKind;\n namespace: string;\n};\n\nexport type RoutesDetailsProps = {\n obj: RouteKind;\n};\n\nexport type RoutesDetailsPageProps = {\n match: any;\n} & WithFlagsProps;\n\nexport type RouteIngressStatusProps = {\n route: RouteKind;\n};\n\nexport type RouteLinkAndCopyProps = {\n route: RouteKind;\n additionalClassName?: string;\n};\n\nexport type CustomRouteHelpProps = {\n host: string;\n routerCanonicalHostname: string;\n};\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ResourceLink, DetailsItem } from '@console/internal/components/utils';\nimport { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';\nimport {\n K8sPodControllerKind,\n referenceForModel,\n PodKind,\n getResourceDescription,\n} from '@console/internal/module/k8s';\nimport { PodDisruptionBudgetModel } from '../../models';\nimport AvailabilityRequirement from './AvailabilityRequirement';\nimport { PodDisruptionBudgetKind } from './types';\nimport { getPDBResource } from './utils/get-pdb-resources';\n\nexport const PodDisruptionBudgetField: React.FC<PodDisruptionBudgetFieldProps> = ({ obj }) => {\n const { t } = useTranslation();\n const [pdbResources] = useK8sWatchResource<PodDisruptionBudgetKind[]>({\n groupVersionKind: {\n group: PodDisruptionBudgetModel.apiGroup,\n kind: PodDisruptionBudgetModel.kind,\n version: PodDisruptionBudgetModel.apiVersion,\n },\n isList: true,\n namespaced: true,\n namespace: obj.metadata.namespace,\n });\n const pdb = getPDBResource(pdbResources, obj);\n const { replicas } = obj.spec ?? {};\n const pdbDescription = getResourceDescription(PodDisruptionBudgetModel);\n\n return (\n <DetailsItem label={t('console-app~PodDisruptionBudget')} description={pdbDescription}>\n {pdb ? (\n <>\n <ResourceLink\n kind={referenceForModel(PodDisruptionBudgetModel)}\n name={pdb.metadata.name}\n namespace={pdb.metadata.namespace}\n />\n {replicas && <AvailabilityRequirement pdb={pdb} replicas={replicas} />}\n </>\n ) : (\n t('console-app~No PodDisruptionBudget')\n )}\n </DetailsItem>\n );\n};\n\ntype PodDisruptionBudgetFieldProps = {\n obj: K8sPodControllerKind | PodKind;\n};\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport * as React from 'react';\nimport { Link } from 'react-router-dom-v5-compat';\nimport * as _ from 'lodash-es';\nimport { useTranslation } from 'react-i18next';\nimport i18next from 'i18next';\nimport {\n ContainerSpec,\n K8sKind,\n K8sResourceKind,\n K8sResourceKindReference,\n PodKind,\n PodTemplate,\n Volume,\n VolumeMount,\n} from '../module/k8s';\nimport {\n asAccessReview,\n EmptyBox,\n Kebab,\n KebabOption,\n ResourceIcon,\n SectionHeading,\n VolumeType,\n} from './utils';\nimport { Table } from './factory';\nimport { sortable } from '@patternfly/react-table';\nimport { removeVolumeModal } from './modals';\nimport { connectToModel } from '../kinds';\n\nconst removeVolume = (kind: K8sKind, obj: K8sResourceKind, volume: RowVolumeData): KebabOption => {\n return {\n // t('public~Remove volume')\n labelKey: 'public~Remove volume',\n callback: () =>\n removeVolumeModal({\n kind,\n resource: obj,\n volume,\n }),\n accessReview: asAccessReview(kind, obj, 'patch'),\n };\n};\n\nconst menuActions = [removeVolume];\n\nconst getPodTemplate = (resource: K8sResourceKind): PodTemplate => {\n return resource.kind === 'Pod' ? (resource as PodKind) : resource.spec.template;\n};\n\nconst anyContainerWithVolumeMounts = (containers: ContainerSpec[]) => {\n return !!_.findKey(containers, 'volumeMounts');\n};\n\nconst getRowVolumeData = (resource: K8sResourceKind): RowVolumeData[] => {\n const pod: PodTemplate = getPodTemplate(resource);\n if (_.isEmpty(pod.spec.volumes) && !anyContainerWithVolumeMounts(pod.spec.containers)) {\n return [];\n }\n\n const data: RowVolumeData[] = [];\n const volumes = (pod.spec.volumes || []).reduce((p, v: Volume) => {\n p[v.name] = v;\n return p;\n }, {});\n\n _.forEach(pod.spec.containers, (c: ContainerSpec) => {\n _.forEach(c.volumeMounts, (v: VolumeMount) => {\n data.push({\n name: v.name,\n readOnly: !!v.readOnly,\n volumeDetail: volumes[v.name],\n container: c.name,\n mountPath: v.mountPath,\n subPath: v.subPath,\n resource,\n });\n });\n });\n return data;\n};\n\nconst ContainerLink: React.FC<ContainerLinkProps> = ({ name, pod }) => (\n <span className=\"co-resource-item co-resource-item--inline\">\n <ResourceIcon kind=\"Container\" />\n <Link to={`/k8s/ns/${pod.metadata.namespace}/pods/${pod.metadata.name}/containers/${name}`}>\n {name}\n </Link>\n </span>\n);\nContainerLink.displayName = 'ContainerLink';\n\nconst volumeRowColumnClasses = [\n 'pf-v5-u-w-25-on-2xl',\n 'pf-v5-u-w-25-on-2xl',\n 'pf-m-hidden pf-m-visible-on-md',\n 'pf-m-hidden pf-m-visible-on-lg',\n 'pf-m-hidden pf-m-visible-on-lg',\n 'pf-m-hidden pf-m-visible-on-xl',\n Kebab.columnClass,\n];\n\nconst VolumesTableRows = ({ componentProps: { data } }) => {\n return _.map(data, (volume: RowVolumeData) => {\n const { container, mountPath, name, readOnly, resource, subPath, volumeDetail } = volume;\n const pod = getPodTemplate(resource);\n const podVolume = pod.spec?.volumes?.find((v) => name === v.name);\n const podVolumeIsReadOnly = podVolume\n ? Object.values(podVolume).some((v) => v.readOnly === 'true')\n : false;\n return [\n {\n title: name,\n props: {\n className: volumeRowColumnClasses[0],\n 'data-test-volume-name-for': name,\n },\n },\n {\n title: mountPath,\n props: {\n className: volumeRowColumnClasses[1],\n 'data-test-mount-path-for': name,\n },\n },\n {\n title: subPath || <span className=\"text-muted\">{i18next.t('public~No subpath')}</span>,\n props: {\n className: volumeRowColumnClasses[2],\n },\n },\n {\n title: <VolumeType volume={volumeDetail} namespace={resource.metadata.namespace} />,\n props: {\n className: volumeRowColumnClasses[3],\n },\n },\n {\n title:\n readOnly || podVolumeIsReadOnly\n ? i18next.t('public~Read-only')\n : i18next.t('public~Read/Write'),\n props: {\n className: volumeRowColumnClasses[4],\n },\n },\n {\n title:\n _.get(pod, 'kind') === 'Pod' ? (\n <ContainerLink name={container} pod={pod as PodKind} />\n ) : (\n container\n ),\n props: {\n className: volumeRowColumnClasses[5],\n },\n },\n {\n title: (\n <VolumeKebab\n actions={menuActions}\n kind={resource.kind}\n resource={resource}\n rowVolumeData={volume}\n />\n ),\n props: {\n className: volumeRowColumnClasses[6],\n },\n },\n ];\n });\n};\n\nexport const VolumesTable = (props) => {\n const { t } = useTranslation();\n const { resource, ...tableProps } = props;\n const data: RowVolumeData[] = getRowVolumeData(resource);\n const pod: PodTemplate = getPodTemplate(resource);\n const VolumesTableHeader = () => [\n {\n title: t('public~Name'),\n sortField: 'name',\n transforms: [sortable],\n props: { className: volumeRowColumnClasses[0] },\n },\n {\n title: t('public~Mount path'),\n sortField: 'mountPath',\n transforms: [sortable],\n props: { className: volumeRowColumnClasses[1] },\n },\n {\n title: t('public~SubPath'),\n sortField: 'subPath',\n transforms: [sortable],\n props: { className: volumeRowColumnClasses[2] },\n },\n {\n title: t('public~Type'),\n props: { className: volumeRowColumnClasses[3] },\n },\n {\n title: t('public~Permissions'),\n sortField: 'readOnly',\n transforms: [sortable],\n props: { className: volumeRowColumnClasses[4] },\n },\n {\n title: t('public~Utilized by'),\n sortField: 'container',\n transforms: [sortable],\n props: { className: volumeRowColumnClasses[5] },\n },\n {\n title: '',\n props: { className: volumeRowColumnClasses[6] },\n },\n ];\n\n return (\n <>\n {props.heading && <SectionHeading text={props.heading} />}\n {_.isEmpty(pod.spec.volumes) && !anyContainerWithVolumeMounts(pod.spec.containers) ? (\n <EmptyBox label={t('public~Volumes')} />\n ) : (\n <Table\n {...tableProps}\n aria-label={t('public~Volumes')}\n loaded={true}\n label={props.heading}\n data={data}\n Header={VolumesTableHeader}\n Rows={VolumesTableRows}\n virtualize={false}\n />\n )}\n </>\n );\n};\n\nVolumesTable.displayName = 'VolumesTable';\n\nconst VolumeKebab = connectToModel((props: VolumeKebabProps) => {\n const { actions, kindObj, resource, isDisabled, rowVolumeData } = props;\n if (!kindObj || kindObj.kind === 'Pod') {\n return null;\n }\n const options = actions.map((b) => b(kindObj, resource, rowVolumeData));\n return (\n <Kebab\n options={options}\n isDisabled={\n isDisabled !== undefined ? isDisabled : resource?.metadata?.deletionTimestamp?.length > 0\n }\n />\n );\n});\n\ntype VolumeKebabAction = (\n kind: K8sKind,\n obj: K8sResourceKind,\n rowVolumeData: RowVolumeData,\n) => KebabOption;\ntype VolumeKebabProps = {\n kindObj: K8sKind;\n actions: VolumeKebabAction[];\n kind: K8sResourceKindReference;\n resource: K8sResourceKind;\n isDisabled?: boolean;\n rowVolumeData: RowVolumeData;\n};\n\nexport type RowVolumeData = {\n name: string;\n readOnly: boolean;\n volumeDetail: Volume;\n container: string;\n mountPath: string;\n subPath?: string;\n resource: K8sResourceKind;\n};\n\ntype ContainerLinkProps = {\n pod: PodKind;\n name: string;\n};\n","import * as React from 'react';\nimport {\n StatusPopupSectionProps,\n StatusPopupItemProps,\n} from '@console/dynamic-plugin-sdk/src/extensions/dashboard-types';\n\nimport './status-popup.scss';\n\nexport const StatusPopupSection: React.FC<StatusPopupSectionProps> = ({\n firstColumn,\n secondColumn,\n children,\n}) => (\n <>\n <div className=\"co-status-popup__row\">\n <div className=\"co-status-popup__text--bold\">{firstColumn}</div>\n {secondColumn && <div className=\"text-secondary\">{secondColumn}</div>}\n </div>\n {children}\n </>\n);\n\nconst Status: React.FC<StatusPopupItemProps> = ({ value, icon, children }) => (\n <div className=\"co-status-popup__row\">\n {children}\n {(value || icon) && (\n <div className=\"co-status-popup__status\">\n {value && <div className=\"text-secondary\">{value}</div>}\n {icon && <div className=\"co-status-popup__icon\">{icon}</div>}\n </div>\n )}\n </div>\n);\n\nexport default Status;\n","import { K8sResourceKind, K8sResourceCondition } from '@console/internal/module/k8s';\n\nexport type ConfigurationKind = K8sResourceKind;\n\nexport type RevisionKind = {\n status?: {\n conditions?: RevisionCondition[];\n };\n} & K8sResourceKind;\n\nexport type ServiceKind = K8sResourceKind & {\n metadata?: {\n generation?: number;\n };\n status?: {\n url?: string;\n traffic?: Traffic[];\n };\n};\n\nexport type RouteKind = {\n status: {\n url: string;\n traffic: Traffic[];\n };\n} & K8sResourceKind;\n\nexport enum ConditionTypes {\n Ready = 'Ready',\n Active = 'Active',\n ContainerHealthy = 'ContainerHealthy',\n ResourcesAvailable = 'ResourcesAvailable',\n}\n\nexport type RevisionCondition = {\n type: keyof typeof ConditionTypes;\n} & K8sResourceCondition;\n\nexport type Traffic = {\n revisionName: string;\n percent: number;\n latestRevision?: boolean;\n tag?: string;\n url?: string;\n};\n\nexport type RoutesOverviewListItem = {\n uid: string;\n url: string;\n percent: string;\n name: string;\n namespace: string;\n};\n\nexport type EventSourceKind = {\n status: {\n conditions: EventSourceCondition[];\n };\n} & K8sResourceKind;\n\nexport enum EventSourceConditionTypes {\n Ready = 'Ready',\n Deployed = 'Deployed',\n SinkProvided = 'SinkProvided',\n ValidSchedule = 'ValidSchedule',\n}\n\nexport type EventSourceCondition = {\n type: keyof typeof EventSourceConditionTypes;\n} & K8sResourceCondition;\n\nexport type EventSubscriptionKind = {\n metadata?: {\n generation?: number;\n };\n spec: {\n channel: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n subscriber: {\n ref?: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n };\n };\n status: {\n physicalSubscription: {\n subscriberURI: string;\n };\n };\n} & K8sResourceKind;\n\nexport type EventChannelKind = {\n metadata?: {\n generation?: number;\n };\n status: {\n address: {\n url: string;\n };\n };\n} & K8sResourceKind;\n\nexport enum ChannelConditionTypes {\n Ready = 'Ready',\n}\n\nexport type ChannelCondition = {\n type: keyof typeof ChannelConditionTypes;\n} & K8sResourceCondition;\n\nexport type EventBrokerKind = {\n metadata?: {\n generation?: number;\n };\n status: {\n address: {\n url: string;\n };\n };\n} & K8sResourceKind;\n\nexport enum TriggerConditionTypes {\n Ready = 'Ready',\n BrokerReady = 'BrokerReady',\n DependencyReady = 'DependencyReady',\n SubscriptionReady = 'SubscriptionReady',\n SubscriberResolved = 'SubscriberResolved',\n}\n\nexport type TriggerCondition = {\n type: keyof typeof TriggerConditionTypes;\n} & K8sResourceCondition;\n\nexport enum BrokerConditionTypes {\n Ready = 'Ready',\n Addressable = 'Addressable',\n FilterReady = 'FilterReady',\n IngressReady = 'IngressReady',\n TriggerChannelReady = 'TriggerChannelReady',\n}\n\nexport type BrokerCondition = {\n type: keyof typeof BrokerConditionTypes;\n} & K8sResourceCondition;\n\nexport enum SubscriptionConditionTypes {\n Ready = 'Ready',\n ChannelReady = 'ChannelReady',\n AddedToChannel = 'AddedToChannel',\n ReferencesResolved = 'ReferencesResolved',\n}\n\nexport type SubscriptionCondition = {\n type: keyof typeof SubscriptionConditionTypes;\n} & K8sResourceCondition;\n\nexport type EventTriggerKind = {\n metadata?: {\n generation?: number;\n };\n spec: {\n broker: string;\n filter: {\n attributes?: {\n [key: string]: string;\n };\n };\n subscriber: {\n ref: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n };\n };\n status?: {\n conditions?: TriggerCondition[];\n };\n} & K8sResourceKind;\n\nexport type DomainMappingResponse = {\n action: string;\n resource: K8sResourceKind;\n};\n\nexport enum DomainMappingResponseAction {\n Create = 'Create',\n Update = 'Update',\n Delete = 'Delete',\n}\n\nexport enum ServerlessBuildStrategyType {\n ServerlessFunction = 'ServerlessFunction',\n}\n\nexport enum ServiceTypeValue {\n Function = 'Function',\n Service = 'Service',\n}\n","import { NodeKind } from '@console/internal/module/k8s';\nimport { isNodeReady } from '@console/shared/src/selectors/node';\n\nexport const nodeStatus = (node: NodeKind) => (isNodeReady(node) ? 'Ready' : 'Not Ready');\n","import * as React from 'react';\n\nexport const usePromiseHandler: PromiseHandlerHook = <T extends unknown = any>() => {\n const [inProgress, setInProgress] = React.useState(false);\n const [errorMessage, setErrorMessage] = React.useState('');\n const handlePromise: PromiseHandlerCallback<T> = (promise) => {\n setInProgress(true);\n return promise\n .then((res) => {\n setErrorMessage('');\n return res;\n })\n .catch((error) => {\n setErrorMessage(error.toString?.() || 'An error occurred. Please try again.');\n return Promise.reject(error);\n })\n .finally(() => setInProgress(false));\n };\n return [handlePromise, inProgress, errorMessage];\n};\n\ntype PromiseHandlerCallback<T> = (promise: Promise<T>) => Promise<T>;\ntype PromiseHandlerHook = <T>() => [PromiseHandlerCallback<T>, boolean, string];\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { getActiveNamespace } from '@console/internal/actions/ui';\nimport { AsyncComponent } from '@console/internal/components/utils/async';\nimport { MsgBox } from '@console/internal/components/utils/status-box';\nimport {\n K8sResourceKind,\n GroupVersionKind,\n referenceForModel,\n referenceForGroupVersionKind,\n} from '@console/internal/module/k8s';\nimport { OPERATOR_NAMESPACE_ANNOTATION } from '../const';\nimport { OperatorGroupModel } from '../models';\nimport {\n OperatorGroupKind,\n SubscriptionKind,\n InstallModeType,\n PackageManifestKind,\n} from '../types';\n\nexport const targetNamespacesFor = (obj: K8sResourceKind) =>\n obj?.metadata?.annotations?.['olm.targetNamespaces']; // FIXME magic string\nexport const operatorNamespaceFor = (obj: K8sResourceKind) =>\n obj?.metadata?.annotations?.[OPERATOR_NAMESPACE_ANNOTATION];\nexport const operatorGroupFor = (obj: K8sResourceKind) =>\n obj?.metadata?.annotations?.['olm.operatorGroup']; // FIXME magic string\n\nexport const NoOperatorGroupMsg: React.FC = () => {\n const { t } = useTranslation();\n return (\n <MsgBox\n title=\"Namespace Not Enabled\"\n detail={\n <p>\n {t(\n 'olm~The Operator Lifecycle Manager will not watch this Namespace because it is not configured with an OperatorGroup.',\n )}\n \n <Link to={`/ns/${getActiveNamespace()}/${referenceForModel(OperatorGroupModel)}/~new`}>\n {t('olm~Create one here.')}\n </Link>\n </p>\n }\n />\n );\n};\n\nexport const OperatorGroupSelector: React.FC<OperatorGroupSelectorProps> = (props) => {\n const { t } = useTranslation();\n return (\n <AsyncComponent\n loader={() =>\n import('@console/internal/components/utils/list-dropdown').then((m) => m.ListDropdown)\n }\n onChange={\n props.onChange ||\n function () {\n return null;\n }\n }\n desc={OperatorGroupModel.plural}\n placeholder={t('olm~Select OperatorGroup')}\n selectedKeyKind={referenceForModel(OperatorGroupModel)}\n dataFilter={props.dataFilter}\n resources={[\n {\n kind: referenceForModel(OperatorGroupModel),\n fieldSelector: `metadata.name!=${props.excludeName}`,\n },\n ]}\n />\n );\n};\n\nexport const requireOperatorGroup = <P extends RequireOperatorGroupProps>(\n Component: React.ComponentType<P>,\n) => {\n return class RequireOperatorGroup extends React.Component<P> {\n static WrappedComponent = Component;\n\n render() {\n const namespaceEnabled =\n !_.get(this.props.operatorGroup, 'loaded') || !_.isEmpty(this.props.operatorGroup.data);\n\n return namespaceEnabled ? <Component {...this.props} /> : <NoOperatorGroupMsg />;\n }\n } as React.ComponentClass<P> & { WrappedComponent: React.ComponentType<P> };\n};\n\nexport type InstallModeSet = { type: InstallModeType; supported: boolean }[];\n\n/**\n * Logic consistent with https://github.com/operator-framework/operator-lifecycle-manager/blob/4ef074e4207f5518d95ddf8c378036dfc4270dda/pkg/api/apis/operators/v1alpha1/clusterserviceversion.go#L165.\n */\nexport const supports = (set: InstallModeSet) => (obj: OperatorGroupKind) => {\n const namespaces = obj?.status?.namespaces ?? [];\n const supportedModes = set.filter(({ supported }) => supported).map(({ type }) => type);\n\n if (namespaces.length === 0) {\n return false;\n }\n if (namespaces.length === 1) {\n if (namespaces[0] === obj.metadata.namespace) {\n return supportedModes.includes(InstallModeType.InstallModeTypeOwnNamespace);\n }\n if (namespaces[0] === '') {\n return supportedModes.includes(InstallModeType.InstallModeTypeAllNamespaces);\n }\n return supportedModes.includes(InstallModeType.InstallModeTypeSingleNamespace);\n }\n if (\n namespaces.length > 1 &&\n !supportedModes.includes(InstallModeType.InstallModeTypeMultiNamespace)\n ) {\n return false;\n }\n if (namespaces.length > 1) {\n if (\n namespaces.includes(obj.metadata.namespace) &&\n !supportedModes.includes(InstallModeType.InstallModeTypeOwnNamespace)\n ) {\n return false;\n }\n if (namespaces.includes('')) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const isGlobal = (obj: OperatorGroupKind) =>\n supports([{ type: InstallModeType.InstallModeTypeAllNamespaces, supported: true }])(obj);\nexport const isSingle = (obj: OperatorGroupKind) =>\n supports([{ type: InstallModeType.InstallModeTypeSingleNamespace, supported: true }])(obj);\n\n/**\n * Determines if a given Operator package has a `Subscription` that makes it available in the given namespace.\n * Finds any `Subscriptions` for the given package, matches them to their `OperatorGroup`, and checks if the `OperatorGroup` is targeting the given namespace or if it is global.\n */\nexport const subscriptionFor = (allSubscriptions: SubscriptionKind[] = []) => (\n allGroups: OperatorGroupKind[] = [],\n) => (pkg: PackageManifestKind) => (ns = '') => {\n return allSubscriptions\n .filter(\n (sub) =>\n sub.spec.name === pkg.status.packageName &&\n sub.spec.source === pkg.status.catalogSource &&\n sub.spec.sourceNamespace === pkg.status.catalogSourceNamespace,\n )\n .find((sub) =>\n allGroups.some(\n (og) =>\n og.metadata.namespace === sub.metadata.namespace &&\n (isGlobal(og) || og.status?.namespaces?.includes(ns)),\n ),\n );\n};\n\nexport const installedFor = (allSubscriptions: SubscriptionKind[] = []) => (\n allGroups: OperatorGroupKind[] = [],\n) => (pkg: PackageManifestKind) => (ns = '') => {\n return !_.isNil(subscriptionFor(allSubscriptions)(allGroups)(pkg)(ns));\n};\n\nexport const providedAPIsForOperatorGroup = (og: OperatorGroupKind) =>\n (og?.metadata?.annotations?.['olm.providedAPIs'] ?? '')\n .split(',')\n .map((api) => ({\n group: api.split('.').slice(2).join('.'),\n version: api.split('.')[1],\n kind: api.split('.')[0],\n }))\n .map(({ group, version, kind }) => referenceForGroupVersionKind(group)(version)(kind));\n\ntype RequireOperatorGroupProps = {\n operatorGroup: { loaded: boolean; data?: OperatorGroupKind[] };\n};\n\nexport type OperatorGroupSelectorProps = {\n onChange?: (name: string, kind: GroupVersionKind) => void;\n excludeName?: string;\n dataFilter?: (obj: OperatorGroupKind) => boolean;\n};\n\nNoOperatorGroupMsg.displayName = 'NoOperatorGroupMsg';\n","export const CONSOLE_OPERATOR_CONFIG_NAME = 'cluster';\n\n// List of container status waiting reason values that we should call out as errors in project status rows.\nexport const CONTAINER_WAITING_STATE_ERROR_REASONS = [\n 'CrashLoopBackOff',\n 'ErrImagePull',\n 'ImagePullBackOff',\n];\n\n// Annotation key for deployment config latest version\nexport const DEPLOYMENT_CONFIG_LATEST_VERSION_ANNOTATION =\n 'openshift.io/deployment-config.latest-version';\n\nexport const DEPLOYMENT_CONFIG_NAME_ANNOTATION = 'openshift.io/deployment-config.name';\n\n// Annotation key for deployment phase\nexport const DEPLOYMENT_PHASE_ANNOTATION = 'openshift.io/deployment.phase';\n\n// Annotaton key for deployment revision\nexport const DEPLOYMENT_REVISION_ANNOTATION = 'deployment.kubernetes.io/revision';\n\n// Display name for default overview group.\n// Should not be a valid label key to avoid conflicts. https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-setexport\nexport const DEFAULT_GROUP_NAME = 'other resources';\n\n// Interval at which metrics are retrieved and updated\nexport const METRICS_POLL_INTERVAL = 30 * 1000;\n\n// Annotation key for image triggers\nexport const TRIGGERS_ANNOTATION = 'image.openshift.io/triggers';\n\nexport enum DEPLOYMENT_STRATEGY {\n rolling = 'Rolling',\n recreate = 'Recreate',\n rollingUpdate = 'RollingUpdate',\n}\n\nexport enum DEPLOYMENT_PHASE {\n new = 'New',\n running = 'Running',\n pending = 'Pending',\n complete = 'Complete',\n failed = 'Failed',\n cancelled = 'Cancelled',\n}\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { MarkdownView, MarkdownProps } from '@openshift-console/plugin-shared/src';\nimport { ThemeContext, updateThemeClass } from './ThemeProvider';\n\ntype SyncMarkdownProps = Omit<MarkdownProps, 'theme' | 'updateThemeClass' | 'emptyMsg'> & {\n emptyMsg?: string;\n theme?: string;\n};\n\nexport const SyncMarkdownView: React.FC<SyncMarkdownProps> = ({ emptyMsg, theme, ...rest }) => {\n const { t } = useTranslation();\n emptyMsg = emptyMsg || t('public~Not available');\n const contextTheme = React.useContext(ThemeContext);\n const markDownTheme = theme || contextTheme;\n return (\n <MarkdownView\n {...rest}\n emptyMsg={emptyMsg}\n theme={markDownTheme}\n updateThemeClass={updateThemeClass}\n />\n );\n};\n","import { TFunction } from 'i18next';\nimport { RowFilter } from '@console/dynamic-plugin-sdk/src/extensions/console-types';\nimport { VolumeSnapshotStatus } from '@console/internal/module/k8s';\n\nexport const volumeSnapshotStatus = ({ status }: { status?: VolumeSnapshotStatus }) => {\n const readyToUse = status?.readyToUse;\n const isError = !!status?.error?.message;\n return readyToUse ? 'Ready' : isError ? 'Error' : 'Pending';\n};\n\nexport const snapshotStatusFilters = (t: TFunction): RowFilter[] => {\n return [\n {\n filterGroupName: t('console-app~Status'),\n type: 'snapshot-status',\n reducer: volumeSnapshotStatus,\n filter: () => null,\n items: [\n { id: 'Ready', title: 'Ready' },\n { id: 'Pending', title: 'Pending' },\n { id: 'Error', title: 'Error' },\n ],\n },\n ];\n};\n","export * from './components';\nexport * from './datetime';\nexport * from './hooks';\n","export const serviceBindingModal = (props) =>\n import(\n './ServiceBindingModalLauncher' /* webpackChunkName: \"create-service-binding-modal\" */\n ).then((m) => m.createServiceBindingModal(props));\n","export * from './application';\nexport * from './gitops-primer';\n","import * as React from 'react';\nimport { Button, Split, SplitItem, Bullseye } from '@patternfly/react-core';\nimport { AngleDownIcon } from '@patternfly/react-icons/dist/esm/icons/angle-down-icon';\nimport { AngleUpIcon } from '@patternfly/react-icons/dist/esm/icons/angle-up-icon';\nimport { AutomationIcon } from '@patternfly/react-icons/dist/esm/icons/automation-icon';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { ImpersonateKind } from '@console/dynamic-plugin-sdk';\nimport { K8sResourceKind, k8sPatch, K8sKind } from '@console/internal/module/k8s';\nimport { useRelatedHPA } from '../../hooks/hpa-hooks';\nimport { ExtPodKind } from '../../types';\nimport { usePodRingLabel, usePodScalingAccessStatus } from '../../utils';\nimport PodStatus from './PodStatus';\nimport './PodRing.scss';\n\ninterface PodRingProps {\n pods: ExtPodKind[];\n obj: K8sResourceKind;\n rc?: K8sResourceKind;\n resourceKind: K8sKind;\n path?: string;\n impersonate?: ImpersonateKind;\n enableScaling?: boolean;\n}\n\nconst PodRing: React.FC<PodRingProps> = ({\n pods,\n obj,\n resourceKind,\n path,\n impersonate,\n rc,\n enableScaling = true,\n}) => {\n const [clickCount, setClickCount] = React.useState(obj.spec.replicas);\n const { t } = useTranslation();\n const isAccessScalingAllowed = usePodScalingAccessStatus(\n obj,\n resourceKind,\n pods,\n enableScaling,\n impersonate,\n );\n\n React.useEffect(\n () => {\n if (clickCount !== obj.spec.replicas) {\n setClickCount(obj.spec.replicas);\n }\n },\n // disabling exhaustive-deps because I do not want to add clickCount to\n // dependency array. I only want to trigger useEffect when `obj.spec.replicas` changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [obj.spec.replicas],\n );\n\n const handleScaling = _.debounce(\n (operation: number) => {\n const patch = [{ op: 'replace', path, value: operation }];\n const opts = { path: 'scale' };\n const promise: Promise<K8sResourceKind> = k8sPatch(resourceKind, obj, patch, opts);\n promise.catch((error) => {\n throw error;\n });\n },\n 1000,\n {\n leading: true,\n trailing: false,\n },\n );\n\n const handleClick = (operation: number) => {\n setClickCount(clickCount + operation);\n handleScaling(clickCount + operation);\n };\n\n const {\n apiVersion,\n kind,\n metadata: { name, namespace },\n } = obj;\n const [hpa] = useRelatedHPA(apiVersion, kind, name, namespace);\n const hpaControlledScaling = !!hpa;\n\n const isScalingAllowed = isAccessScalingAllowed && !hpaControlledScaling;\n\n const enableAutoscaling = !isScalingAllowed && clickCount === 0;\n const resourceObj = rc || obj;\n const { title, subTitle, titleComponent } = usePodRingLabel(\n resourceObj,\n kind,\n pods,\n hpaControlledScaling,\n t,\n hpa,\n );\n\n return (\n <Split>\n <SplitItem>\n <div className=\"odc-pod-ring\">\n <PodStatus\n standalone\n data={pods}\n subTitle={subTitle}\n title={title}\n titleComponent={titleComponent}\n />\n </div>\n </SplitItem>\n {enableAutoscaling && (\n <SplitItem className=\"pf-v5-u-display-flex pf-v5-u-align-content-center\">\n <Button\n type=\"button\"\n variant=\"link\"\n data-test=\"enable-autoscale\"\n icon={<AutomationIcon />}\n onClick={() => handleClick(1)}\n >\n {t('console-shared~Enable Autoscale')}\n </Button>\n </SplitItem>\n )}\n {isScalingAllowed && (\n <SplitItem>\n <Bullseye>\n <div>\n <Button\n type=\"button\"\n variant=\"plain\"\n aria-label={t('console-shared~Increase the Pod count')}\n title={t('console-shared~Increase the Pod count')}\n onClick={() => handleClick(1)}\n isBlock\n >\n <AngleUpIcon style={{ fontSize: '20' }} />\n </Button>\n <Button\n type=\"button\"\n variant=\"plain\"\n aria-label={t('console-shared~Decrease the Pod count')}\n title={t('console-shared~Decrease the Pod count')}\n onClick={() => handleClick(-1)}\n isBlock\n isDisabled={clickCount <= 0}\n >\n <AngleDownIcon style={{ fontSize: '20' }} />\n </Button>\n </div>\n </Bullseye>\n </SplitItem>\n )}\n </Split>\n );\n};\n\nexport default PodRing;\n","import * as React from 'react';\nimport { CreateProjectModalProps } from '@console/dynamic-plugin-sdk/src';\nimport { useModal } from '@console/dynamic-plugin-sdk/src/app/modal-support/useModal';\nimport { CreateNamespaceModal } from '../components/modals/CreateNamespaceModal';\n\nexport const useCreateNamespaceModal: UseCreateNamespaceModal = () => {\n const launcher = useModal();\n return React.useCallback((props) => launcher(CreateNamespaceModal, props), [launcher]);\n};\n\ntype UseCreateNamespaceModal = () => (props: CreateProjectModalProps) => void;\n","import * as React from 'react';\nimport { CreateProjectModalProps } from '@console/dynamic-plugin-sdk/src';\nimport { useModal } from '@console/dynamic-plugin-sdk/src/app/modal-support/useModal';\nimport { CreateProjectModal } from '../components/modals/CreateProjectModal';\n\nexport const useCreateProjectModal: UseCreateProjectModal = () => {\n const launcher = useModal();\n return React.useCallback((props) => launcher(CreateProjectModal, props), [launcher]);\n};\n\ntype UseCreateProjectModal = () => (props: CreateProjectModalProps) => void;\n","import * as React from 'react';\nimport { FormGroup, FormHelperText, HelperText, HelperTextItem } from '@patternfly/react-core';\nimport { FormikValues, useFormikContext, useField } from 'formik';\nimport { SelectorInput } from '@console/internal/components/utils';\nimport { FieldProps } from './field-types';\nimport { getFieldId } from './field-utils';\n\ninterface SelectorInputFieldProps extends FieldProps {\n placeholder?: string;\n}\n\n/**\n * Formik field wrapper around `SelectorInput` which renders a \"tag editor\" implemented with `react-tagsinput`.\n *\n * Values are saved as string dictionary (Record<string, string>).\n */\nconst SelectorInputField: React.FC<SelectorInputFieldProps> = ({\n name,\n label,\n helpText,\n required,\n dataTest,\n ...otherProps\n}) => {\n const { setFieldValue, setFieldTouched } = useFormikContext<FormikValues>();\n const [{ value }] = useField<string>(name);\n\n const fieldId = getFieldId(name, 'selector');\n const tags = SelectorInput.arrayify(value || '');\n const onChange = (newValue: string[]) => {\n setFieldValue(name, SelectorInput.objectify(newValue), false);\n setFieldTouched(name, true, true);\n };\n\n return (\n <FormGroup fieldId={fieldId} label={label} isRequired={required}>\n <SelectorInput\n onChange={onChange}\n tags={tags}\n inputProps={{ id: fieldId, 'data-test': dataTest }}\n {...otherProps}\n />\n\n <FormHelperText>\n <HelperText>\n <HelperTextItem>{helpText}</HelperTextItem>\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n};\n\nexport default SelectorInputField;\n","export { default as FormFooter } from './FormFooter';\nexport { default as FormHeader } from './FormHeader';\nexport { default as PageBody } from './PageBody';\nexport { default as FlexForm } from './FlexForm';\nexport { default as ActionGroupWithIcons } from './ActionGroupWithIcons';\nexport { default as FormBody } from './FormBody';\n","import { Map as ImmutableMap } from 'immutable';\n\nimport { GroupVersionKind, referenceForModel, referenceForExtensionModel } from '../module/k8s';\nimport * as k8sModels from '../models';\nimport * as appModels from '@console/app/src/models/';\nimport { YAMLTemplate } from '@console/dynamic-plugin-sdk/src/extensions/yaml-templates';\nimport { ResolvedExtension } from '@console/dynamic-plugin-sdk';\nimport { PodDisruptionBudgetModel } from '@console/app/src/models';\n\n/**\n * Sample YAML manifests for some of the statically-defined Kubernetes models.\n */\n\nexport const baseTemplates = ImmutableMap<GroupVersionKind, ImmutableMap<string, string>>()\n .setIn(\n ['DEFAULT', 'default'],\n `\napiVersion: ''\nkind: ''\nmetadata:\n name: example\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.NetworkPolicyModel), 'deny-other-namespaces'],\n `\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: deny-other-namespaces\n namespace: target-ns\nspec:\n podSelector:\n ingress:\n - from:\n - podSelector: {}\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.NetworkPolicyModel), 'db-or-api-allow-app'],\n `\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: db-or-api-allow-app\n namespace: target-ns\nspec:\n podSelector:\n matchLabels:\n role: db\n ingress:\n - from:\n - podSelector:\n matchLabels:\n app: mail\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.NetworkPolicyModel), 'api-allow-http-and-https'],\n `\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: api-allow-http-and-https\n namespace: target-ns\nspec:\n podSelector:\n matchLabels:\n app: api\n ingress:\n - from:\n - podSelector:\n matchLabels:\n role: monitoring\n ports:\n - protocol: TCP\n port: 80\n - protocol: TCP\n port: 443\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.NetworkPolicyModel), 'default-deny-all'],\n `\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: default-deny-all\n namespace: target-ns\nspec:\n podSelector:\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.NetworkPolicyModel), 'web-allow-external'],\n `\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: web-allow-external\n namespace: target-ns\nspec:\n podSelector:\n matchLabels:\n app: web\n ingress:\n - {}\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.NetworkPolicyModel), 'web-db-allow-all-ns'],\n `\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: web-db-allow-all-ns\n namespace: target-ns\nspec:\n podSelector:\n matchLabels:\n role: web-db\n ingress:\n - from:\n - namespaceSelector: {}\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.NetworkPolicyModel), 'web-allow-production'],\n `\napiVersion: networking.k8s.io/v1\nkind: NetworkPolicy\nmetadata:\n name: web-allow-production\n namespace: target-ns\nspec:\n podSelector:\n matchLabels:\n app: web\n ingress:\n - from:\n - namespaceSelector:\n matchLabels:\n env: production\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.BuildConfigModel), 'default'],\n `\napiVersion: build.openshift.io/v1\nkind: BuildConfig\nmetadata:\n name: example\nspec:\n source:\n git:\n ref: master\n uri: https://github.com/openshift/ruby-ex.git\n type: Git\n strategy:\n type: Source\n sourceStrategy:\n from:\n kind: ImageStreamTag\n name: ruby:2.7\n namespace: openshift\n env: []\n triggers:\n - type: ImageChange\n imageChange: {}\n - type: ConfigChange\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.DeploymentModel), 'default'],\n `\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: example\nspec:\n selector:\n matchLabels:\n app: httpd\n replicas: 3\n template:\n metadata:\n labels:\n app: httpd\n spec:\n containers:\n - name: httpd\n image: image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest\n ports:\n - containerPort: 8080\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ConfigMapModel), 'default'],\n `\napiVersion: v1\nkind: ConfigMap\nmetadata:\n name: example\n namespace: default\ndata:\n example.property.1: hello\n example.property.2: world\n example.property.file: |-\n property.1=value-1\n property.2=value-2\n property.3=value-3\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.CronJobModel), 'default'],\n `\napiVersion: batch/v1\nkind: CronJob\nmetadata:\n name: example\nspec:\n schedule: \"@daily\"\n jobTemplate:\n spec:\n template:\n spec:\n containers:\n - name: hello\n image: busybox\n args:\n - /bin/sh\n - -c\n - date; echo Hello from the Kubernetes cluster\n restartPolicy: OnFailure\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.CustomResourceDefinitionModel), 'default'],\n `\n apiVersion: apiextensions.k8s.io/v1\n kind: CustomResourceDefinition\n metadata:\n # name must match the spec fields below, and be in the form: <plural>.<group>\n name: crontabs.stable.example.com\n spec:\n # group name to use for REST API: /apis/<group>/<version>\n group: stable.example.com\n # list of versions supported by this CustomResourceDefinition\n versions:\n - name: v1\n # Each version can be enabled/disabled by Served flag.\n served: true\n # One and only one version must be marked as the storage version.\n storage: true\n schema:\n openAPIV3Schema:\n type: object\n properties:\n spec:\n type: object\n properties:\n cronSpec:\n type: string\n image:\n type: string\n replicas:\n type: integer\n # either Namespaced or Cluster\n scope: Namespaced\n names:\n # plural name to be used in the URL: /apis/<group>/<version>/<plural>\n plural: crontabs\n # singular name to be used as an alias on the CLI and for display\n singular: crontab\n # kind is normally the CamelCased singular type. Your resource manifests use this.\n kind: CronTab\n # shortNames allow shorter string to match your resource on the CLI\n shortNames:\n - ct\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.DeploymentConfigModel), 'default'],\n `\napiVersion: apps.openshift.io/v1\nkind: DeploymentConfig\nmetadata:\n name: example\nspec:\n selector:\n app: httpd\n replicas: 3\n template:\n metadata:\n labels:\n app: httpd\n spec:\n containers:\n - name: httpd\n image: image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest\n ports:\n - containerPort: 8080\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.PersistentVolumeModel), 'default'],\n `\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n name: example\nspec:\n capacity:\n storage: 5Gi\n accessModes:\n - ReadWriteOnce\n persistentVolumeReclaimPolicy: Retain\n storageClassName: slow\n nfs:\n path: /tmp\n server: 172.17.0.2\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.HorizontalPodAutoscalerModel), 'default'],\n `\napiVersion: autoscaling/v2\nkind: HorizontalPodAutoscaler\nmetadata:\n name: example\nspec:\n scaleTargetRef:\n apiVersion: apps/v1\n kind: Deployment\n name: example\n minReplicas: 1\n maxReplicas: 3\n metrics:\n - type: Resource\n resource:\n name: cpu\n target:\n averageUtilization: 50\n type: Utilization\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.PodModel), 'default'],\n `\napiVersion: v1\nkind: Pod\nmetadata:\n name: example\n labels:\n app: httpd\nspec:\n securityContext:\n runAsNonRoot: true\n seccompProfile:\n type: RuntimeDefault\n containers:\n - name: httpd\n image: image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest\n ports:\n - containerPort: 8080\n securityContext:\n allowPrivilegeEscalation: false\n capabilities:\n drop:\n - ALL\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.JobModel), 'default'],\n `\napiVersion: batch/v1\nkind: Job\nmetadata:\n name: example\nspec:\n selector: {}\n template:\n metadata:\n name: pi\n spec:\n containers:\n - name: pi\n image: perl\n command: [\"perl\", \"-Mbignum=bpi\", \"-wle\", \"print bpi(2000)\"]\n restartPolicy: Never\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ImageStreamModel), 'default'],\n `\napiVersion: image.openshift.io/v1\nkind: ImageStream\nmetadata:\n name: example\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.RoleBindingModel), 'default'],\n `\napiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n name: example\nsubjects:\n- kind: Group\n name: \"my-sample-group\"\n apiGroup: rbac.authorization.k8s.io\nroleRef:\n kind: ClusterRole\n name: view\n apiGroup: rbac.authorization.k8s.io\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.RoleModel), 'default'],\n `apiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n name: example\nrules:\n- apiGroups: [\"\"] # \"\" indicates the core API group\n resources: [\"pods\"]\n verbs: [\"get\", \"watch\", \"list\"]\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.RoleModel), 'read-pods-within-ns'],\n `\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n name: read-pods-within-ns\n namespace: default\nrules:\n- apiGroups: [\"\"]\n resources: [\"pods\"]\n verbs: [\"get\", \"list\", \"watch\"]\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.RoleModel), 'read-write-deployment-in-ext-and-apps-apis'],\n `\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n name: read-write-deployment-in-ext-and-apps-apis\n namespace: default\nrules:\n- apiGroups: [\"extensions\", \"apps\"]\n resources: [\"deployments\"]\n verbs: [\"get\", \"list\", \"watch\", \"create\", \"update\", \"patch\", \"delete\"]\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.RoleModel), 'read-pods-and-read-write-jobs'],\n `apiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n name: read-pods-and-read-write-jobs\n namespace: default\nrules:\n- apiGroups: [\"\"]\n resources: [\"pods\"]\n verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"batch\", \"extensions\"]\n resources: [\"jobs\"]\n verbs: [\"get\", \"list\", \"watch\", \"create\", \"update\", \"patch\", \"delete\"]\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.RoleModel), 'read-configmap-within-ns'],\n `\napiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n name: read-configmap-within-ns\n namespace: default\nrules:\n- apiGroups: [\"\"]\n resources: [\"configmaps\"]\n resourceNames: [\"my-config\"]\n verbs: [\"get\"]\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ClusterRoleModel), 'read-nodes'],\n `\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n # \"namespace\" omitted since ClusterRoles are not namespaced\n name: read-nodes\nrules:\n- apiGroups: [\"\"]\n resources: [\"nodes\"]\n verbs: [\"get\", \"list\", \"watch\"]\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ClusterRoleModel), 'get-and-post-to-non-resource-endpoints'],\n `\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n # \"namespace\" omitted since ClusterRoles are not namespaced\n name: get-and-post-to-non-resource-endpoints\nrules:\n- nonResourceURLs: [\"/healthz\", \"/healthz/*\"] # '*' in a nonResourceURL is a suffix glob match\n verbs: [\"get\", \"post\"]\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.DaemonSetModel), 'default'],\n `\napiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n name: example\nspec:\n selector:\n matchLabels:\n app: httpd\n template:\n metadata:\n labels:\n app: httpd\n spec:\n containers:\n - name: httpd\n image: image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest\n ports:\n - containerPort: 8080\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.PersistentVolumeClaimModel), 'default'],\n `\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n name: example\nspec:\n accessModes:\n - ReadWriteOnce\n volumeMode: Filesystem\n resources:\n requests:\n storage: 1Gi\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ResourceQuotaModel), 'default'],\n `\napiVersion: v1\nkind: ResourceQuota\nmetadata:\n name: example\nspec:\n hard:\n pods: \"4\"\n requests.cpu: \"1\"\n requests.memory: 1Gi\n limits.cpu: \"2\"\n limits.memory: 2Gi\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.LimitRangeModel), 'default'],\n `\napiVersion: v1\nkind: LimitRange\nmetadata:\n name: mem-limit-range\nspec:\n limits:\n - default:\n memory: 512Mi\n defaultRequest:\n memory: 256Mi\n type: Container\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.StatefulSetModel), 'default'],\n `\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n name: example\nspec:\n serviceName: \"httpd\"\n replicas: 3\n selector:\n matchLabels:\n app: httpd\n template:\n metadata:\n labels:\n app: httpd\n spec:\n terminationGracePeriodSeconds: 10\n containers:\n - name: httpd\n image: image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest\n ports:\n - containerPort: 8080\n name: web\n volumeMounts:\n - name: www\n mountPath: /var/www/html\n volumeClaimTemplates:\n - metadata:\n name: www\n spec:\n accessModes: [ \"ReadWriteOnce\" ]\n storageClassName: my-storage-class\n resources:\n requests:\n storage: 1Gi\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.StorageClassModel), 'default'],\n `\napiVersion: storage.k8s.io/v1\nkind: StorageClass\nmetadata:\n name: example\nprovisioner: my-provisioner\nreclaimPolicy: Delete\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ServiceAccountModel), 'default'],\n `\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: example\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.SecretModel), 'default'],\n `\napiVersion: v1\nkind: Secret\nmetadata:\n name: example\ntype: Opaque\nstringData:\n username: admin\n password: opensesame\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ReplicaSetModel), 'default'],\n `\napiVersion: apps/v1\nkind: ReplicaSet\nmetadata:\n name: example\nspec:\n replicas: 2\n selector:\n matchLabels:\n app: httpd\n template:\n metadata:\n name: httpd\n labels:\n app: httpd\n spec:\n containers:\n - name: httpd\n image: image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest\n ports:\n - containerPort: 8080\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ReplicationControllerModel), 'default'],\n `\napiVersion: v1\nkind: ReplicationController\nmetadata:\n name: example\nspec:\n replicas: 2\n selector:\n app: httpd\n template:\n metadata:\n name: httpd\n labels:\n app: httpd\n spec:\n containers:\n - name: httpd\n image: image-registry.openshift-image-registry.svc:5000/openshift/httpd:latest\n ports:\n - containerPort: 8080\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.BuildConfigModel), 'docker-build'],\n `\napiVersion: build.openshift.io/v1\nkind: BuildConfig\nmetadata:\n name: docker-build\n namespace: default\n labels:\n name: docker-build\nspec:\n triggers:\n - type: GitHub\n github:\n secret: secret101\n - type: ImageChange\n imageChange: {}\n - type: ConfigChange\n source:\n type: Git\n git:\n uri: https://github.com/openshift/ruby-hello-world.git\n strategy:\n type: Docker\n dockerStrategy:\n from:\n kind: ImageStreamTag\n name: ruby:latest\n namespace: openshift\n env:\n - name: EXAMPLE\n value: sample-app\n output:\n to:\n kind: ImageStreamTag\n name: origin-ruby-sample:latest\n postCommit:\n args:\n - bundle\n - exec\n - rake\n - test\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.BuildConfigModel), 's2i-build'],\n `apiVersion: build.openshift.io/v1\nkind: BuildConfig\nmetadata:\n name: s2i-build\n namespace: default\nspec:\n output:\n to:\n kind: ImageStreamTag\n name: s2i-build:latest\n source:\n git:\n ref: master\n uri: https://github.com/openshift/ruby-ex.git\n type: Git\n strategy:\n type: Source\n sourceStrategy:\n from:\n kind: ImageStreamTag\n name: ruby:2.4\n namespace: openshift\n env: []\n triggers:\n - type: ImageChange\n imageChange: {}\n - type: ConfigChange\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.GroupModel), 'default'],\n `\napiVersion: user.openshift.io/v1\nkind: Group\nmetadata:\n name: example\nusers:\n- user1\n- user2\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ResourceQuotaModel), 'rq-compute'],\n `\napiVersion: v1\nkind: ResourceQuota\nmetadata:\n name: compute-quota\n namespace:\nspec:\n hard:\n requests.cpu: '1'\n requests.memory: 1Gi\n limits.cpu: '2'\n limits.memory: 2Gi\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ResourceQuotaModel), 'rq-storageclass'],\n `\napiVersion: v1\nkind: ResourceQuota\nmetadata:\n name: storage-class-quota\n namespace:\nspec:\n hard:\n requests.storage: 100Gi\n persistentvolumeclaims: '100'\n # For quota specific to a storage class, the storage class must have the same name\n gold.storage-class.kubernetes.io/requests.storage: 3Gi\n gold.storage-class.kubernetes.io/persistentvolumeclaims: '5'\n silver.storage-class.kubernetes.io/requests.storage: 2Gi\n silver.storage-class.kubernetes.io/persistentvolumeclaims: '3'\n bronze.storage-class.kubernetes.io/requests.storage: 1Gi\n bronze.storage-class.kubernetes.io/persistentvolumeclaims: '1'\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ResourceQuotaModel), 'rq-counts'],\n `\napiVersion: v1\nkind: ResourceQuota\nmetadata:\n name: object-counts\n namespace:\nspec:\n hard:\n configmaps: \"10\"\n persistentvolumeclaims: \"4\"\n replicationcontrollers: \"20\"\n secrets: \"10\"\n services: \"10\"\n services.loadbalancers: \"2\"\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ClusterAutoscalerModel), 'default'],\n `\napiVersion: \"autoscaling.openshift.io/v1\"\nkind: \"ClusterAutoscaler\"\nmetadata:\n name: \"default\"\nspec: {}\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.MachineDeploymentModel), 'default'],\n `\napiVersion: \"machine.openshift.io/v1beta1\"\nkind: MachineDeployment\nmetadata:\n name: example\nspec:\n replicas: 3\n selector:\n matchLabels:\n foo: bar\n template:\n metadata:\n labels:\n foo: bar\n spec:\n providerSpec: {}\n versions:\n kubelet: \"\"\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.MachineSetModel), 'default'],\n `\napiVersion: \"machine.openshift.io/v1beta1\"\nkind: MachineSet\nmetadata:\n name: example\nspec:\n replicas: 3\n selector:\n matchLabels:\n foo: bar\n template:\n metadata:\n labels:\n foo: bar\n spec:\n providerSpec: {}\n versions:\n kubelet: \"\"\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.MachineModel), 'default'],\n `\napiVersion: \"machine.openshift.io/v1beta1\"\nkind: Machine\nmetadata:\n name: example\nspec:\n providerSpec: {}\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.MachineConfigPoolModel), 'default'],\n `\napiVersion: machineconfiguration.openshift.io/v1\nkind: MachineConfigPool\nmetadata:\n name: example\nspec:\n machineConfigSelector:\n matchLabels:\n machineconfiguration.openshift.io/role: master\n nodeSelector:\n matchLabels:\n node-role.kubernetes.io/master: \"\"\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.MachineAutoscalerModel), 'default'],\n `\napiVersion: \"autoscaling.openshift.io/v1beta1\"\nkind: \"MachineAutoscaler\"\nmetadata:\n name: \"worker-us-east-1a\"\n namespace: \"openshift-machine-api\"\nspec:\n minReplicas: 1\n maxReplicas: 12\n scaleTargetRef:\n apiVersion: machine.openshift.io/v1beta1\n kind: MachineSet\n name: worker\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.MachineHealthCheckModel), 'default'],\n `\napiVersion: machine.openshift.io/v1beta1\nkind: MachineHealthCheck\nmetadata:\n name: example\n namespace: openshift-machine-api\nspec:\n selector:\n matchLabels:\n machine.openshift.io/cluster-api-cluster: my-cluster\n machine.openshift.io/cluster-api-machine-role: worker\n machine.openshift.io/cluster-api-machine-type: worker\n machine.openshift.io/cluster-api-machineset: my-machine-set\n unhealthyConditions:\n - type: \"Ready\"\n status: \"Unknown\"\n timeout: \"300s\"\n - type: \"Ready\"\n status: \"False\"\n timeout: \"300s\"\n maxUnhealthy: \"40%\"\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ConsoleLinkModel), 'default'],\n `\napiVersion: console.openshift.io/v1\nkind: ConsoleLink\nmetadata:\n name: example\nspec:\n href: 'https://www.example.com'\n location: HelpMenu\n text: Help Menu Link\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ConsoleLinkModel), 'cl-user-menu'],\n `\napiVersion: console.openshift.io/v1\nkind: ConsoleLink\nmetadata:\n name: example-user-menu\nspec:\n href: 'https://www.example.com'\n location: UserMenu\n text: User Menu Link\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ConsoleLinkModel), 'cl-application-menu'],\n `\napiVersion: console.openshift.io/v1\nkind: ConsoleLink\nmetadata:\n name: example-application-menu\nspec:\n href: 'https://www.example.com'\n location: ApplicationMenu\n text: Application Menu Link\n applicationMenu:\n section: Example Section\n imageURL: data:image/svg+xml;base64,PHN2ZyBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTE4LjkgMi4xdjIuMWgtMS43di0yLjFjMC0uMSAwLS4yLS4xLS4zcy0uMi0uMS0uMy0uMWgtMTQuN2MtLjEgMC0uMiAwLS4zLjEgMCAuMS0uMS4yLS4xLjN2MTQuNmMwIC4xIDAgLjIuMS4zcy4yLjEuMy4xaDIuMXYxLjdoLTIuMWMtLjYgMC0xLjEtLjItMS41LS42LS40LS40LS42LS45LS42LTEuNXYtMTQuNmMwLS41LjItMS4xLjYtMS41czEtLjYgMS41LS42aDE0LjZjLjYgMCAxLjEuMiAxLjUuNnMuNyAxIC43IDEuNXptNS4xIDUuMnYxNC42YzAgLjYtLjIgMS4xLS42IDEuNXMtMSAuNi0xLjUuNmgtMTQuNmMtLjYgMC0xLjEtLjItMS41LS42cy0uNi0uOS0uNi0xLjV2LTE0LjZjMC0uNi4yLTEuMS42LTEuNXMuOS0uNiAxLjUtLjZoMTQuNmMuNiAwIDEuMS4yIDEuNS42cy42LjkuNiAxLjV6bS0xLjcgMTQuNnYtMTQuNmMwLS4xIDAtLjItLjEtLjNzLS4yLS4xLS4zLS4xaC0xNC42Yy0uMSAwLS4yIDAtLjMuMXMtLjEuMi0uMS4zdjE0LjZjMCAuMSAwIC4yLjEuM3MuMi4xLjMuMWgxNC42Yy4xIDAgLjIgMCAuMy0uMXMuMS0uMi4xLS4zeiIvPjwvc3ZnPg==\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ConsoleLinkModel), 'cl-namespace-dashboard'],\n `\napiVersion: console.openshift.io/v1\nkind: ConsoleLink\nmetadata:\n name: example-namespace-dashboard\nspec:\n href: 'https://www.example.com'\n location: NamespaceDashboard\n text: Namespace Dashboard Link\n namespaceDashboard:\n namespaces:\n - default\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ConsoleCLIDownloadModel), 'default'],\n `\napiVersion: console.openshift.io/v1\nkind: ConsoleCLIDownload\nmetadata:\n name: example\nspec:\n displayName: examplecli\n description: |\n This is an example CLI download description that can include markdown such as paragraphs, unordered lists, code, [links](https://www.example.com), etc.\n\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce a lobortis justo, eu suscipit purus.\n links:\n - href: 'https://www.example.com'\n text: Download Example CLI\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ConsoleNotificationModel), 'default'],\n `\napiVersion: console.openshift.io/v1\nkind: ConsoleNotification\nmetadata:\n name: example\nspec:\n text: This is an example notification message with an optional link.\n location: BannerTop\n link:\n href: 'https://www.example.com'\n text: Optional link text\n color: '#fff'\n backgroundColor: '#0088ce'\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ConsoleExternalLogLinkModel), 'default'],\n `\napiVersion: console.openshift.io/v1\nkind: ConsoleLogLink\nmetadata:\n name: example\nspec:\n hrefTemplate: 'https://example.com/logs?resourceName=\\${resourceName}&containerName=\\${containerName}&resourceNamespace=\\${resourceNamespace}&podLabels=\\${podLabels}'\n text: Example Logs\n`,\n )\n .setIn(\n [referenceForModel(appModels.QuickStartModel), 'default'],\n `\napiVersion: console.openshift.io/v1\nkind: ConsoleQuickStart\nmetadata:\n name: example\nspec:\n displayName: Deploy image\n tags:\n - example\n - image\n - deployment\n durationMinutes: 5\n description: Deploy an example application from an image.\n introduction: |-\n ### In this example quick start, you'll deploy an existing image to OpenShift. For more information on writing quick starts, see our [quick start guidelines.](http://openshift.github.io/openshift-origin-design/conventions/documentation/quick-starts.html)\n tasks:\n - title: Deploy an existing image from an image registry\n description: |-\n ### To deploy the **httpd-24-centos7** image, follow these steps:\n 1. Enter the developer perspective: In the main navigation menu, click the [dropdown menu]{{highlight tour-perspective-dropdown}} and select **Developer**.\n 2. In the main navigation menu, click **Add.**\n 3. Using the project dropdown menu, select the project you would like to deploy the image in.\n 4. Click the **Container Image** tile.\n 5. In the **Image name from external registry** field, enter **quay.io/centos7/httpd-24-centos7**.\n 6. Fill in the remaining image deployment details, and then click **Create.**\n The **Topology** view will load with your **httpd-24-centos7-app** application. The outer rim of the larger circle represents your application, and the small circle represents the deployment.\n review:\n instructions: |-\n #### Verify the image was successfully deployed:\n Do you see a **httpd-24-centos7** deployment?\n failedTaskHelp: This task isn’t verified yet. Try the task again.\n summary:\n success: Great work! You deployed an example application using the **quay.io/centos7/httpd-24-centos7** image.\n failed: Try the steps again.\n - title: Run the deployed application\n description: |-\n ### To run the **httpd-24-centos7** deployment application, follow these steps:\n 1. In the **Topology** view, click the **httpd-24-centos7** deployment circle.\n 2. In the panel that slides out, click the link in the **Routes** section. This opens the URL and runs the application.\n review:\n instructions: |-\n #### Verify your application is running:\n In the new tab, do you see the Apache HTTP server test page?\n failedTaskHelp: This task isn’t verified yet. Try the task again.\n summary:\n success: Great work! You deployed the **quay.io/centos7/httpd-24-centos7** image.\n failed: Try the steps again.\n conclusion: Your example **httpd-24-centos7-app** application, using the **quay.io/centos7/httpd-24-centos7** image, is deployed and ready.\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.ConsoleYAMLSampleModel), 'default'],\n `\napiVersion: console.openshift.io/v1\nkind: ConsoleYAMLSample\nmetadata:\n name: example\nspec:\n targetResource:\n apiVersion: batch/v1\n kind: Job\n title: 'Example Job'\n description: 'An example Job YAML sample'\n yaml: |\n apiVersion: batch/v1\n kind: Job\n metadata:\n name: countdown\n spec:\n template:\n metadata:\n name: countdown\n spec:\n containers:\n - name: counter\n image: centos:7\n command:\n - \"bin/bash\"\n - \"-c\"\n - \"for i in 9 8 7 6 5 4 3 2 1 ; do echo $i ; done\"\n restartPolicy: Never\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.VolumeSnapshotModel), 'default'],\n `\napiVersion: snapshot.storage.k8s.io/v1\nkind: VolumeSnapshot\nmetadata:\n name: example-snap\nspec:\n volumeSnapshotClassName: example-snapclass\n source:\n persistentVolumeClaimName: pvc-test\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.VolumeSnapshotClassModel), 'default'],\n `\napiVersion: snapshot.storage.k8s.io/v1\nkind: VolumeSnapshotClass\nmetadata:\n name: example-snapclass\ndriver: hostpath.csi.k8s.io #csi-hostpath\ndeletionPolicy: Delete\n`,\n )\n .setIn(\n [referenceForModel(k8sModels.VolumeSnapshotContentModel), 'default'],\n `\napiVersion: snapshot.storage.k8s.io/v1\nkind: VolumeSnapshotContent\nmetadata:\n name: example-snapcontent\nspec:\n deletionPolicy: Delete\n driver: hostpath.csi.k8s.io\n source:\n snapshotHandle: 7bdd0de3-aaeb-11e8-9aae-0242ac110002\n volumeSnapshotClassName: example-snapclass\n volumeSnapshotRef:\n name: example-snap\n namespace: default\n`,\n )\n .setIn(\n [referenceForModel(PodDisruptionBudgetModel), 'default'],\n `\napiVersion: policy/v1\nkind: PodDisruptionBudget\nmetadata:\n name: ''\nspec:\n selector:\n {}\n`,\n )\n .setIn(\n [referenceForModel(PodDisruptionBudgetModel), 'pdb-max-unavailable'],\n `\napiVersion: policy/v1\nkind: PodDisruptionBudget\nmetadata:\n name: example\n namespace: target-ns\nspec:\n maxUnavailable: 0\n selector:\n matchLabels:\n app: hello-openShift\n`,\n )\n .setIn(\n [referenceForModel(PodDisruptionBudgetModel), 'pdb-min-available'],\n `\napiVersion: policy/v1\nkind: PodDisruptionBudget\nmetadata:\n name: example\n namespace: target-ns\nspec:\n minAvailable: \"25%\"\n selector:\n matchLabels:\n app: hello-openShift\n`,\n );\n\nexport const getYAMLTemplates = (extensionTemplates: ResolvedExtension<YAMLTemplate>[] = []) =>\n ImmutableMap<GroupVersionKind, ImmutableMap<string, string>>()\n .merge(baseTemplates)\n .withMutations((map) => {\n extensionTemplates.forEach((yt) => {\n const modelRef = referenceForExtensionModel(yt.properties.model);\n const templateName = yt.properties.name || 'default';\n\n if (!baseTemplates.hasIn([modelRef, templateName])) {\n map.setIn([modelRef, templateName], yt.properties.template);\n }\n });\n });\n","import * as React from 'react';\nimport { MouseIcon } from '@patternfly/react-icons/dist/esm/icons/mouse-icon';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport './Shortcut.scss';\n\ninterface ShortcutProps {\n children: React.ReactNode;\n alt?: boolean;\n click?: boolean;\n ctrl?: boolean;\n ctrlCmd?: boolean;\n drag?: boolean;\n hover?: boolean;\n keyName?: string;\n rightClick?: boolean;\n shift?: boolean;\n dragNdrop?: boolean;\n}\n\nexport const ShortcutCommand: React.FC = ({ children }) => (\n <span className=\"ocs-shortcut__command\">\n <kbd className=\"co-kbd\">{children}</kbd>\n </span>\n);\n\nexport const isMac = window.navigator.platform.includes('Mac');\n\nconst Shortcut: React.FC<ShortcutProps> = ({\n children,\n alt,\n click,\n ctrl,\n ctrlCmd,\n drag,\n hover,\n keyName,\n rightClick,\n shift,\n dragNdrop,\n}) => {\n const { t } = useTranslation();\n return (\n <tr>\n <td className=\"ocs-shortcut__cell\">\n {(ctrl || (!isMac && ctrlCmd)) && (\n <ShortcutCommand data-test-id=\"ctrl-button\">Ctrl</ShortcutCommand>\n )}\n {alt && (\n <ShortcutCommand data-test-id={isMac ? 'opt-button' : 'alt-button'}>\n {isMac ? '⌥ Opt' : 'Alt'}\n </ShortcutCommand>\n )}\n {shift && <ShortcutCommand data-test-id=\"shift-button\">Shift</ShortcutCommand>}\n {isMac && ctrlCmd && <ShortcutCommand data-test-id=\"cmd-button\">⌘ Cmd</ShortcutCommand>}\n {hover && (\n <ShortcutCommand data-test-id=\"hover\">\n <MouseIcon /> {t('console-shared~Hover')}\n </ShortcutCommand>\n )}\n {keyName && (\n <ShortcutCommand data-test-id={`${keyName}-button`}>\n {keyName.length === 1 ? keyName.toUpperCase() : _.upperFirst(keyName.toLowerCase())}\n </ShortcutCommand>\n )}\n {drag && (\n <ShortcutCommand data-test-id=\"drag\">\n <MouseIcon /> {t('console-shared~Drag')}\n </ShortcutCommand>\n )}\n {click && (\n <ShortcutCommand data-test-id=\"click\">\n <MouseIcon /> {t('console-shared~Click')}\n </ShortcutCommand>\n )}\n {rightClick && (\n <ShortcutCommand data-test-id=\"right-click\">\n <MouseIcon /> {t('console-shared~Right click')}\n </ShortcutCommand>\n )}\n {dragNdrop && (\n <ShortcutCommand data-test-id=\"drag-and-drop\">\n <MouseIcon /> {t('console-shared~Drag + Drop')}\n </ShortcutCommand>\n )}\n </td>\n <td className=\"ocs-shortcut__cell\">{children}</td>\n </tr>\n );\n};\n\nexport default Shortcut;\n","import { useK8sModels } from '@console/dynamic-plugin-sdk/src/lib-core';\nimport { getReferenceForModel } from '@console/dynamic-plugin-sdk/src/utils/k8s';\nimport { K8sModel } from '@console/internal/module/k8s';\nimport {\n NodeMaintenanceModel,\n NodeMaintenanceKubevirtBetaModel,\n NodeMaintenanceKubevirtAlphaModel,\n} from '../models';\n\nexport const useMaintenanceCapability = (): [K8sModel, boolean] => {\n const [models, loading] = useK8sModels();\n if (loading) {\n return [undefined, true];\n }\n const model =\n models[getReferenceForModel(NodeMaintenanceModel)] ||\n models[getReferenceForModel(NodeMaintenanceKubevirtBetaModel)] ||\n models[getReferenceForModel(NodeMaintenanceKubevirtAlphaModel)];\n\n return [model, false];\n};\n","import { Extension, ExtensionDeclaration, CodeRef } from '../types';\nimport { K8sResourceCommon } from './console-types';\n\n/** This extension can be used to specify additional properties that will be used when creating PVC resources on the PVC list page. */\nexport type PVCCreateProp = ExtensionDeclaration<\n 'console.pvc/create-prop',\n {\n /** Label for the create prop action. */\n label: string;\n /** Path for the create prop action. */\n path: string;\n }\n>;\n\n/** This extension can be used to contribute custom alerts on the PVC details page. */\nexport type PVCAlert = ExtensionDeclaration<\n 'console.pvc/alert',\n {\n /** The alert component. */\n alert: CodeRef<React.ComponentType<{ pvc: K8sResourceCommon }>>;\n }\n>;\n\n/** This extension can be used to contribute an additional status component for PVC resources on the cluster dashboard page. */\nexport type PVCStatus = ExtensionDeclaration<\n 'console.pvc/status',\n {\n /** Priority for the status component. Bigger value means higher priority. */\n priority: number;\n /** The status component. */\n status: CodeRef<React.ComponentType<{ pvc: K8sResourceCommon }>>;\n /** Predicate that tells whether to render the status component or not. */\n predicate: CodeRef<(pvc: K8sResourceCommon) => boolean>;\n }\n>;\n\n/** This extension allows hooking into deleting PVC resources. It can provide an alert with additional information and custom PVC delete logic. */\nexport type PVCDelete = ExtensionDeclaration<\n 'console.pvc/delete',\n {\n /** Predicate that tells whether to use the extension or not. */\n predicate: CodeRef<(pvc: K8sResourceCommon) => boolean>;\n /** Method for the PVC delete operation. */\n onPVCKill: CodeRef<(pvc: K8sResourceCommon) => Promise<void>>;\n /** Alert component to show additional information. */\n alert: CodeRef<React.ComponentType<{ pvc: K8sResourceCommon }>>;\n }\n>;\n\n// Type guards\n\nexport const isPVCCreateProp = (e: Extension): e is PVCCreateProp =>\n e.type === 'console.pvc/create-prop';\n\nexport const isPVCAlert = (e: Extension): e is PVCAlert => e.type === 'console.pvc/alert';\n\nexport const isPVCStatus = (e: Extension): e is PVCStatus => e.type === 'console.pvc/status';\n\nexport const isPVCDelete = (e: Extension): e is PVCDelete => e.type === 'console.pvc/delete';\n","import { ExtensionK8sModel } from '../api/common-types';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\n\n/** YAML templates for editing resources via the yaml editor. */\nexport type YAMLTemplate = ExtensionDeclaration<\n 'console.yaml-template',\n {\n /** Model associated with the template. */\n model: ExtensionK8sModel;\n /** The YAML template. */\n template: CodeRef<string>;\n /** The name of the template. Use the name `default` to mark this as the default template. */\n name: string | 'default';\n }\n>;\n\n// Type guards\n\nexport const isYAMLTemplate = (e: Extension): e is YAMLTemplate =>\n e.type === 'console.yaml-template';\n","import {\n LabelSelector,\n K8sPodControllerKind,\n PodKind,\n K8sResourceConditionStatus,\n} from '@console/internal/module/k8s';\nimport { PDBCondition, PodDisruptionBudgetKind } from '../types';\n\nexport const getPDBResource = (\n pdbResources: PodDisruptionBudgetKind[],\n resource: K8sPodControllerKind | PodKind,\n): PodDisruptionBudgetKind =>\n pdbResources.find((f) =>\n new LabelSelector(f.spec.selector).matchesLabels(\n resource?.spec?.template?.metadata?.labels || resource?.metadata?.labels || {},\n ),\n );\n\nexport const isDisruptionViolated = (pdb: PodDisruptionBudgetKind): boolean => {\n const { status } = pdb;\n const conditions = status?.conditions;\n\n const disruptionNotAllowedCondition = conditions?.find(\n (condition: PDBCondition) =>\n condition.type === 'DisruptionAllowed' &&\n condition.status === K8sResourceConditionStatus.False,\n );\n return !!disruptionNotAllowedCondition && status?.expectedPods > 0;\n};\n\nexport const checkPodDisruptionBudgets = (pdbArray: PodDisruptionBudgetKind[]) => {\n let count = 0;\n let name = null;\n\n pdbArray.forEach((pdb) => {\n const isDisruptionViolatedForPDB = isDisruptionViolated(pdb);\n if (isDisruptionViolatedForPDB) {\n count++;\n if (count === 1) {\n name = pdb.metadata.name;\n }\n }\n });\n return count === 1 ? { count, name } : { count };\n};\n","export const setTrafficDistributionModal = (props) =>\n import(\n '../traffic-splitting/TrafficSplittingController' /* webpackChunkName: \"set-traffic-splitting\" */\n ).then((m) => m.trafficModalLauncher(props));\n\nexport const setSinkSourceModal = (props) =>\n import('../sink-source/SinkSourceController' /* webpackChunkName: \"sink-source\" */).then((m) =>\n m.sinkModalLauncher(props),\n );\n\nexport const setSinkPubsubModal = (props) =>\n import('../sink-pubsub/SinkPubsubController' /* webpackChunkName: \"sink-pubsub\" */).then((m) =>\n m.sinkPubsubModalLauncher(props),\n );\n\nexport const deleteRevisionModal = (props) =>\n import(\n '../revisions/DeleteRevisionModalController' /* webpackChunkName: \"delete-revision\" */\n ).then((m) => m.deleteRevisionModalLauncher(props));\n\nexport const editSinkUriModal = (props) =>\n import('../sink-uri/SinkUriController' /* webpackChunkName: \"sink-uri\" */).then((m) =>\n m.sinkModalLauncher(props),\n );\n\nexport const testServerlessFunctionModal = (props) =>\n import(\n '../test-function/TestFunctionController' /* webpackChunkName: \"test-serverless-function\" */\n ).then((m) => m.testFunctionModalLauncher(props));\n","export { default as ConsolePluginRadioInputs } from './ConsolePluginRadioInputs';\nexport { default as ConsolePluginWarning } from './ConsolePluginWarning';\nexport { default as FallbackImg } from './FallbackImg';\n","export const consolePluginModal = (props) =>\n import('./ConsolePluginModal' /* webpackChunkName: \"shared-modals\" */).then((m) =>\n m.consolePluginModal(props),\n );\n\nexport const deleteResourceModal = (props) =>\n import('./DeleteResourceModal' /* webpackChunkName: \"shared-modals\" */).then((m) =>\n m.deleteResourceModal(props),\n );\n","export { default as ActionMenu } from './menu/ActionMenu';\nexport { default as LazyActionMenu } from './LazyActionMenu';\nexport { default as ActionServiceProvider } from './ActionServiceProvider';\nexport * from './types';\nexport * from './utils';\n","import * as React from 'react';\nimport { Alert, Label, Popover } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { useK8sWatchResource } from '@console/dynamic-plugin-sdk/src/api/core-api';\nimport { K8sResourceCommon } from '@console/internal/module/k8s';\nimport { YellowExclamationTriangleIcon } from '@console/shared';\nimport { ServiceBindingModel } from '../../models';\nimport { getBrandingDetails } from '../../utils';\nimport './ServiceBindingAlerts.scss';\n\nexport interface ServiceBindingWarningProps {\n namespace: string;\n}\n\nexport const ServiceBindingDeprecationAlertForTopology: React.FC = () => {\n const { t } = useTranslation();\n const productDetails = getBrandingDetails();\n return (\n <p>\n {t(\n 'service-binding-plugin~Service Bindings is deprecated with OpenShift 4.15 and will be removed from a future release, currently planned as {{productName}} 4.18.',\n { productName: productDetails.productName },\n )}\n </p>\n );\n};\n\nexport const ServiceBindingWarningForTopology: React.FC<ServiceBindingWarningProps> = ({\n namespace,\n}) => {\n const { t } = useTranslation();\n\n const [serviceBindings, serviceBindingsLoaded] = useK8sWatchResource<K8sResourceCommon[]>({\n groupVersionKind: {\n group: ServiceBindingModel.apiGroup,\n kind: ServiceBindingModel.kind,\n version: ServiceBindingModel.apiVersion,\n },\n isList: true,\n namespaced: true,\n namespace,\n });\n\n return (\n <>\n {serviceBindingsLoaded && serviceBindings?.length > 0 && (\n <Popover bodyContent={<ServiceBindingDeprecationAlertForTopology />} triggerAction=\"hover\">\n <Label color=\"orange\" icon={<YellowExclamationTriangleIcon />}>\n {t('service-binding-plugin~Service Bindings are deprecated')}\n </Label>\n </Popover>\n )}\n </>\n );\n};\n\nexport const ServiceBindingDeprecationAlert: React.FC = () => {\n const { t } = useTranslation();\n const productDetails = getBrandingDetails();\n return (\n <Alert\n isInline\n variant=\"info\"\n title={t('service-binding-plugin~Service Bindings is deprecated with {{productName}} 4.15', {\n productName: window.SERVER_FLAGS.branding === 'OKD' ? 'OKD' : 'OpenShift',\n })}\n >\n <p>\n {t(\n 'service-binding-plugin~Feature development of Service Binding Operator is deprecated in {{productName}} 4.15.',\n { productName: productDetails.productName },\n )}\n </p>\n <p>\n {t(\n 'service-binding-plugin~Service Bindings can still be created and shown in the OpenShift web console, but will be removed from a future release, currently planned as {{productName}} 4.18. You should migrate wherever it is possible.',\n { productName: productDetails.productName },\n )}\n </p>\n </Alert>\n );\n};\n\nexport const ServiceBindingDeprecationAlertForModals: React.FC = () => {\n const { t } = useTranslation();\n const productDetails = getBrandingDetails();\n return (\n <Alert\n isInline\n variant=\"info\"\n title={t('service-binding-plugin~Service Bindings is deprecated with {{productName}} 4.15', {\n productName: window.SERVER_FLAGS.branding === 'OKD' ? 'OKD' : 'OpenShift',\n })}\n className=\"service-binding-alert-modal\"\n >\n <p>\n {t(\n 'service-binding-plugin~Web console support will be removed from a future release, currently planned as {{productName}} 4.18. You should migrate wherever it is possible.',\n { productName: productDetails.productName },\n )}\n </p>\n </Alert>\n );\n};\n","import { K8sKind } from '@console/internal/module/k8s';\nimport { API_GROUP, API_VERSION } from '../const';\n\nexport const CloudServicesRequestModel: K8sKind = {\n apiGroup: API_GROUP,\n apiVersion: API_VERSION,\n kind: 'CloudServicesRequest',\n id: 'cloudservicesrequest',\n plural: 'cloudservicesrequests',\n label: 'Cloud Services Request',\n // t('rhoas-plugin~Cloud Services Request')\n labelKey: 'rhoas-plugin~Cloud Services Request',\n labelPlural: 'Cloud Services Requests',\n // t('rhoas-plugin~Cloud Services Requests')\n labelPluralKey: 'rhoas-plugin~Cloud Services Requests',\n abbr: 'CSCR',\n namespaced: true,\n crd: true,\n};\n\nexport const KafkaConnectionModel: K8sKind = {\n apiGroup: API_GROUP,\n apiVersion: API_VERSION,\n kind: 'KafkaConnection',\n id: 'kafkaconnection',\n plural: 'kafkaconnections',\n label: 'Kafka Connection',\n // t('rhoas-plugin~Kafka Connection')\n labelKey: 'rhoas-plugin~Kafka Connection',\n labelPlural: 'Kafka Connections',\n // t('rhoas-plugin~Kafka Connections')\n labelPluralKey: 'rhoas-plugin~Kafka Connections',\n abbr: 'AKC',\n namespaced: true,\n crd: true,\n};\n\nexport const CloudServiceAccountRequest: K8sKind = {\n apiGroup: API_GROUP,\n apiVersion: API_VERSION,\n kind: 'CloudServiceAccountRequest',\n id: 'cloudserviceaccountrequest',\n plural: 'cloudserviceaccountrequests',\n label: 'Cloud service Account Request',\n // t('rhoas-plugin~Cloud service Account Request')\n labelKey: 'rhoas-plugin~Cloud service Account Request',\n labelPlural: 'Cloud Service Account Requests',\n // t('rhoas-plugin~Cloud Service Account Requests')\n labelPluralKey: 'rhoas-plugin~Cloud Service Account Requests',\n abbr: 'CSAR',\n namespaced: true,\n crd: true,\n};\n","import * as _ from 'lodash-es';\n\nimport { STORAGE_PREFIX } from '@console/shared/src/constants';\nimport { coFetchJSON } from '../../co-fetch';\nimport { K8sKind, referenceForModel } from './';\n\nconst SWAGGER_LOCAL_STORAGE_KEY = `${STORAGE_PREFIX}/swagger-definitions`;\n\nexport const getDefinitionKey = _.memoize(\n (model: K8sKind, definitions: SwaggerDefinitions): string => {\n return _.findKey(definitions, (def: SwaggerDefinition) => {\n return _.some(def['x-kubernetes-group-version-kind'], ({ group, version, kind }) => {\n return (\n (model?.apiGroup ?? '') === (group || '') &&\n model?.apiVersion === version &&\n model?.kind === kind\n );\n });\n });\n },\n referenceForModel,\n);\n\nlet swaggerDefinitions: SwaggerDefinitions;\nexport const getSwaggerDefinitions = (): SwaggerDefinitions => swaggerDefinitions;\n\nexport const fetchSwagger = async (): Promise<SwaggerDefinitions> => {\n // Remove any old definitions from `localSotrage`. We rely on the browser cache now.\n // TODO: We should be able to remove this in a future release.\n localStorage.removeItem(SWAGGER_LOCAL_STORAGE_KEY);\n try {\n const response: SwaggerAPISpec = await coFetchJSON('api/kubernetes/openapi/v2');\n if (!response.definitions) {\n // eslint-disable-next-line no-console\n console.error('Definitions missing in OpenAPI response.');\n return null;\n }\n swaggerDefinitions = response.definitions;\n return swaggerDefinitions;\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Could not get OpenAPI definitions', e);\n return null;\n }\n};\n\nexport const definitionFor = _.memoize((model: K8sKind): SwaggerDefinition => {\n if (!swaggerDefinitions) {\n return null;\n }\n const key = getDefinitionKey(model, swaggerDefinitions);\n // Some schemas might use $ref to reference an external schmema. In order for $ref to resolve,\n // the referenced schema must be defined in the `definitions` property of the\n // referencing schema.\n return {\n definitions: swaggerDefinitions,\n ...(swaggerDefinitions?.[key] ?? {}),\n };\n}, referenceForModel);\n\nconst getRef = (definition: SwaggerDefinition): string => {\n const ref = definition.$ref || _.get(definition, 'items.$ref');\n const re = /^#\\/definitions\\//;\n // Only follow JSON pointers, not external URI references.\n return ref && re.test(ref) ? ref.replace(re, '') : null;\n};\n\n// Get the path in the swagger document to additional property details.\n// This can be\n// - A reference to another top-level definition\n// - Inline property declartions\n// - Inline property declartions for array items\nexport const getSwaggerPath = (\n allProperties: SwaggerDefinitions,\n currentPath: string[],\n name: string,\n followRef: boolean,\n): string[] => {\n const nextPath = [...currentPath, 'properties', name];\n const definition = _.get(allProperties, nextPath) as SwaggerDefinition;\n if (!definition) {\n return null;\n }\n const ref = getRef(definition);\n return followRef && ref ? [ref] : nextPath;\n};\n\nconst findDefinition = (kindObj: K8sKind, propertyPath: string[]): SwaggerDefinition => {\n if (!swaggerDefinitions) {\n return null;\n }\n\n const rootPath = getDefinitionKey(kindObj, swaggerDefinitions);\n const path = propertyPath.reduce(\n (currentPath: string[], nextProperty: string, i: number): string[] => {\n if (!currentPath) {\n return null;\n }\n // Don't follow the last reference since the description is not as good.\n const followRef = i !== propertyPath.length - 1;\n return getSwaggerPath(swaggerDefinitions, currentPath, nextProperty, followRef);\n },\n [rootPath],\n );\n\n return path ? (_.get(swaggerDefinitions, path) as SwaggerDefinition) : null;\n};\n\nexport const getPropertyDescription = (\n kindObj: K8sKind,\n propertyPath: string | string[],\n): string => {\n const path: string[] = _.toPath(propertyPath);\n const definition = findDefinition(kindObj, path);\n return definition ? definition.description : null;\n};\n\nexport const getResourceDescription = _.memoize((kindObj: K8sKind): string => {\n if (!swaggerDefinitions) {\n return null;\n }\n const key = getDefinitionKey(kindObj, swaggerDefinitions);\n return _.get(swaggerDefinitions, [key, 'description']);\n}, referenceForModel);\n\nexport type SwaggerDefinition = {\n definitions?: SwaggerDefinitions;\n description?: string;\n type?: string[] | string;\n enum?: string[];\n $ref?: string;\n items?: SwaggerDefinition;\n required?: string[];\n properties?: {\n [prop: string]: SwaggerDefinition;\n };\n};\n\nexport type SwaggerDefinitions = {\n [name: string]: SwaggerDefinition;\n};\n\nexport type SwaggerAPISpec = {\n swagger: string;\n info: { title: string; version: string };\n paths: { [path: string]: any };\n definitions: SwaggerDefinitions;\n};\n","import * as _ from 'lodash';\nimport { K8sResourceKind } from '@console/internal/module/k8s';\nimport { ClusterServiceVersionKind } from '@console/operator-lifecycle-manager/src';\n\nexport type OperatorBackedServiceKindMap = {\n [name: string]: ClusterServiceVersionKind;\n};\n\nexport const getOperatorBackedServiceKindMap = (\n installedOperators: ClusterServiceVersionKind[],\n): OperatorBackedServiceKindMap =>\n installedOperators\n ? installedOperators.reduce((kindMap, csv) => {\n (csv?.spec?.customresourcedefinitions?.owned || []).forEach((crd) => {\n if (!(crd.kind in kindMap)) {\n kindMap[crd.kind] = csv;\n }\n });\n return kindMap;\n }, {})\n : {};\n\nexport const isOperatorBackedService = (\n obj: K8sResourceKind,\n installedOperators: ClusterServiceVersionKind[],\n): boolean => {\n const kind = _.get(obj, 'metadata.ownerReferences[0].kind', null);\n const ownerUid = _.get(obj, 'metadata.ownerReferences[0].uid');\n const operatorBackedServiceKindMap = getOperatorBackedServiceKindMap(installedOperators);\n const operatorResource: K8sResourceKind = _.find(installedOperators, {\n metadata: { uid: ownerUid },\n }) as K8sResourceKind;\n return !!(\n kind &&\n operatorBackedServiceKindMap &&\n (!_.isEmpty(operatorResource) || kind in operatorBackedServiceKindMap)\n );\n};\n","export { default as Shortcut } from './Shortcut';\nexport { default as ShortcutTable } from './ShortcutTable';\n","import { K8sModel } from '@console/dynamic-plugin-sdk/src/api/common-types';\n\nexport const ExportModel: K8sModel = {\n id: 'export',\n kind: 'Export',\n plural: 'exports',\n label: 'Export',\n labelPlural: 'Exports',\n abbr: 'E',\n apiGroup: 'primer.gitops.io',\n apiVersion: 'v1alpha1',\n namespaced: true,\n crd: true,\n};\n","export * from './badges';\nexport * from './text';\nexport * from './contextMenu';\nexport * from './dropdown';\nexport * from './form-utils';\nexport * from './formik-fields';\nexport * from './getting-started';\nexport * from './lists';\nexport * from './log';\nexport * from './status';\nexport * from './pod';\nexport * from './popper';\nexport * from './shortcuts';\nexport * from './drawer';\nexport * from './health-checks';\nexport * from './virtualized-grid';\nexport * from './alerts';\nexport * from './popover';\nexport * from './layout';\nexport * from './utils';\nexport * from './modal';\nexport * from './modals';\nexport * from './hpa';\nexport * from './multi-tab-list';\nexport * from './spotlight';\nexport * from './custom-resource-list';\nexport * from './toast';\nexport * from './markdown-extensions';\nexport * from './actions';\nexport * from './quick-search';\nexport * from './namespace';\nexport * from './catalog';\nexport * from './progressive-list';\n","import * as React from 'react';\nimport { Button, Popover, PopoverProps } from '@patternfly/react-core';\nimport { OutlinedQuestionCircleIcon } from '@patternfly/react-icons/dist/esm/icons/outlined-question-circle-icon';\nimport { useTranslation } from 'react-i18next';\n\nexport const FieldLevelHelp: React.FC<FieldLevelHelpProps> = React.memo(\n ({ children, popoverHasAutoWidth, testId }) => {\n const { t } = useTranslation();\n if (React.Children.count(children) === 0) {\n return null;\n }\n return (\n <Popover\n aria-label={t('public~Help')}\n bodyContent={children}\n hasAutoWidth={popoverHasAutoWidth}\n >\n <Button\n aria-label={t('public~Help')}\n variant=\"link\"\n isInline\n className=\"co-field-level-help\"\n data-test-id={testId || null}\n >\n <OutlinedQuestionCircleIcon className=\"co-field-level-help__icon\" />\n </Button>\n </Popover>\n );\n },\n);\n\ntype FieldLevelHelpProps = {\n children: React.ReactNode;\n popoverHasAutoWidth?: PopoverProps['hasAutoWidth'];\n testId?: string;\n};\n","import * as React from 'react';\nimport { CodeEditorProps, CodeEditorRef } from '@console/dynamic-plugin-sdk';\n\nexport const AsyncCodeEditor: React.RefForwardingComponent<\n React.RefAttributes<CodeEditorRef>,\n CodeEditorProps\n> = React.lazy(() =>\n import('@console/shared/src/components/editor/CodeEditor').then((m) => ({\n default: m.default,\n })),\n);\n","import * as React from 'react';\nimport { OnSelect } from '@patternfly/react-table';\nimport { K8sResourceCommon } from '@console/internal/module/k8s';\n\nexport const useSelectList = <R extends K8sResourceCommon>(\n data: R[],\n visibleRows: Set<string>,\n onRowSelected: (rows: R[]) => void,\n): {\n onSelect: OnSelect;\n selectedRows: Set<string>;\n updateSelectedRows: (rows: R[]) => void;\n} => {\n const [selectedRows, setSelectedRows] = React.useState<Set<string>>(visibleRows);\n\n const onSelect = React.useCallback(\n (_event, isSelected, rowIndex, rowData) => {\n const uniqueUIDs: Set<string> = selectedRows ? new Set([...selectedRows]) : new Set<string>();\n\n if (rowIndex === -1) {\n isSelected\n ? visibleRows.forEach((uid) => uniqueUIDs.add(uid))\n : visibleRows.forEach((uid) => uniqueUIDs.delete(uid));\n } else {\n isSelected ? uniqueUIDs.add(rowData?.props?.id) : uniqueUIDs.delete(rowData?.props?.id);\n }\n\n setSelectedRows(uniqueUIDs);\n onRowSelected(data.filter((row) => uniqueUIDs.has(row.metadata.uid)));\n },\n [data, onRowSelected, selectedRows, visibleRows],\n );\n\n const updateSelectedRows = React.useCallback(\n (rows: R[]) => {\n onRowSelected(rows);\n setSelectedRows(new Set(rows.map((row) => row.metadata.uid)));\n },\n [onRowSelected],\n );\n\n return {\n onSelect,\n selectedRows,\n updateSelectedRows,\n };\n};\n","import { FLAGS } from '../constants';\nimport { useFlag } from './flag';\n\nexport const usePrometheusGate = (): boolean => {\n const prometheusFlag = useFlag(FLAGS.PROMETHEUS);\n return (\n prometheusFlag &&\n !!window.SERVER_FLAGS.prometheusBaseURL &&\n !!window.SERVER_FLAGS.prometheusTenancyBaseURL\n );\n};\n","export { default as CheckboxField } from './CheckboxField';\nexport { default as DropdownField } from './DropdownField';\nexport { default as DroppableFileInputField } from './DroppableFileInputField';\nexport { default as EnvironmentField } from './EnvironmentField';\nexport { default as FormSelectField } from './FormSelectField';\nexport { default as InputField } from './InputField';\nexport { default as MultiColumnField } from './multi-column-field/MultiColumnField';\nexport { default as NSDropdownField } from './NSDropdownField';\nexport { default as NumberSpinnerField } from './NumberSpinnerField';\nexport { default as RadioButtonField } from './RadioButtonField';\nexport { default as RadioGroupField } from './RadioGroupField';\nexport { default as ResourceDropdownField } from './ResourceDropdownField';\nexport { default as ResourceLimitField } from './ResourceLimitField';\nexport { default as SwitchField } from './SwitchField';\nexport { default as TextAreaField } from './TextAreaField';\nexport { default as CodeEditorField } from './CodeEditorField';\nexport { default as ItemSelectorField } from './item-selector-field/ItemSelectorField';\nexport { default as InputGroupField } from './InputGroupField';\nexport * from './text-column-field/text-column-types';\nexport { default as TextColumnField } from './text-column-field/TextColumnField';\nexport { default as DynamicFormField } from './DynamicFormField';\nexport { default as SyncedEditorField } from './SyncedEditorField';\nexport { default as SelectInputField } from './SelectInputField';\nexport { default as SelectorInputField } from './SelectorInputField';\nexport * from './field-utils';\nexport * from './field-types';\n","import * as React from 'react';\nimport {\n PREFERRED_CREATE_EDIT_METHOD_USER_SETTING_VALUE_LATEST,\n usePreferredCreateEditMethod,\n} from '@console/app/src/components/user-preferences/synced-editor';\nimport { useUserSettings } from '../../hooks/useUserSettings';\nimport { EditorType } from './editor-toggle';\n\nexport const useEditorType = (\n lastViewUserSettingKey: string,\n defaultValue: EditorType,\n checkEditorTypeEnabled?: (type: EditorType) => boolean,\n): [EditorType, (type: EditorType) => void, boolean] => {\n const [\n lastViewedEditorType,\n setLastViewedEditorType,\n lastViewedEditorTypeLoaded,\n ] = useUserSettings<EditorType>(lastViewUserSettingKey);\n const [preferredEditorType, preferredEditorTypeLoaded] = usePreferredCreateEditMethod();\n const isEditorTypeEnabled = (type: EditorType): boolean =>\n checkEditorTypeEnabled ? checkEditorTypeEnabled(type) : true;\n\n const resourceLoaded: boolean = lastViewedEditorTypeLoaded && preferredEditorTypeLoaded;\n\n const getEditorType = (): EditorType => {\n if (\n preferredEditorType &&\n preferredEditorType !== PREFERRED_CREATE_EDIT_METHOD_USER_SETTING_VALUE_LATEST &&\n isEditorTypeEnabled(preferredEditorType as EditorType)\n ) {\n return preferredEditorType as EditorType;\n }\n if (lastViewedEditorType && isEditorTypeEnabled(lastViewedEditorType)) {\n return lastViewedEditorType;\n }\n return defaultValue;\n };\n\n const [activeEditorType, setActiveEditorType] = React.useState<EditorType>(null);\n const setEditorType = (type: EditorType) => {\n setActiveEditorType(type);\n setLastViewedEditorType(type);\n };\n React.useEffect(() => {\n if (resourceLoaded) {\n const editorType: EditorType = getEditorType();\n if (!lastViewedEditorType || lastViewedEditorType !== editorType) {\n setLastViewedEditorType(editorType);\n }\n setActiveEditorType(editorType);\n }\n // run this hook only after all resources have loaded\n // to set the lastView user setting when the form loads\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resourceLoaded]);\n\n const loaded: boolean = resourceLoaded && (!!activeEditorType || !defaultValue);\n return [activeEditorType, setEditorType, loaded];\n};\n","import * as React from 'react';\nimport { global_palette_white as globalWhite } from '@patternfly/react-tokens/dist/js/global_palette_white';\n\nconst QuickSearchIcon: React.FC<React.HTMLProps<SVGElement>> = ({ style }): React.ReactElement => {\n return (\n <svg\n viewBox=\"0 0 80 80\"\n aria-hidden=\"true\"\n fill=\"currentColor\"\n width=\"2em\"\n height=\"2em\"\n style={{ verticalAlign: 'middle', ...style }}\n >\n <style>\n {'.prefix__st0{display:none}.prefix__st2,.prefix__st3{fill-rule:evenodd;clip-rule:evenodd}'}\n </style>\n <g id=\"prefix__Layer_1\" className=\"prefix__st0\">\n <path\n className=\"prefix__st2\"\n d=\"M31.79 18.48v.04c.01-.01.01-.02 0-.04zM11.5 59.22c-4.19.38-6.94 5.22-6.94 5.22V9.73C0 9.87 0 14.01 0 14.01v50.74c.19 5.42 6.84 4.13 6.84 4.13 6.84-9.65 25.09.14 25.09.14v-4.45c-7.84-5.09-15.11-5.95-20.43-5.35zm11.36-3.09c3.34.58 6.91 3.28 8.92 3.76v-4.55H31.5h.29V18.49l.01-3.62s-.01 0-.01-.01v-.5C24.35 9.56 14.7 6.3 9.12 5.26v50.59c4.09-1.13 7.5-.83 13.74.28zm13.77-37.65c-.01.02-.01.02 0 0zm27.23-8.75v54.71s-2.75-4.83-6.94-5.22c-5.32-.6-12.59.26-20.43 5.36v4.45s18.24-9.79 25.09-.14c0 0 6.66 1.28 6.84-4.13V14.01s0-4.14-4.56-4.28zM36.63 30.47v24.87l.66-.11c-.13.07-.27.11-.41.11h-.24v4.55c2.01-.48 5.59-3.18 8.92-3.76 6.24-1.11 9.65-1.41 13.74-.29V5.26c-5.57 1.04-15.22 4.3-22.66 9.08v.51c0 .01-.01.01-.01.01l.01 3.62-.01 11.99z\"\n />\n <circle className=\"prefix__st3\" cx={59.96} cy={56.6} r={13.54} />\n <path\n d=\"M62.66 67.25h-4.41c-.52 0-.95-.39-.95-.86v-6.63h-7.25c-.52 0-.95-.39-.95-.86v-4.04c0-.48.43-.86.95-.86h7.25v-6.63c0-.48.43-.86.95-.86h4.41c.52 0 .95.39.95.86V54h7.25c.52 0 .95.39.95.86v4.04c0 .48-.43.86-.95.86H63.6v6.63c0 .47-.42.86-.94.86zm-2.21 7.49c10.8 0 19.55-8 19.55-17.87S71.25 39 60.45 39 40.9 47 40.9 56.87s8.75 17.87 19.55 17.87z\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n fill={globalWhite.value}\n />\n </g>\n <g id=\"prefix__Layer_2\">\n <path\n className=\"prefix__st3\"\n d=\"M78.95 58.77h-8.08v-7.39c0-.53-.47-.96-1.05-.96H64.9c-.58 0-1.05.43-1.05.96v7.39h-8.08c-.58 0-1.05.43-1.05.96v4.5c0 .53.47.96 1.05.96h8.08v7.39c0 .53.47.96 1.05.96h4.92c.58 0 1.05-.43 1.05-.96v-7.39h8.08c.58 0 1.05-.43 1.05-.96v-4.5c0-.53-.47-.96-1.05-.96z\"\n />\n <path\n className=\"prefix__st2\"\n d=\"M76.23 43.81V14.22s0-4.61-5.08-4.76v32.93c1.78.29 3.48.76 5.08 1.42zM40.81 32.57v27.71l.73-.13a.94.94 0 01-.46.13h-.27v5.07c1.2-.29 2.92-1.29 4.81-2.25-.02-.37-.06-.74-.06-1.11 0-10.6 9.07-19.24 20.5-19.86V4.47c-6.21 1.16-16.96 4.8-25.25 10.12v.57c0 .02-.02.02-.02.02l.02 4.03v13.36zM12.82 64.6c-4.67.43-7.73 5.81-7.73 5.81V9.46C0 9.62 0 14.22 0 14.22v56.54c.21 6.03 7.62 4.61 7.62 4.61 7.62-10.75 27.95.16 27.95.16v-4.95c-8.73-5.69-16.83-6.65-22.75-5.98z\"\n />\n <path\n className=\"prefix__st2\"\n d=\"M25.47 61.15c3.72.65 7.7 3.65 9.94 4.19V19.21l.02-4.03s-.02 0-.02-.02v-.56C27.13 9.27 16.37 5.63 10.16 4.47v56.36c4.56-1.25 8.36-.91 15.31.32zM46.41 67.44c-1.88.83-3.8 1.86-5.76 3.13v4.95s3.46-1.85 8.05-3.28c-.98-1.48-1.75-3.09-2.29-4.8z\"\n />\n </g>\n </svg>\n );\n};\n\nexport default QuickSearchIcon;\n","import { fromBER } from 'asn1js';\nimport { Base64 } from 'js-base64';\nimport * as _ from 'lodash';\nimport { CertificationRequest } from 'pkijs';\nimport { stringToArrayBuffer, fromBase64 } from 'pvutils';\nimport {\n NodeKind,\n CertificateSigningRequestKind,\n K8sResourceCommon,\n NodeCertificateSigningRequestKind,\n} from '@console/internal/module/k8s';\n\nexport const isCSRResource = (obj: K8sResourceCommon): obj is CertificateSigningRequestKind =>\n obj.kind === 'CertificateSigningRequest';\n\nconst getNodeCSRs = (\n csrs: CertificateSigningRequestKind[],\n username: string,\n client: boolean,\n): CertificateSigningRequestKind[] =>\n csrs\n .filter(\n (csr) =>\n csr.spec.username === username &&\n csr.spec.usages.some((u) => u === (client ? 'client auth' : 'server auth')),\n )\n .sort(\n (a, b) =>\n new Date(b.metadata.creationTimestamp).getTime() -\n new Date(a.metadata.creationTimestamp).getTime(),\n );\n\nconst isCSRPending = (csr: CertificateSigningRequestKind): boolean =>\n !csr.status?.conditions?.some((c) => ['Approved', 'Denied'].includes(c.type));\n\nexport const getNodeClientCSRs = (\n csrs: CertificateSigningRequestKind[] = [],\n): NodeCertificateSigningRequestKind[] => {\n const nodeCSRs = getNodeCSRs(\n csrs,\n 'system:serviceaccount:openshift-machine-config-operator:node-bootstrapper',\n true,\n )\n .map<NodeCertificateSigningRequestKind>((csr) => {\n const request = Base64.decode(csr.spec.request);\n const req = request.replace(/(-----(BEGIN|END) CERTIFICATE REQUEST-----|\\n)/g, '');\n const asn1 = fromBER(stringToArrayBuffer(fromBase64(req)));\n const pkcs10 = new CertificationRequest({ schema: asn1.result });\n // '2.5.4.3' is commonName code\n const commonName = pkcs10.subject.typesAndValues.find(({ type }) => type === '2.5.4.3');\n return {\n ...csr,\n metadata: {\n ...csr.metadata,\n name: commonName.value.valueBlock.value.replace('system:node:', ''),\n originalName: csr.metadata.name,\n },\n };\n })\n .sort(\n (a, b) =>\n new Date(b.metadata.creationTimestamp).getTime() -\n new Date(a.metadata.creationTimestamp).getTime(),\n );\n\n const grouped = _.groupBy(nodeCSRs, (csr) => csr.metadata.name);\n\n return Object.keys(grouped).reduce((acc, key) => {\n const csr = grouped[key][0];\n if (isCSRPending(csr)) {\n acc.push(csr);\n }\n return acc;\n }, []);\n};\nexport const getNodeServerCSR = (\n csrs: CertificateSigningRequestKind[] = [],\n node: NodeKind,\n): CertificateSigningRequestKind => {\n const nodeCSRs = getNodeCSRs(csrs, `system:node:${node.metadata.name}`, false);\n if (!nodeCSRs.length || !isCSRPending(nodeCSRs[0])) {\n return null;\n }\n return nodeCSRs[0];\n};\n","export { useK8sModels } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks';\n","export * from './badge-factory';\nexport { default as DevPreviewBadge } from './DevPreviewBadge';\nexport { default as TechPreviewBadge } from './TechPreviewBadge';\nexport { default as EmptyStateResourceBadge } from './EmptyStateResourceBadge';\nexport * from './InlineBadge';\n","import { global_palette_black_300 as globalBlack300 } from '@patternfly/react-tokens/dist/js/global_palette_black_300';\n\nconst pfDependentAxisTickLabels = {\n padding: 5,\n fontFamily: 'var(--pf-v5-chart-global--FontFamily)',\n letterSpacing: 'var(--pf-v5-chart-global--letter-spacing)',\n fill: 'var(--pf-v5-global--Color--200)',\n};\nconst axisTicks = {\n size: 5,\n strokeWidth: 1,\n stroke: globalBlack300.value,\n};\n\nexport const areaTheme = {\n area: {\n style: {\n data: {\n fillOpacity: 0.15,\n },\n },\n },\n chart: {\n padding: {\n bottom: 30,\n left: 60,\n right: 10,\n top: 0,\n },\n },\n dependentAxis: {\n style: {\n axis: {\n stroke: 'EDEDED',\n strokeWidth: 2,\n },\n grid: { stroke: '#EDEDED' },\n tickLabels: pfDependentAxisTickLabels,\n ticks: axisTicks,\n },\n },\n};\n\nexport const barTheme = {\n bar: {\n style: {\n labels: {\n textAnchor: 'end' as 'end',\n },\n },\n },\n dependentAxis: {\n style: {\n axis: {\n stroke: 'none',\n },\n tickLabels: {\n fill: 'none',\n },\n },\n },\n independentAxis: {\n style: {\n axis: {\n stroke: 'none',\n },\n tickLabels: {\n textAnchor: 'start' as 'start',\n },\n },\n },\n};\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport * as React from 'react';\nimport * as classNames from 'classnames';\nimport { useDocumentListener, getLabelsAsString } from '@console/shared';\nimport { KeyEventModes } from '@console/shared/src/hooks';\nimport { fuzzyCaseInsensitive } from './factory/table-filters';\nimport { TextFilter } from './factory';\n\nconst MAX_SUGGESTIONS = 5;\n\nconst labelParser = (resources: any[], labelPath: string): Set<string> => {\n return resources.reduce((acc: Set<string>, resource: any) => {\n getLabelsAsString(resource, labelPath).forEach((label) => acc.add(label));\n return acc;\n }, new Set<string>());\n};\n\nconst suggestionBoxKeyHandler = {\n Escape: KeyEventModes.HIDE,\n};\n\nconst AutocompleteInput: React.FC<AutocompleteInputProps> = (props) => {\n const [suggestions, setSuggestions] = React.useState<string[]>();\n const { visible, setVisible, ref } = useDocumentListener<HTMLDivElement>(suggestionBoxKeyHandler);\n const {\n textValue,\n setTextValue,\n onSuggestionSelect,\n placeholder,\n showSuggestions,\n data,\n className,\n labelPath,\n } = props;\n\n const onSelect = (value: string) => {\n onSuggestionSelect(value);\n if (visible) {\n setVisible(false);\n }\n };\n\n const activate = () => {\n if (textValue.trim()) {\n setVisible(true);\n }\n };\n\n const handleInput = (event: React.FormEvent<HTMLInputElement>, input: string) => {\n if (input) {\n setVisible(true);\n } else {\n setVisible(false);\n }\n setTextValue(input);\n };\n\n React.useEffect(() => {\n if (textValue && visible && showSuggestions) {\n const processed = labelParser(data, labelPath);\n // User input without whitespace\n const processedText = textValue.trim().replace(/\\s*=\\s*/, '=');\n const filtered = [...processed]\n .filter((item) => fuzzyCaseInsensitive(processedText, item))\n .slice(0, MAX_SUGGESTIONS);\n setSuggestions(filtered);\n }\n }, [visible, textValue, showSuggestions, data, labelPath]);\n\n return (\n <div className=\"co-suggestion-box\" ref={ref}>\n <TextFilter\n value={textValue}\n onChange={handleInput}\n placeholder={placeholder}\n onFocus={activate}\n />\n {showSuggestions && (\n <div\n className={classNames('co-suggestion-box__suggestions', {\n 'co-suggestion-box__suggestions--shadowed': visible && suggestions?.length > 0,\n })}\n >\n {visible &&\n suggestions?.map((elem) => (\n <SuggestionLine\n suggestion={elem}\n key={elem}\n onClick={onSelect}\n className={className}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n\ntype AutocompleteInputProps = {\n onSuggestionSelect: (selected: string) => void;\n placeholder?: string;\n suggestionCount?: number;\n showSuggestions?: boolean;\n textValue: string;\n setTextValue: React.Dispatch<React.SetStateAction<String>>;\n className?: string;\n data?: any;\n labelPath?: string;\n};\n\nconst SuggestionLine: React.FC<SuggestionLineProps> = ({ suggestion, onClick, className }) => {\n return (\n <button className=\"co-suggestion-line\" onClick={() => onClick(suggestion)}>\n <span className={className}>{suggestion}</span>\n </button>\n );\n};\n\ntype SuggestionLineProps = {\n suggestion: string;\n onClick: (param: string) => void;\n className?: string;\n};\n\nexport default AutocompleteInput;\n","import * as React from 'react';\nimport * as classNames from 'classnames';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { useTranslation } from 'react-i18next';\n\nimport { ResourceIcon } from './resource-icon';\nimport { resourcePathFromModel, ResourceLink } from './resource-link';\nimport {\n K8sResourceCommon,\n referenceForOwnerRef,\n OwnerReference,\n modelFor,\n k8sList,\n} from '../../module/k8s';\nimport { useSafetyFirst } from '@console/dynamic-plugin-sdk';\nimport { findOwner, matchOwnerAndCSV } from '../../module/k8s/managed-by';\nimport { ClusterServiceVersionModel } from '@console/operator-lifecycle-manager/src/models';\nimport { ClusterServiceVersionKind } from '@console/operator-lifecycle-manager';\n\nexport const ManagedByOperatorResourceLink: React.SFC<ManagerLinkProps> = ({\n csvName,\n namespace,\n owner,\n className,\n}) => {\n const ownerGroupVersionKind = referenceForOwnerRef(owner);\n const { apiGroup, kind, namespaced } = modelFor(ownerGroupVersionKind) ?? {};\n const ownerIsCSV =\n apiGroup === ClusterServiceVersionModel.apiGroup && kind === ClusterServiceVersionModel.kind;\n const link = resourcePathFromModel(ClusterServiceVersionModel, csvName, namespace);\n return (\n <span className={className}>\n {namespaced ? (\n <>\n <ResourceIcon kind={ownerGroupVersionKind} />\n <Link\n to={ownerIsCSV ? link : `${link}/${ownerGroupVersionKind}/${owner.name}`}\n className=\"co-resource-item__resource-name\"\n data-test-operand-link={owner.name}\n data-test={owner.name}\n >\n {owner.name}\n </Link>\n </>\n ) : (\n <ResourceLink kind={ownerGroupVersionKind} name={owner.name} />\n )}\n </span>\n );\n};\n\nexport const ManagedByOperatorLink: React.SFC<ManagedByLinkProps> = ({ obj, className }) => {\n const { t } = useTranslation();\n const [data, setData] = useSafetyFirst<ClusterServiceVersionKind[] | undefined>(undefined);\n const namespace = obj.metadata.namespace;\n React.useEffect(() => {\n if (!namespace) {\n return;\n }\n k8sList(ClusterServiceVersionModel, { ns: namespace })\n .then(setData)\n .catch((e) => {\n // eslint-disable-next-line no-console\n console.error('Could not fetch CSVs', e);\n });\n }, [namespace, setData]);\n const owner = findOwner(obj, data);\n const csv = data && owner ? matchOwnerAndCSV(owner, data) : undefined;\n\n return owner && csv ? (\n <div className={classNames('co-m-pane__heading-owner', className)}>\n {t('public~Managed by')}{' '}\n <ManagedByOperatorResourceLink\n className=\"co-resource-item\"\n namespace={namespace}\n csvName={csv.metadata.name}\n owner={owner}\n />\n </div>\n ) : null;\n};\n\ntype ManagedByLinkProps = {\n className?: string;\n obj: K8sResourceCommon;\n};\n\ntype ManagerLinkProps = {\n csvName: string;\n namespace: string;\n owner: OwnerReference;\n className?: string;\n};\n","export type TruncateOptions = {\n length?: number; // Length to truncate text to\n truncateEnd?: boolean; // Flag to alternatively truncate at the end\n omission?: string; // Truncation text used to denote the truncation (ellipsis)\n minTruncateChars?: number; // Minimum number of characters to truncate\n};\n\nconst DEFAULT_OPTIONS: TruncateOptions = {\n length: 20,\n truncateEnd: false,\n omission: '\\u2026', // ellipsis character\n minTruncateChars: 3,\n};\n\n// Truncates a string down to `maxLength` characters when the length\n// is greater than the `maxLength` + `minTruncateChars` values.\n// By default the middle is truncated, set the options.truncateEnd to true to truncate at the end.\n// Truncated text is replaced with the provided omission option (ellipsis character by default);\nexport const truncateMiddle = (text: string, options: TruncateOptions = {}): string => {\n const { length, truncateEnd, omission, minTruncateChars } = { ...DEFAULT_OPTIONS, ...options };\n if (!text) {\n return text;\n }\n\n // Do not truncate less than the minimum truncate characters\n if (text.length <= length + minTruncateChars) {\n return text;\n }\n\n if (length <= omission.length) {\n return omission;\n }\n\n if (truncateEnd) {\n return `${text.substr(0, length - 1)}${omission}`;\n }\n\n const startLength = Math.ceil((length - omission.length) / 2);\n const endLength = length - startLength - omission.length;\n const startFragment = text.substr(0, startLength);\n const endFragment = text.substr(text.length - endLength);\n return `${startFragment}${omission}${endFragment}`;\n};\n\nexport const shouldTruncate = (text, options: TruncateOptions = {}): boolean => {\n const { length, minTruncateChars } = { ...DEFAULT_OPTIONS, ...options };\n\n return text.length > length + minTruncateChars;\n};\n","/* eslint-disable */\nimport * as React from 'react';\nimport { ActionServiceProviderProps } from '../extensions/actions';\nimport {\n CodeEditorProps,\n CodeEditorRef,\n ErrorBoundaryFallbackProps,\n HorizontalNavProps,\n InventoryItemBodyProps,\n InventoryItemStatusProps,\n InventoryItemTitleProps,\n ListPageCreateButtonProps,\n ListPageCreateDropdownProps,\n ListPageCreateLinkProps,\n ListPageCreateProps,\n ListPageFilterProps,\n ListPageHeaderProps,\n NamespaceBarProps,\n OverviewGridProps,\n OverviewProps,\n QueryBrowserProps,\n ResourceEventStreamProps,\n ResourceIconProps,\n ResourceLinkProps,\n ResourceYAMLEditorProps,\n TableDataProps,\n TimestampProps,\n UseActiveColumns,\n UseAnnotationsModal,\n UseDeleteModal,\n UseLabelsModal,\n UseListPageFilter,\n UsePrometheusPoll,\n UseResolvedExtensions,\n VirtualizedTableFC,\n UseActiveNamespace,\n UseUserSettings,\n UseQuickStartContext,\n} from '../extensions/console-types';\nimport { StatusPopupSectionProps, StatusPopupItemProps } from '../extensions/dashboard-types';\n\nexport * from '../app/components';\nexport * from './common-types';\n\n/**\n * React hook for consuming Console extensions with resolved `CodeRef` properties.\n * This hook accepts the same argument(s) as `useExtensions` hook and returns an adapted list of extension instances, resolving all code references within each extension's properties.\n * Initially, the hook returns an empty array. Once the resolution is complete, the React component is re-rendered with the hook returning an adapted list of extensions.\n * When the list of matching extensions changes, the resolution is restarted. The hook will continue to return the previous result until the resolution completes.\n * The hook's result elements are guaranteed to be referentially stable across re-renders.\n * @example\n * ```ts\n * const [navItemExtensions, navItemsResolved] = useResolvedExtensions<NavItem>(isNavItem);\n * // process adapted extensions and render your component\n * ```\n * @param typeGuards A list of callbacks that each accept a dynamic plugin extension as an argument and return a boolean flag indicating whether or not the extension meets desired type constraints\n * @returns Tuple containing a list of adapted extension instances with resolved code references, a boolean flag indicating whether the resolution is complete, and a list of errors detected during the resolution.\n */\nexport const useResolvedExtensions: UseResolvedExtensions = require('@console/dynamic-plugin-sdk/src/api/useResolvedExtensions')\n .useResolvedExtensions;\n\n/**\n * A component that creates a Navigation bar for a page.\n * Routing is handled as part of the component.\n * `console.tab/horizontalNav` can be used to add additional content to any horizontal nav.\n * @param {object} [resource] - the resource associated with this Navigation, an object of K8sResourceCommon type\n * @param {NavPage[]} pages - an array of page objects\n * @example\n * ```ts\n * const HomePage: React.FC = (props) => {\n * const page = {\n * href: '/home',\n * name: 'Home',\n * component: () => <>Home</>\n * }\n * return <HorizontalNav pages={[page]} />\n * }\n * ```\n */\nexport const HorizontalNav: React.FC<HorizontalNavProps> = require('@console/internal/components/utils/horizontal-nav')\n .HorizontalNavFacade;\n\n/**\n * A component for making virtualized tables\n * @param {D} data - data for table\n * @param {boolean} loaded - flag indicating data is loaded\n * @param {*} loadError - error object if issue loading data\n * @param {TableColumn[]} columns - column setup\n * @param {React.ComponentType} Row - row setup\n * @param {D} unfilteredData - original data without filter\n * @param {React.ComponentType} [NoDataEmptyMsg] - (optional) no data empty message component\n * @param {React.ComponentType} [EmptyMsg] - (optional) empty message component\n * @param {function} [scrollNode] - (optional) function to handle scroll\n * @param {string} [label] - (optional) label for table\n * @param {string} [ariaLabel] - (optional) aria label\n * @param {TableGridBreakpoint} [gridBreakPoint] - sizing of how to break up grid for responsiveness\n * @param {function} [onSelect] - (optional) function for handling select of table\n * @param {R} [rowData] - (optional) data specific to row\n * @param {number} [sortColumnIndex] - (optional) The index of the column to sort. The default is `0`\n * @param {SortByDirection.asc | SortByDirection.desc} [sortDirection] - (optional) The direction of the sort. The default is `SortByDirection.asc`\n * @example\n * ```ts\n * const MachineList: React.FC<MachineListProps> = (props) => {\n * return (\n * <VirtualizedTable<MachineKind>\n * {...props}\n * aria-label='Machines'\n * columns={getMachineColumns}\n * Row={getMachineTableRow}\n * />\n * );\n * }\n * ```\n */\nexport const VirtualizedTable: VirtualizedTableFC = require('@console/internal/components/factory/Table/VirtualizedTable')\n .default;\n\n/**\n * Component for displaying table data within a table row\n * @param {string} id - unique id for table\n * @param {Set<string>} activeColumnIDs - active columns\n * @param {string} [className] - (optional) option class name for styling\n * @example\n * ```ts\n * const PodRow: React.FC<RowProps<K8sResourceCommon>> = ({ obj, activeColumnIDs }) => {\n * return (\n * <>\n * <TableData id={columns[0].id} activeColumnIDs={activeColumnIDs}>\n * <ResourceLink kind=\"Pod\" name={obj.metadata.name} namespace={obj.metadata.namespace} />\n * </TableData>\n * <TableData id={columns[1].id} activeColumnIDs={activeColumnIDs}>\n * <ResourceLink kind=\"Namespace\" name={obj.metadata.namespace} />\n * </TableData>\n * // Important: the kebab menu cell should include the id and className prop values below\n * <TableData id='' className='pf-v5-c-table__action' activeColumnIDs={activeColumnIDs}>\n * <MockKebabMenu obj={obj} />\n * </TableData>\n * </>\n * );\n * };\n * ```\n */\nexport const TableData: React.FC<TableDataProps> = require('@console/internal/components/factory/Table/VirtualizedTable')\n .TableData;\n\n/**\n * A hook that provides a list of user-selected active TableColumns.\n * @param {Object} options - Which are passed as a key-value in the map\n * @param options.columns - An array of all available TableColumns\n * @param options.showNamespaceOverride - (optional) If true, a namespace column will be included, regardless of column management selections\n * @param options.columnManagementID - (optional) A unique id used to persist and retrieve column management selections to and from user settings. Usually a `group~version~kind` string for a resource.\n * @returns A tuple containing the current user-selected active columns (a subset of options.columns), and a boolean flag indicating whether user settings have been loaded.\n * @example\n * ```tsx\n * // See implementation for more details on TableColumn type\n * const [activeColumns, userSettingsLoaded] = useActiveColumns({\n * columns,\n * showNamespaceOverride: false,\n * columnManagementID,\n * });\n * return userSettingsAreLoaded ? <VirtualizedTable columns={activeColumns} {...otherProps} /> : null\n * ```\n */\nexport const useActiveColumns: UseActiveColumns = require('@console/internal/components/factory/Table/active-columns-hook')\n .useActiveColumns;\n\n/**\n * Component for generating a page header\n * @param {string} title - heading title\n * @param {ReactNode} [helpText] - (optional) help section as react node\n * @param {ReactNode} [badge] - (optional) badge icon as react node\n * @example\n * ```ts\n * const exampleList: React.FC = () => {\n * return (\n * <>\n * <ListPageHeader title=\"Example List Page\"/>\n * </>\n * );\n * };\n * ```\n */\nexport const ListPageHeader: React.FC<ListPageHeaderProps> = require('@console/internal/components/factory/ListPage/ListPageHeader')\n .default;\n\n/**\n * Component for adding a create button for a specific resource kind that automatically generates a link to the create YAML for this resource.\n * @param groupVersionKind group, version, kind of k8s resource `K8sGroupVersionKind` is preferred alternatively can pass reference for group, version, kind which is deprecated i.e `group~version~kind` `K8sResourceKindReference`. Core resources with no API group should leave off the `group` property\n * @example\n * ```ts\n * const exampleList: React.FC<MyProps> = () => {\n * return (\n * <>\n * <ListPageHeader title=\"Example List Page\"/>\n * <ListPageCreate groupVersionKind={{ group: 'app'; version: 'v1'; kind: 'Deployment' }}>Create Deployment</ListPageCreate>\n * </ListPageHeader>\n * </>\n * );\n * };\n * ```\n */\nexport const ListPageCreate: React.FC<ListPageCreateProps> = require('@console/internal/components/factory/ListPage/ListPageCreate')\n .default;\n\n/**\n * Component for creating a stylized link.\n * @param {string} to - string location where link should direct\n * @param {object} [createAccessReview] - (optional) object with namespace and kind used to determine access\n * @param {ReactNode} [children] - (optional) children for the component\n * @example\n * ```ts\n * const exampleList: React.FC<MyProps> = () => {\n * return (\n * <>\n * <ListPageHeader title=\"Example Pod List Page\"/>\n * <ListPageCreateLink to={'/link/to/my/page'}>Create Item</ListPageCreateLink>\n * </ListPageHeader>\n * </>\n * );\n * };\n * ```\n */\nexport const ListPageCreateLink: React.FC<ListPageCreateLinkProps> = require('@console/internal/components/factory/ListPage/ListPageCreate')\n .ListPageCreateLink;\n\n/**\n * Component for creating button.\n * @param {object} [createAccessReview] - (optional) object with namespace and kind used to determine access\n * @param {...object} [pfButtonProps] - (optional) Patternfly Button props\n * @example\n * ```ts\n * const exampleList: React.FC<MyProps> = () => {\n * return (\n * <>\n * <ListPageHeader title=\"Example Pod List Page\"/>\n * <ListPageCreateButton createAccessReview={access}>Create Pod</ListPageCreateButton>\n * </ListPageHeader>\n * </>\n * );\n * };\n * ```\n */\nexport const ListPageCreateButton: React.FC<ListPageCreateButtonProps> = require('@console/internal/components/factory/ListPage/ListPageCreate')\n .ListPageCreateButton;\n\n/**\n * Component for creating a dropdown wrapped with permissions check.\n * @param {object} items - key:ReactNode pairs of items to display in dropdown component\n * @param {function} onClick - callback function for click on dropdown items\n * @param {object} [createAccessReview] - (optional) object with namespace and kind used to determine access\n * @param {ReactNode} [children] - (optional) children for the dropdown toggle\n * @example\n * ```ts\n * const exampleList: React.FC<MyProps> = () => {\n * const items = {\n * SAVE: 'Save',\n * DELETE: 'Delete',\n * }\n * return (\n * <>\n * <ListPageHeader title=\"Example Pod List Page\"/>\n * <ListPageCreateDropdown createAccessReview={access} items={items}>Actions</ListPageCreateDropdown>\n * </ListPageHeader>\n * </>\n * );\n * };\n * ```\n */\nexport const ListPageCreateDropdown: React.FC<ListPageCreateDropdownProps> = require('@console/internal/components/factory/ListPage/ListPageCreate')\n .ListPageCreateDropdown;\n\n/**\n * Component that generates filter for list page.\n * @param {D} data - An array of data points\n * @param {boolean} loaded - indicates that data has loaded\n * @param {function} onFilterChange - callback function for when filter is updated\n * @param {RowFilter[]} [rowFilters] - (optional) An array of RowFilter elements that define the available filter options\n * @param {string} [labelFilter] - (optional) a unique name key for label filter. This may be useful if there are multiple `ListPageFilter` components rendered at once.\n * @param {string} [labelPath] - (optional) the path to labels to filter from\n * @param {string} [nameFilterTitle] - (optional) title for name filter\n * @param {string} [nameFilterPlaceholder] - (optional) placeholder for name filter\n * @param {string} [labelFilterPlaceholder] - (optional) placeholder for label filter\n * @param {boolean} [hideLabelFilter] - (optional) only shows the name filter instead of both name and label filter\n * @param {boolean} [hideNameLabelFilter] - (optional) hides both name and label filter\n * @param {ColumnLayout} [columnLayout] - (optional) column layout object\n * @param {boolean} [hideColumnManagement] - (optional) flag to hide the column management\n * @param {string} [nameFilter] - (optional) a unique name key for name filter. This may be useful if there are multiple `ListPageFilter` components rendered at once.\n * @param {RowSearchFilter[]} [rowSearchFilters] - (optional) An array of RowSearchFilters elements that define search text filters added on top of Name and Label filters\n * @example\n * ```tsx\n * // See implementation for more details on RowFilter and FilterValue types\n * const [staticData, filteredData, onFilterChange] = useListPageFilter(\n * data,\n * [...rowFilters, ...searchFilters],\n * staticFilters,\n * );\n * // ListPageFilter updates filter state based on user interaction and resulting filtered data can be rendered in an independent component.\n * return (\n * <>\n * <ListPageHeader />\n * <ListPagBody>\n * <ListPageFilter data={staticData} onFilterChange={onFilterChange} rowFilters={rowFilters} rowSearchFilters={searchFilters} />\n * <List data={filteredData} />\n * </ListPageBody>\n * </>\n * )\n * ```\n */\nexport const ListPageFilter: React.FC<ListPageFilterProps> = require('@console/internal/components/factory/ListPage/ListPageFilter')\n .default;\n\n/**\n * A hook that manages filter state for the ListPageFilter component.\n * @param data - An array of data points\n * @param rowFilters - (optional) An array of RowFilter elements that define the available filter options\n * @param staticFilters - (optional) An array of FilterValue elements that are statically applied to the data\n * @returns A tuple containing the data filtered by all static filteres, the data filtered by all static and row filters, and a callback that updates rowFilters\n * @example\n * ```tsx\n * // See implementation for more details on RowFilter and FilterValue types\n * const [staticData, filteredData, onFilterChange] = useListPageFilter(\n * data,\n * rowFilters,\n * staticFilters,\n * );\n * // ListPageFilter updates filter state based on user interaction and resulting filtered data can be rendered in an independent component.\n * return (\n * <>\n * <ListPageHeader .../>\n * <ListPagBody>\n * <ListPageFilter data={staticData} onFilterChange={onFilterChange} />\n * <List data={filteredData} />\n * </ListPageBody>\n * </>\n * )\n * ```\n */\nexport const useListPageFilter: UseListPageFilter = require('@console/internal/components/factory/ListPage/filter-hook')\n .useListPageFilter;\n\n/**\n * Component that creates a link to a specific resource type with an icon badge.\n * @param {K8sResourceKindReference} [kind] - (optional) the kind of resource such as Pod, Deployment, Namespace\n * @param {K8sGroupVersionKind} [groupVersionKind] - (optional) object with group, version, and kind\n * @param {string} [className] - (optional) class style for component\n * @param {string} [displayName] - (optional) display name for component, overwrites the resource name if set\n * @param {boolean} [inline=false] - (optional) flag to create icon badge and name inline with children\n * @param {boolean} [linkTo=true] - (optional) flag to create a Link object, defaults to true\n * @param {string} [name] - (optional) name of resource\n * @param {string} [namespace] - (optional) specific namespace for the kind resource to link to\n * @param {boolean} [hideIcon] - (optional) flag to hide the icon badge\n * @param {string} [title] - (optional) title for the link object (not displayed)\n * @param {string} [dataTest] - (optional) identifier for testing\n * @param {function} [onClick] - (optional) callback function for when component is clicked\n * @param {boolean} [truncate=false] - (optional) flag to truncate the link if too long\n * @example\n * ```tsx\n * <ResourceLink\n * kind=\"Pod\"\n * name=\"testPod\"\n * title={metadata.uid}\n * />\n * ```\n */\nexport const ResourceLink: React.FC<ResourceLinkProps> = require('@console/internal/components/utils/resource-link')\n .ResourceLink;\nexport { default as ResourceStatus } from '../app/components/utils/resource-status';\n\n/**\n * Component that creates an icon badge for a specific resource type.\n * @param {K8sResourceKindReference} [kind] - (optional) the kind of resource such as Pod, Deployment, Namespace\n * @param {K8sGroupVersionKind} [groupVersionKind] - (optional) object with group, version, and kind\n * @param {string} [className] - (optional) class style for component\n * @example\n * ```tsx\n * <ResourceIcon kind=\"Pod\"/>\n * ```\n */\nexport const ResourceIcon: React.FC<ResourceIconProps> = require('@console/internal/components/utils/resource-icon')\n .ResourceIcon;\n\nexport {\n useK8sModel,\n useK8sModels,\n useK8sWatchResource,\n useK8sWatchResources,\n} from '../utils/k8s/hooks';\n\nexport { consoleFetch, consoleFetchJSON, consoleFetchText } from '../utils/fetch';\n\n// Expose K8s CRUD utilities as below\nexport {\n k8sGetResource as k8sGet,\n k8sCreateResource as k8sCreate,\n k8sUpdateResource as k8sUpdate,\n k8sPatchResource as k8sPatch,\n k8sDeleteResource as k8sDelete,\n k8sListResource as k8sList,\n k8sListResourceItems as k8sListItems,\n} from '../utils/k8s';\nexport {\n getAPIVersionForModel,\n getGroupVersionKindForResource,\n getGroupVersionKindForModel,\n} from '../utils/k8s/k8s-ref';\n\n/**\n * Component that shows the status in a popup window. Can be used when building `console.dashboards/overview/health/resource` extensions.\n * @param {ReactNode} firstColumn - values for first column of popup\n * @param {ReactNode} [secondColumn] - (optional) values for second column of popup\n * @param {ReactNode} [children] - (optional) children for the popup\n * @example\n * ```tsx\n * <StatusPopupSection\n * firstColumn={\n * <>\n * <span>{title}</span>\n * <span className=\"text-secondary\">\n * My Example Item\n * </span>\n * </>\n * }\n * secondColumn='Status'\n * >\n * ```\n */\nexport const StatusPopupSection: React.FC<StatusPopupSectionProps> = require('@console/shared/src/components/dashboard/status-card/StatusPopup')\n .StatusPopupSection;\n\n/**\n * Status element used in status popup. Used in in `StatusPopupSection`.\n * @param {string} [value] - (optional) text value to display\n * @param {string} [icon] - (optional) icon to display\n * @param {React.ReactNode} children - child elements\n * @example\n * ```tsx\n * <StatusPopupSection\n * firstColumn='Example'\n * secondColumn='Status'\n * >\n * <StatusPopupItem icon={healthStateMapping[MCGMetrics.state]?.icon}>\n * Complete\n * </StatusPopupItem>\n * <StatusPopupItem icon={healthStateMapping[RGWMetrics.state]?.icon}>\n * Pending\n * </StatusPopupItem>\n * </StatusPopupSection>\n * ```\n */\nexport const StatusPopupItem: React.FC<StatusPopupItemProps> = require('@console/shared/src/components/dashboard/status-card/StatusPopup')\n .default;\n\n/**\n * Creates a wrapper component for a dashboard.\n * @param {string} [className] - (optional) style class for div\n * @param {React.ReactNode} [children] - (optional) elements of the dashboard\n * @example\n * ```tsx\n * <Overview>\n * <OverviewGrid mainCards={mainCards} leftCards={leftCards} rightCards={rightCards} />\n * </Overview>\n *```\n */\nexport const Overview: React.FC<OverviewProps> = require('@console/shared/src/components/dashboard/Dashboard')\n .default;\n\n/**\n * Creates a grid of card elements for a dashboard. Used within `Overview`.\n * @param {OverviewGridCard[]} mainCards - cards for grid\n * @param {OverviewGridCard[]} [leftCards] - (optional) cards for left side of grid\n * @param {OverviewGridCard[]} [rightCards] - (optional) cards for right side of grid\n * @example\n * ```tsx\n * <Overview>\n * <OverviewGrid mainCards={mainCards} leftCards={leftCards} rightCards={rightCards} />\n * </Overview>\n *```\n */\nexport const OverviewGrid: React.FC<OverviewGridProps> = require('@console/shared/src/components/dashboard/DashboardGrid')\n .default;\n\n/**\n * Creates an inventory card item.\n * @param {React.ReactNode} children - elements to render inside the item\n * @example\n * ```tsx\n * return (\n * <InventoryItem>\n * <InventoryItemTitle>{title}</InventoryItemTitle>\n * <InventoryItemBody error={loadError}>\n * {loaded && <InventoryItemStatus count={workerNodes.length} icon={<MonitoringIcon />} />}\n * </InventoryItemBody>\n * </InventoryItem>\n * )\n * ```\n */\nexport const InventoryItem: React.FC = require('@console/shared/src/components/dashboard/inventory-card/InventoryCard')\n .default;\n\n/**\n * Creates a title for an inventory card item. Used within `InventoryItem`.\n * @param {React.ReactNode} children - elements to render inside the title\n * @example\n * ```tsx\n * return (\n * <InventoryItem>\n * <InventoryItemTitle>{title}</InventoryItemTitle>\n * <InventoryItemBody error={loadError}>\n * {loaded && <InventoryItemStatus count={workerNodes.length} icon={<MonitoringIcon />} />}\n * </InventoryItemBody>\n * </InventoryItem>\n * )\n * ```\n */\nexport const InventoryItemTitle: React.FC<InventoryItemTitleProps> = require('@console/shared/src/components/dashboard/inventory-card/InventoryCard')\n .InventoryItemTitle;\n\n/**\n * Creates the body of an inventory card. Used within `InventoryCard` and can be used with `InventoryTitle`.\n * @param {React.ReactNode} children - elements to render inside the inventory card or title\n * @param {*} error - elements of the div\n * @example\n * ```tsx\n * return (\n * <InventoryItem>\n * <InventoryItemTitle>{title}</InventoryItemTitle>\n * <InventoryItemBody error={loadError}>\n * {loaded && <InventoryItemStatus count={workerNodes.length} icon={<MonitoringIcon />} />}\n * </InventoryItemBody>\n * </InventoryItem>\n * )\n * ```\n */\nexport const InventoryItemBody: React.FC<InventoryItemBodyProps> = require('@console/shared/src/components/dashboard/inventory-card/InventoryCard')\n .InventoryItemBody;\n\n/**\n * Creates a count and icon for an inventory card with optional link address. Used within `InventoryItemBody`.\n * @param {number} count - count for display\n * @param {React.ReactNode} icon - icon for display\n * @param {string} [linkTo] - (optional) link address\n * @example\n * ```tsx\n * return (\n * <InventoryItem>\n * <InventoryItemTitle>{title}</InventoryItemTitle>\n * <InventoryItemBody error={loadError}>\n * {loaded && <InventoryItemStatus count={workerNodes.length} icon={<MonitoringIcon />} />}\n * </InventoryItemBody>\n * </InventoryItem>\n * )\n * ```\n */\nexport const InventoryItemStatus: React.FC<InventoryItemStatusProps> = require('@console/shared/src/components/dashboard/inventory-card/InventoryCard')\n .InventoryItemStatus;\n\n/**\n * Creates a skeleton container for when an inventory card is loading. Used with `InventoryItem` and related components.\n * @example\n * ```tsx\n * if (loadError) {\n * title = <Link to={workerNodesLink}>{t('Worker Nodes')}</Link>;\n * } else if (!loaded) {\n * title = <><InventoryItemLoading /><Link to={workerNodesLink}>{t('Worker Nodes')}</Link></>;\n * }\n * return (\n * <InventoryItem>\n * <InventoryItemTitle>{title}</InventoryItemTitle>\n * </InventoryItem>\n * )\n * ```\n */\nexport const InventoryItemLoading: React.FC = require('@console/shared/src/components/dashboard/inventory-card/InventoryCard')\n .InventoryItemLoading;\n\nexport { useFlag } from '../utils/flags';\n\n/**\n * @deprecated Use [CodeEditor](#codeeditor) instead.\n * A basic lazy loaded YAML editor with hover help and completion.\n * @example\n * ```tsx\n * <React.Suspense fallback={<LoadingBox />}>\n * <YAMLEditor\n * value={code}\n * />\n * </React.Suspense>\n * ```\n * @param {YAMLEditorProps['value']} value - String representing the yaml code to render.\n * @param {CodeEditorProps['language']} language - String representing the language of the editor.\n * @param {YAMLEditorProps['options']} options - Monaco editor options. For more details, see https://microsoft.github.io/monaco-editor/docs.html#interfaces/editor.IStandaloneEditorConstructionOptions.html.\n * @param {YAMLEditorProps['minHeight']} minHeight - Minimum editor height in valid CSS height values.\n * @param {YAMLEditorProps['showShortcuts']} showShortcuts - Boolean to show shortcuts on top of the editor.\n * @param {YAMLEditorProps['toolbarLinks']} toolbarLinks - Array of ReactNode rendered on the toolbar links section on top of the editor.\n * @param {YAMLEditorProps['onChange']} onChange - Callback for on code change event.\n * @param {YAMLEditorProps['onSave']} onSave - Callback called when the command `CTRL + S` / `CMD + S` is triggered.\n * @param {YAMLEditorRef} ref - React reference to `{ editor?: IStandaloneCodeEditor }`. Using the 'editor' property, you are able to access to all methods to control the editor. For more information, see https://microsoft.github.io/monaco-editor/docs.html#interfaces/editor.IStandaloneCodeEditor.html.\n */\nexport const YAMLEditor: React.ForwardRefExoticComponent<\n CodeEditorProps & React.RefAttributes<CodeEditorRef>\n> = require('@console/internal/components/AsyncCodeEditor').AsyncCodeEditor;\n\n/**\n * A basic lazy loaded Code editor with hover help and completion.\n * @example\n * ```tsx\n * <React.Suspense fallback={<LoadingBox />}>\n * <CodeEditor\n * value={code}\n * language=\"yaml\"\n * />\n * </React.Suspense>\n * ```\n * @param {CodeEditorProps['value']} value - String representing the yaml code to render.\n * @param {CodeEditorProps['language']} language - String representing the language of the editor.\n * @param {CodeEditorProps['options']} options - Monaco editor options. For more details, please, visit https://microsoft.github.io/monaco-editor/docs.html#interfaces/editor.IStandaloneEditorConstructionOptions.html.\n * @param {CodeEditorProps['minHeight']} minHeight - Minimum editor height in valid CSS height values.\n * @param {CodeEditorProps['showShortcuts']} showShortcuts - Boolean to show shortcuts on top of the editor.\n * @param {CodeEditorProps['toolbarLinks']} toolbarLinks - Array of ReactNode rendered on the toolbar links section on top of the editor.\n * @param {CodeEditorProps['onChange']} onChange - Callback for on code change event.\n * @param {CodeEditorProps['onSave']} onSave - Callback called when the command CTRL / CMD + S is triggered.\n * @param {CodeEditorRef} ref - React reference to `{ editor?: IStandaloneCodeEditor }`. Using the 'editor' property, you are able to access to all methods to control the editor. For more information, visit https://microsoft.github.io/monaco-editor/docs.html#interfaces/editor.IStandaloneCodeEditor.html.\n */\nexport const CodeEditor: React.ForwardRefExoticComponent<\n CodeEditorProps & React.RefAttributes<CodeEditorRef>\n> = require('@console/internal/components/AsyncCodeEditor').AsyncCodeEditor;\n\n/**\n * A lazy loaded YAML editor for Kubernetes resources with hover help and completion.\n * The component uses the YAML editor and adds functionality, such as\n * resource update handling, alerts, save; cancel and reload buttons; and accessibility.\n * Unless `onSave` callback is provided, the resource update is automatically handled.\n * It should be wrapped in a `React.Suspense` component.\n * @example\n * ```tsx\n * <React.Suspense fallback={<LoadingBox />}>\n * <ResourceYAMLEditor\n * initialResource={resource}\n * header=\"Create resource\"\n * onSave={(content) => updateResource(content)}\n * />\n * </React.Suspense>\n * ```\n * @param {ResourceYAMLEditorProps['initialResource']} initialResource - YAML/Object representing a resource to be shown by the editor. This prop is used only during the inital render.\n * @param {ResourceYAMLEditorProps['header']} header - Add a header on top of the YAML editor.\n * @param {ResourceYAMLEditorProps['onSave']} onSave - Callback for the Save button. Passing it will override the default update performed on the resource by the editor.\n * @param {ResourceYAMLEditorProps['readOnly']} readOnly - Sets the YAML editor to read-only mode.\n * @param {ResourceYAMLEditorProps['create']} create - Editor will be on creation mode. Create button will replace the Save and Cancel buttons. If no onSave method defined, the 'Create' button will trigger the creation of the defined resource. Default: false\n * @param {ResourceYAMLEditorProps['onChange']} onChange - Callback triggered at any editor change.\n * @param {ResourceYAMLEditorProps['hideHeader']} hideHeader - On creation mode the editor by default show an header that can be hided with this property\n */\nexport const ResourceYAMLEditor: React.FC<ResourceYAMLEditorProps> = require('@console/internal/components/AsyncResourceYAMLEditor')\n .AsyncResourceYAMLEditor;\n\n/**\n * A component to show events related to a particular resource.\n * @example\n * ```tsx\n * const [resource, loaded, loadError] = useK8sWatchResource(clusterResource);\n * return <ResourceEventStream resource={resource} />\n * ```\n * @param {K8sResourceCommon} resource - An object whose related events should be shown.\n */\nexport const ResourceEventStream: React.FC<ResourceEventStreamProps> = require('@console/internal/components/events')\n .WrappedResourceEventStream;\n\n/**\n * Sets up a poll to Prometheus for a single query.\n * @param {PrometheusEndpoint} endpoint - one of the PrometheusEndpoint (label, query, range, rules, targets)\n * @param {string} [query] - (optional) Prometheus query string. If empty or undefined, polling is not started.\n * @param {number} [delay] - (optional) polling delay interval (ms)\n * @param {number} [endTime] - (optional) for QUERY_RANGE enpoint, end of the query range\n * @param {number} [samples] - (optional) for QUERY_RANGE enpoint\n * @param {number} [timespan] - (optional) for QUERY_RANGE enpoint\n * @param {string} [namespace] - (optional) a search param to append\n * @param {string} [timeout] - (optional) a search param to append\n * @returns A tuple containing the query response, a boolean flag indicating whether the response has completed, and any errors encountered during the request or post-processing of the request\n */\nexport const usePrometheusPoll: UsePrometheusPoll = (options) => {\n const result = require('@console/internal/components/graphs/prometheus-poll-hook').usePrometheusPoll(\n options,\n );\n // unify order with the rest of API\n return [result[0], !result[2], result[1]];\n};\n\n/**\n * A component to render timestamp.\n * The timestamps are synchronized between individual instances of the Timestamp component.\n * The provided timestamp is formatted according to user locale.\n *\n * @param {TimestampProps['timestamp']} timestamp - the timestamp to render. Format is expected to be ISO 8601 (used by Kubernetes), epoch timestamp, or an instance of a Date.\n * @param {TimestampProps['simple']} simple - render simple version of the component omitting icon and tooltip.\n * @param {TimestampProps['omitSuffix']} omitSuffix - formats the date ommiting the suffix.\n * @param {TimestampProps['className']} className - additional class name for the component.\n */\nexport const Timestamp: React.FC<TimestampProps> = require('@console/internal/components/utils/timestamp')\n .Timestamp;\n\nexport { useModal } from '../app/modal-support/useModal';\n\n/**\n * Component that allows to receive contributions from other plugins for the `console.action/provider` extension type.\n * See docs: https://github.com/openshift/console/blob/master/frontend/packages/console-dynamic-plugin-sdk/docs/console-extensions.md#consoleactionprovider\n *\n * @param {ActionServiceProviderProps[\"context\"]} context - Object with contextId and optional plugin data\n * @example\n * ```tsx\n * const context: ActionContext = { 'a-context-id': { dataFromDynamicPlugin } };\n *\n * ...\n *\n * <ActionServiceProvider context={context}>\n * {({ actions, options, loaded }) =>\n * loaded && (\n * <ActionMenu actions={actions} options={options} variant={ActionMenuVariant.DROPDOWN} />\n * )\n * }\n * </ActionServiceProvider>\n * ```\n */\nexport const ActionServiceProvider: React.FC<ActionServiceProviderProps> = require('@console/shared/src/components/actions/ActionServiceProvider')\n .default;\n\n/**\n * A component that renders a horizontal toolbar with a namespace dropdown menu in the leftmost position. Additional components can be passed in as children and will be rendered to the right of the namespace dropdown. This component is designed to be used at the top of the page. It should be used on pages where the user needs to be able to change the active namespace, such as on pages with k8s resources.\n * @param {function} onNamespaceChange - (optional) A function that is executed when a namespace option is selected. It accepts the new namespace in the form of a string as its only argument. The active namespace is updated automatically when an option is selected, but additional logic can be applied through this function. When the namespace is changed, the namespace parameter in the URL will be changed from the previous namespace to the newly selected namespace.\n * @param {boolean} isDisabled - (optional) A boolean flag that disables the namespace dropdown if set to true. This option only applies to the namespace dropdown and has no effect on child components.\n * @param {React.ReactNode} children - (optional) Additional elements to be rendered inside the toolbar to the right of the namespace dropdown.\n * @example\n * ```tsx\n * const logNamespaceChange = (namespace) => console.log(`New namespace: ${namespace}`);\n *\n * ...\n *\n * <NamespaceBar onNamespaceChange={logNamespaceChange}>\n * <NamespaceBarApplicationSelector />\n * </NamespaceBar>\n * <Page>\n *\n * ...\n * ```\n */\nexport const NamespaceBar: React.FC<NamespaceBarProps> = require('@console/internal/components/namespace-bar')\n .NamespaceBar;\n\n/**\n * Creates a full page ErrorBoundaryFallbackPage component to display the \"Oh no! Something went wrong.\" message along with the stack trace and other helpful debugging information.\n * This is to be used in conjunction with an `ErrorBoundary` component.\n *\n * @param {string} errorMessage - text description of the error message\n * @param {string} componentStack - component trace of the exception\n * @param {string} stack - stack trace of the exception\n * @param {string} title - title to render as the header of the error boundary page\n * @example\n * ```tsx\n * //in ErrorBoundary component\n * return (\n * if (this.state.hasError) {\n * return <ErrorBoundaryFallbackPage errorMessage={errorString} componentStack={componentStackString}\n * stack={stackTraceString} title={errorString}/>;\n * }\n *\n * return this.props.children;\n * }\n * )\n * ```\n */\nexport const ErrorBoundaryFallbackPage: React.FC<ErrorBoundaryFallbackProps> = require('@console/shared/src/components/error/fallbacks/ErrorBoundaryFallbackPage')\n .default;\n\n/**\n * A component that renders a graph of the results from a Prometheus PromQL query along with controls for interacting with the graph.\n * @param {CustomDataSource} customDataSource - (optional) Base URL of an API endpoint that handles PromQL queries. If provided, this is used instead of the default API for fetching data.\n * @param {number} defaultSamples - (optional) The default number of data samples plotted for each data series. If there are many data series, QueryBrowser might automatically pick a lower number of data samples than specified here.\n * @param {number} defaultTimespan - (optional) The default timespan for the graph in milliseconds - defaults to 1,800,000 (30 minutes).\n * @param {PrometheusLabels[][]} disabledSeries - (optional) Disable (don't display) data series with these exact label / value pairs.\n * @param {boolean} disableZoom - (optional) Flag to disable the graph zoom controls.\n * @param {PrometheusLabels} filterLabels - (optional) Optionally filter the returned data series to only those that match these label / value pairs.\n * @param {number} fixedEndTime - (optional) Set the end time for the displayed time range rather than showing data up to the current time.\n * @param {(labels: PrometheusLabels, i?: number) => string} formatSeriesTitle - (optional) Function that returns a string to use as the title for a single data series.\n * @param {React.ComponentType<{}>} GraphLink - (optional) Component for rendering a link to another page (for example getting more information about this query).\n * @param {boolean} hideControls - (optional) Flag to hide the graph controls for changing the graph timespan, and so on.\n * @param {boolean} isStack - (optional) Flag to display a stacked graph instead of a line graph. If showStackedControl is set, it will still be possible for the user to switch to a line graph.\n * @param {string} namespace - (optional) If provided, data is only returned for this namespace (only series that have this namespace label).\n * @param {GraphOnZoom} onZoom - (optional) Callback called when the graph is zoomed.\n * @param {number} pollInterval - (optional) If set, determines how often the graph is updated to show the latest data (in milliseconds).\n * @param {string[]} queries - Array of PromQL queries to run and display the results in the graph.\n * @param {boolean} showLegend - (optional) Flag to enable displaying a legend below the graph.\n * @param {boolean} showStackedControl - Flag to enable displaying a graph control for switching between stacked graph mode and line graph mode.\n * @param {number} timespan - (optional) The timespan that should be covered by the graph in milliseconds.\n * @param {string} units - (optional) Units to display on the Y-axis and in the tooltip.\n * @example\n * ```tsx\n * <QueryBrowser\n * defaultTimespan={15 * 60 * 1000}\n * namespace={namespace}\n * pollInterval={30 * 1000}\n * queries={[\n * 'process_resident_memory_bytes{job=\"console\"}',\n * 'sum(irate(container_network_receive_bytes_total[6h:5m])) by (pod)',\n * ]}\n * />\n * ```\n */\nexport const QueryBrowser: React.FC<QueryBrowserProps> = require('@console/shared/src/components/query-browser')\n .QueryBrowser;\n\n/**\n * A hook that provides a callback to launch a modal for editing Kubernetes resource annotations.\n *\n * @param {object} resource - The resource to edit annotations for, an object of K8sResourceCommon type.\n * @returns A function which will launch a modal for editing a resource's annotations.\n * @example\n * ```tsx\n * const PodAnnotationsButton = ({ pod }) => {\n * const { t } = useTranslation();\n * const launchAnnotationsModal = useAnnotationsModal(pod);\n * return <button onClick={launchAnnotationsModal}>{t('Edit Pod Annotations')}</button>\n * }\n * ```\n */\nexport const useAnnotationsModal: UseAnnotationsModal = require('@console/shared/src/hooks/useAnnotationsModal')\n .useAnnotationsModal;\n\n/**\n * A hook that provides a callback to launch a modal for deleting a resource.\n *\n * @param resource - The resource to delete.\n * @param redirectTo - (optional) A location to redirect to after deleting the resource.\n * @param message - (optional) A message to display in the modal.\n * @param btnText - (optional) The text to display on the delete button.\n * @param deleteAllResources - (optional) A function to delete all resources of the same kind.\n * @returns A function which will launch a modal for deleting a resource.\n * @example\n * ```tsx\n * const DeletePodButton = ({ pod }) => {\n * const { t } = useTranslation();\n * const launchDeleteModal = useDeleteModal(pod);\n * return <button onClick={launchDeleteModal}>{t('Delete Pod')}</button>\n * }\n * ```\n */\nexport const useDeleteModal: UseDeleteModal = require('@console/shared/src/hooks/useDeleteModal')\n .useDeleteModal;\n\n/**\n * A hook that provides a callback to launch a modal for editing Kubernetes resource labels.\n *\n * @param {object} resource - The resource to edit labels for, an object of K8sResourceCommon type.\n * @returns A function which will launch a modal for editing a resource's labels.\n * @example\n * ```tsx\n * const PodLabelsButton = ({ pod }) => {\n * const { t } = useTranslation();\n * const launchLabelsModal = useLabelsModal(pod);\n * return <button onClick={launchLabelsModal}>{t('Edit Pod Labels')}</button>\n * }\n * ```\n */\nexport const useLabelsModal: UseLabelsModal = require('@console/shared/src/hooks/useLabelsModal')\n .useLabelsModal;\n\n/**\n * Hook that provides the currently active namespace and a callback for setting the active namespace.\n * @returns A tuple containing the current active namespace and setter callback.\n * @example\n * ```tsx\n * const Component: React.FC = (props) => {\n * const [activeNamespace, setActiveNamespace] = useActiveNamespace();\n * return <select\n * value={activeNamespace}\n * onChange={(e) => setActiveNamespace(e.target.value)}\n * >\n * {\n * // ...namespace options\n * }\n * </select>\n * }\n * ```\n */\nexport const useActiveNamespace: UseActiveNamespace = require('@console/shared/src/hooks/useActiveNamespace')\n .useActiveNamespace;\n\n/**\n * Hook that provides a user setting value and a callback for setting the user setting value.\n * @returns A tuple containing the user setting value, a setter callback, and a loaded boolean.\n * @example\n * ```tsx\n * const Component: React.FC = (props) => {\n * const [state, setState, loaded] = useUserSettings(\n * 'devconsole.addPage.showDetails',\n * true,\n * true,\n * );\n * return loaded ? (\n * <WrappedComponent {...props} userSettingState={state} setUserSettingState={setState} />\n * ) : null;\n * };\n * ```\n */\nexport const useUserSettings: UseUserSettings = require('@console/shared/src/hooks/useUserSettings')\n .useUserSettings;\n\n/**\n * Hook that provides the current quick start context values. This allows plugins to interop with Console\n * quick start functionality.\n * @returns Quick start context values object.\n * @example\n * ```tsx\n * const OpenQuickStartButton = ({ quickStartId }) => {\n * const { setActiveQuickStart } = useQuickStartContext();\n * const onClick = React.useCallback(() => {\n * setActiveQuickStart(quickStartId);\n * }, [quickStartId]);\n * return <button onClick={onClick}>{t('Open Quick Start')}</button>\n * };\n * ```\n */\nexport const useQuickStartContext: UseQuickStartContext = require('@console/shared/src/hooks/useQuickStartContext')\n .useQuickStartContext;\n","import * as React from 'react';\nimport i18next from 'i18next';\nimport { QUERY_PROPERTIES } from '@console/dev-console/src/const';\nimport { Action } from '@console/dynamic-plugin-sdk';\nimport { UNASSIGNED_KEY } from '@console/topology/src/const';\nimport { EventSourceIcon, eventIconStyle } from '../utils/icons';\n\nexport const AddEventSourceAction = (\n namespace: string,\n application?: string,\n contextSource?: string,\n path?: string,\n): Action => {\n const params = new URLSearchParams();\n const pageUrl = `/catalog/ns/${namespace}`;\n params.append('catalogType', 'EventSource');\n contextSource && params.append(QUERY_PROPERTIES.CONTEXT_SOURCE, contextSource);\n application\n ? params.append(QUERY_PROPERTIES.APPLICATION, application)\n : params.append(QUERY_PROPERTIES.APPLICATION, UNASSIGNED_KEY);\n return {\n id: 'event-source-add',\n label: i18next.t('knative-plugin~Event Source'),\n icon: <EventSourceIcon style={eventIconStyle} />,\n cta: {\n href: `${pageUrl}?${params.toString()}`,\n },\n path,\n insertAfter: 'event-sink-add',\n };\n};\n","module.exports = __webpack_public_path__ + \"assets/packages/knative-plugin/src/imgs/channel.svg\";","import i18next from 'i18next';\nimport { Action } from '@console/dynamic-plugin-sdk/src';\nimport { KebabOption } from '@console/internal/components/utils';\nimport { K8sKind, K8sResourceKind } from '@console/internal/module/k8s';\nimport { addPubSubConnectionModal } from '../components/pub-sub/PubSubModalLauncher';\nimport { EventingTriggerModel } from '../models';\n\nexport const TRIGGER_ACTION_ID = 'eventing-trigger-add';\n\nexport const addTrigger = (model: K8sKind, source: K8sResourceKind): KebabOption => {\n return {\n // t('knative-plugin~Add Trigger')\n labelKey: 'knative-plugin~Add Trigger',\n callback: () =>\n addPubSubConnectionModal({\n source,\n }),\n accessReview: {\n group: EventingTriggerModel.apiGroup,\n resource: EventingTriggerModel.plural,\n name: source.metadata.name,\n namespace: source.metadata.namespace,\n verb: 'create',\n },\n };\n};\n\nexport const AddTriggerAction = (source: K8sResourceKind): Action => {\n return {\n id: TRIGGER_ACTION_ID,\n label: i18next.t('knative-plugin~Add Trigger'),\n cta: () =>\n addPubSubConnectionModal({\n source,\n }),\n accessReview: {\n group: EventingTriggerModel.apiGroup,\n resource: EventingTriggerModel.plural,\n name: source.metadata.name,\n namespace: source.metadata.namespace,\n verb: 'create',\n },\n };\n};\n","import i18next from 'i18next';\nimport { Action } from '@console/dynamic-plugin-sdk/src';\nimport { KebabOption } from '@console/internal/components/utils';\nimport { K8sKind, K8sResourceKind } from '@console/internal/module/k8s';\nimport { addPubSubConnectionModal } from '../components/pub-sub/PubSubModalLauncher';\nimport { EventingSubscriptionModel } from '../models';\n\nexport const SUBSCRIPTION_ACTION_ID = 'eventing-subscription-action';\n\nexport const addSubscription = (model: K8sKind, source: K8sResourceKind): KebabOption => {\n return {\n // t('knative-plugin~Add Subscription')\n labelKey: 'knative-plugin~Add Subscription',\n callback: () =>\n addPubSubConnectionModal({\n source,\n }),\n accessReview: {\n group: EventingSubscriptionModel.apiGroup,\n resource: EventingSubscriptionModel.plural,\n name: source.metadata.name,\n namespace: source.metadata.namespace,\n verb: 'create',\n },\n };\n};\n\nexport const AddSubscriptionAction = (source: K8sResourceKind): Action => {\n return {\n id: SUBSCRIPTION_ACTION_ID,\n label: i18next.t('knative-plugin~Add Subscription'),\n cta: () =>\n addPubSubConnectionModal({\n source,\n }),\n accessReview: {\n group: EventingSubscriptionModel.apiGroup,\n resource: EventingSubscriptionModel.plural,\n name: source.metadata.name,\n namespace: source.metadata.namespace,\n verb: 'create',\n },\n };\n};\n","import i18next from 'i18next';\nimport { Action } from '@console/dynamic-plugin-sdk/src';\nimport { KebabOption } from '@console/internal/components/utils';\nimport { K8sKind, K8sResourceKind } from '@console/internal/module/k8s';\nimport { ServiceModel } from '../models';\n\nexport const hideKnatifyAction = (resource: K8sResourceKind): boolean => {\n const isWorkloadReady = resource.status?.conditions?.find(\n (cd) => cd.type === 'Available' && cd.status === 'True',\n );\n return resource.metadata?.ownerReferences?.length > 0 || !isWorkloadReady;\n};\n\n/** @deprecated - Moving to Extensible Action for Deployment resource, see @console/app/src/actions */\nexport const setKnatify = (model: K8sKind, obj: K8sResourceKind): KebabOption => {\n const kind = obj.kind || model.kind;\n const apiVersion = obj.apiVersion || `${model.apiGroup}/${model.apiVersion}`;\n return {\n // t('knative-plugin~Make Serverless')\n labelKey: 'knative-plugin~Make Serverless',\n hidden: hideKnatifyAction(obj),\n href: `/knatify/ns/${obj.metadata.namespace}?name=${obj.metadata.name}&kind=${kind}&apiversion=${apiVersion}`,\n accessReview: {\n group: ServiceModel.apiGroup,\n resource: ServiceModel.plural,\n namespace: obj.metadata.namespace,\n verb: 'create',\n },\n };\n};\n\nexport const MakeServerless = (model: K8sKind, obj: K8sResourceKind): Action => {\n const kind = obj.kind || model.kind;\n const apiVersion = obj.apiVersion || `${model.apiGroup}/${model.apiVersion}`;\n return {\n id: 'make-serverless',\n label: i18next.t('knative-plugin~Make Serverless'),\n cta: {\n href: `/knatify/ns/${obj.metadata.namespace}?name=${obj.metadata.name}&kind=${kind}&apiversion=${apiVersion}`,\n },\n insertBefore: 'edit-labels',\n accessReview: {\n group: ServiceModel.apiGroup,\n resource: ServiceModel.plural,\n namespace: obj.metadata.namespace,\n verb: 'create',\n },\n };\n};\n","/* eslint-disable camelcase, tsdoc/syntax */\nimport * as React from 'react';\nimport * as _ from 'lodash-es';\nimport * as fuzzy from 'fuzzysearch';\nimport classNames from 'classnames';\nimport { Link, useLocation, useNavigate } from 'react-router-dom-v5-compat';\nimport { sortable } from '@patternfly/react-table';\nimport {\n Alert,\n Button,\n EmptyState,\n EmptyStateBody,\n EmptyStateVariant,\n Label as PfLabel,\n LabelGroup as PfLabelGroup,\n EmptyStateHeader,\n Breadcrumb,\n BreadcrumbItem,\n} from '@patternfly/react-core';\nimport { PencilAltIcon } from '@patternfly/react-icons/dist/esm/icons/pencil-alt-icon';\nimport { Helmet } from 'react-helmet';\nimport { useTranslation } from 'react-i18next';\n\nimport { breadcrumbsForGlobalConfig } from '../../cluster-settings/global-config';\n\nimport { K8sResourceKind } from '../../../module/k8s';\nimport { Table, TableData, TextFilter, RowFunctionArgs } from '../../factory';\nimport { confirmModal, createAlertRoutingModal } from '../../modals';\nimport { Firehose, Kebab, MsgBox, SectionHeading, StatusBox } from '../../utils';\nimport {\n getAlertmanagerConfig,\n patchAlertmanagerConfig,\n receiverTypes,\n} from './alertmanager-utils';\n\nexport enum InitialReceivers {\n Critical = 'Critical',\n Default = 'Default',\n Watchdog = 'Watchdog',\n}\n\ninterface AlertRoutingProps {\n // alertmanager-main Secret which holds alertmanager configuration yaml\n secret: K8sResourceKind;\n // alertmanager configuration yaml as object\n config: AlertmanagerConfig;\n}\n\nconst AlertRouting = ({ secret, config }: AlertRoutingProps) => {\n const groupBy = _.get(config, ['route', 'group_by'], []);\n const { t } = useTranslation();\n return (\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Alert routing')}>\n <Button\n className=\"co-alert-manager-config__edit-alert-routing-btn\"\n onClick={() => createAlertRoutingModal({ config, secret })}\n variant=\"secondary\"\n data-test=\"edit-alert-routing-btn\"\n >\n {t('public~Edit')}\n </Button>\n </SectionHeading>\n <div className=\"row\">\n <div className=\"col-sm-6\">\n <dl className=\"co-m-pane__details\">\n <dt>{t('public~Group by')}</dt>\n <dd data-test-id=\"group_by_value\">\n {_.isEmpty(groupBy) ? '-' : _.join(groupBy, ', ')}\n </dd>\n <dt>{t('public~Group wait')}</dt>\n <dd data-test-id=\"group_wait_value\">{_.get(config, ['route', 'group_wait'], '-')}</dd>\n </dl>\n </div>\n <div className=\"col-sm-6\">\n <dl className=\"co-m-pane__details\">\n <dt>{t('public~Group interval')}</dt>\n <dd data-test-id=\"group_interval_value\">\n {_.get(config, ['route', 'group_interval'], '-')}\n </dd>\n <dt>{t('public~Repeat interval')}</dt>\n <dd data-test-id=\"repeat_interval_value\">\n {_.get(config, ['route', 'repeat_interval'], '-')}\n </dd>\n </dl>\n </div>\n </div>\n </div>\n );\n};\n\nconst tableColumnClasses = [\n 'pf-v5-u-w-50-on-xs pf-v5-u-w-25-on-lg',\n 'pf-m-hidden pf-m-visible-on-lg pf-v5-u-w-25-on-lg',\n 'pf-v5-u-w-50-on-xs',\n Kebab.columnClass,\n];\n\nconst getIntegrationTypes = (receiver: AlertmanagerReceiver): string[] => {\n /* Given receiver = {\n \"name\": \"team-X-pager\",\n \"email_configs\": [...],\n \"pagerduty_configs\": [...]\n };\n returns ['email_configs', 'pagerduty_configs']\n */\n return _.filter(_.keys(receiver), (v) => _.endsWith(v, '_configs'));\n};\n\n/**\n * Recursive function which transverses routes and sub-routes to get labels and/or matchers for each receiver.\n * Each entry is a set of labels and/or matchers used to route alerts to a receiver\n *\n * Ex: returns\n * [{\n * \"receiver\": \"team-Y-pager\",\n * \"labels\": {\n * \"service\": \"database\",\n * \"owner\": \"team-Y\"\n * },\n * \"matchers\": [\"severity = critical\"]\n * },\n * {\n * \"receiver\": \"team-Y-pager\",\n * \"labels\": {\n * \"service\": \"files\",\n * \"severity\": \"critical\"\n * }\n * }]\n}*/\nconst getRoutingLabelsByReceivers = (\n routes: AlertmanagerRoute[],\n parentLabels: { [key: string]: string } = {},\n parentMatchers: string[] = [],\n): RoutingLabelsByReceivers[] => {\n let results: RoutingLabelsByReceivers[] = [];\n let labels = {};\n for (const obj of routes) {\n labels = _.merge({}, parentLabels, obj.match, obj.match_re);\n const matchers = [...parentMatchers, ...(obj.matchers ?? [])];\n results.push({ receiver: obj.receiver, labels, matchers });\n if (obj.routes) {\n results = results.concat(getRoutingLabelsByReceivers(obj.routes, labels, matchers));\n }\n }\n return results;\n};\n\n/**\n * Is receiver used in a top-level route that has no sub routes, or\n * is receiver not in any route (no routing labels)?\n */\nconst hasSimpleRoute = (\n config: AlertmanagerConfig,\n receiver: AlertmanagerReceiver,\n receiverRoutingLabels: RoutingLabelsByReceivers[],\n): boolean => {\n const routes = _.get(config, ['route', 'routes']);\n return (\n _.filter(routes, (route) => {\n return route.receiver === receiver.name && _.isUndefined(route.routes);\n }).length > 0 || _.isEmpty(receiverRoutingLabels)\n );\n};\n\n/**\n * Does receiver contains a single known receiver type (ex: pagerduty_config), which has a single config.\n * No receiver type specified is valid, as well as a single receiver type with no config\n */\nconst hasSimpleReceiver = (\n config: AlertmanagerConfig,\n receiver: AlertmanagerReceiver,\n receiverIntegrationTypes: string[],\n): boolean => {\n if (receiverIntegrationTypes.length === 0) {\n return true;\n } else if (receiverIntegrationTypes.length === 1) {\n const receiverConfig = receiverIntegrationTypes[0]; // ex: 'pagerduty_configs'\n const numConfigs = _.get(receiver, receiverConfig).length; // 'pagerduty_configs' is array and may have multiple sets of properties\n return _.hasIn(receiverTypes, receiverConfig) && numConfigs <= 1; // known receiver type and a single set of props\n }\n return false;\n};\n\nexport const numberOfIncompleteReceivers = (config: AlertmanagerConfig): number => {\n const { route, receivers } = config;\n const { receiver: defaultReceiverName } = route || {};\n\n // if no receivers or default receiver, then no longer initial setup, hide info alerts\n if (!receivers || !defaultReceiverName) {\n return 0;\n }\n const defaultReceiver = receivers.filter((receiver) => receiver.name === defaultReceiverName);\n const criticalReceiver = receivers.filter(\n (receiver) => receiver.name === InitialReceivers.Critical,\n );\n\n const numIncompleteReceivers =\n !_.isEmpty(defaultReceiver) && _.isEmpty(getIntegrationTypes(defaultReceiver[0])) ? 1 : 0;\n\n return !_.isEmpty(criticalReceiver) && _.isEmpty(getIntegrationTypes(criticalReceiver[0]))\n ? numIncompleteReceivers + 1\n : numIncompleteReceivers;\n};\n\nconst RoutingLabels: React.FC<RoutingLabelsProps> = ({ data }) => {\n const { labels, matchers } = data;\n const lbls = _.map(labels || {}, (value, key) => `${key}=${value}`);\n const values = [...lbls, ...(matchers ?? [])];\n\n return values.length > 0 ? (\n <PfLabelGroup>\n {values.map((value, i) => (\n <PfLabel key={`label-${i}`}>{value}</PfLabel>\n ))}\n </PfLabelGroup>\n ) : null;\n};\n\nconst deleteReceiver = (\n secret: K8sResourceKind,\n config: AlertmanagerConfig,\n receiverName: string,\n navigate: any,\n) => {\n // remove any routes which use receiverToDelete\n _.update(config, 'route.routes', (routes) => {\n _.remove(routes, (route: AlertmanagerRoute) => route.receiver === receiverName);\n return routes;\n });\n // delete receiver\n _.update(config, 'receivers', (receivers) => {\n _.remove(receivers, (receiver: AlertmanagerReceiver) => receiver.name === receiverName);\n return receivers;\n });\n return patchAlertmanagerConfig(secret, config).then(() => {\n navigate('/monitoring/alertmanagerconfig');\n });\n};\n\nconst ReceiverTableRow: React.FC<RowFunctionArgs<\n AlertmanagerReceiver,\n {\n routingLabelsByReceivers: RoutingLabelsByReceivers[];\n defaultReceiverName: string;\n config: any;\n secret: any;\n }\n>> = ({\n obj: receiver,\n customData: { routingLabelsByReceivers, defaultReceiverName, config, secret },\n}) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n // filter to routing labels belonging to current Receiver\n const receiverRoutingLabels = _.filter(routingLabelsByReceivers, { receiver: receiver.name });\n const receiverIntegrationTypes = getIntegrationTypes(receiver);\n const integrationTypesLabel = _.join(\n _.map(receiverIntegrationTypes, (type) => type.substr(0, type.indexOf('_configs'))),\n ', ',\n );\n const isDefaultReceiver = receiver.name === defaultReceiverName;\n const receiverHasSimpleRoute = hasSimpleRoute(config, receiver, receiverRoutingLabels);\n\n // Receiver form can only handle simple configurations. Can edit via form if receiver\n // has a simple route and receiver\n const canUseEditForm =\n receiverHasSimpleRoute && hasSimpleReceiver(config, receiver, receiverIntegrationTypes);\n\n // Receivers can be deleted if it has a simple route and not the default receiver\n const canDelete = !isDefaultReceiver && receiverHasSimpleRoute;\n\n const receiverMenuItems = (receiverName: string) => [\n {\n label: t('public~Edit Receiver'),\n callback: () => {\n const targetUrl = canUseEditForm\n ? `/monitoring/alertmanagerconfig/receivers/${receiverName}/edit`\n : `/monitoring/alertmanageryaml`;\n return navigate(targetUrl);\n },\n },\n {\n label: t('public~Delete Receiver'),\n isDisabled: !canDelete,\n tooltip: !canDelete\n ? t('public~Cannot delete the default receiver, or a receiver which has a sub-route')\n : '',\n callback: () =>\n confirmModal({\n title: t('public~Delete Receiver'),\n message: t('public~Are you sure you want to delete receiver {{receiverName}}?', {\n receiverName,\n }),\n btnText: t('public~Delete Receiver'),\n executeFn: () => deleteReceiver(secret, config, receiverName, navigate),\n }),\n },\n ];\n\n return (\n <>\n <TableData className={tableColumnClasses[0]}>{receiver.name}</TableData>\n <TableData className={tableColumnClasses[1]}>\n {(receiver.name === InitialReceivers.Critical ||\n receiver.name === InitialReceivers.Default) &&\n !integrationTypesLabel ? (\n <Link to={`/monitoring/alertmanagerconfig/receivers/${receiver.name}/edit`}>\n <PencilAltIcon className=\"co-icon-space-r pf-v5-c-button-icon--plain\" />\n {t('public~Configure')}\n </Link>\n ) : (\n integrationTypesLabel\n )}\n </TableData>\n <TableData className={tableColumnClasses[2]}>\n {isDefaultReceiver\n ? t('public~All (default receiver)')\n : _.map(receiverRoutingLabels, (rte, i) => {\n return <RoutingLabels data={rte} key={i} />;\n })}\n </TableData>\n <TableData className={tableColumnClasses[3]}>\n <Kebab options={receiverMenuItems(receiver.name)} />\n </TableData>\n </>\n );\n};\n\ninterface ReceiversTableProps {\n secret: K8sResourceKind;\n config: AlertmanagerConfig;\n data: AlertmanagerReceiver[];\n filterValue?: string;\n}\n\nconst ReceiversTable: React.FC<ReceiversTableProps> = (props) => {\n const { secret, config, filterValue } = props;\n const { route } = config;\n const { receiver: defaultReceiverName, routes } = route;\n const { t } = useTranslation();\n\n const routingLabelsByReceivers = React.useMemo(\n () => (_.isEmpty(routes) ? [] : getRoutingLabelsByReceivers(routes)),\n [routes],\n );\n\n const EmptyMsg = () => (\n <MsgBox title={t('public~No Receivers match filter {{filterValue}}', { filterValue })} />\n );\n const ReceiverTableHeader = () => {\n return [\n {\n title: t('public~Name'),\n sortField: 'name',\n transforms: [sortable],\n props: { className: tableColumnClasses[0] },\n },\n {\n title: t('public~Integration type'),\n props: { className: tableColumnClasses[1] },\n },\n {\n title: t('public~Routing labels'),\n props: { className: tableColumnClasses[2] },\n },\n {\n title: '',\n props: { className: tableColumnClasses[3] },\n },\n ];\n };\n\n const customData = React.useMemo(\n () => ({\n routingLabelsByReceivers,\n defaultReceiverName,\n config,\n secret,\n }),\n [config, defaultReceiverName, routingLabelsByReceivers, secret],\n );\n\n return (\n <Table\n {...props}\n aria-label={t('public~Receivers')}\n customData={customData}\n EmptyMsg={EmptyMsg}\n Header={ReceiverTableHeader}\n Row={ReceiverTableRow}\n loaded={true}\n defaultSortField=\"name\"\n virtualize\n />\n );\n};\nReceiversTable.displayName = 'ReceiversTable';\n\nconst ReceiversEmptyState: React.FC<{}> = () => {\n const { t } = useTranslation();\n return (\n <EmptyState variant={EmptyStateVariant.full}>\n <EmptyStateHeader titleText={<>{t('public~No receivers found')}</>} headingLevel=\"h2\" />\n <EmptyStateBody>\n {t(\n 'public~Create a receiver to get OpenShift alerts through other services such as email or a chat platform. The first receiver you create will become the default receiver and will automatically receive all alerts from this cluster. Subsequent receivers can have specific sets of alerts routed to them.',\n )}\n </EmptyStateBody>\n </EmptyState>\n );\n};\n\ninterface ReceiversProps {\n secret: K8sResourceKind;\n config: AlertmanagerConfig;\n}\n\nconst Receivers = ({ secret, config }: ReceiversProps) => {\n const [receiverFilter, setReceiverFilter] = React.useState('');\n let receivers = _.get(config, 'receivers', []);\n if (receiverFilter) {\n const filterStr = _.toLower(receiverFilter);\n receivers = receivers.filter((receiver) => fuzzy(filterStr, _.toLower(receiver.name)));\n }\n\n const numOfIncompleteReceivers = numberOfIncompleteReceivers(config);\n const { t } = useTranslation();\n const receiverString = t('public~receiver', { count: numOfIncompleteReceivers });\n return (\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Receivers')} />\n <div className=\"co-m-pane__filter-row\">\n <TextFilter\n defaultValue=\"\"\n label={t('public~Receivers by name')}\n onChange={(_event, val) => setReceiverFilter(val)}\n />\n <Link\n className=\"co-m-primary-action co-m-pane__filter-row-action\"\n to=\"/monitoring/alertmanagerconfig/receivers/~new\"\n >\n <Button variant=\"primary\" data-test-id=\"create-receiver\">\n {t('public~Create Receiver')}\n </Button>\n </Link>\n </div>\n {numOfIncompleteReceivers > 0 && (\n <Alert\n isInline\n className=\"co-alert co-alert--scrollable\"\n variant=\"info\"\n title={t('public~Incomplete alert {{receiverString}}', { receiverString })}\n >\n <div className=\"co-pre-line\">\n {t(\n 'public~Configure the {{receiverString}} to ensure that you learn about important issues with your cluster.',\n { receiverString },\n )}\n </div>\n </Alert>\n )}\n {_.isEmpty(receivers) && !receiverFilter ? (\n <ReceiversEmptyState />\n ) : (\n <ReceiversTable\n secret={secret}\n config={config}\n filterValue={receiverFilter}\n data={receivers}\n />\n )}\n </div>\n );\n};\n\nconst AlertmanagerConfiguration: React.FC<AlertmanagerConfigurationProps> = ({ obj: secret }) => {\n const { t } = useTranslation();\n const { config, errorMessage } = getAlertmanagerConfig(secret);\n\n if (errorMessage) {\n return (\n <Alert\n isInline\n className=\"co-alert co-alert--scrollable\"\n variant=\"danger\"\n title={t('public~An error occurred')}\n >\n <div className=\"co-pre-line\">{errorMessage}</div>\n </Alert>\n );\n }\n\n return (\n <>\n <AlertRouting secret={secret} config={config} />\n <Receivers secret={secret} config={config} />\n </>\n );\n};\n\nconst AlertmanagerConfigWrapper: React.FC<AlertmanagerConfigWrapperProps> = React.memo(\n ({ obj, ...props }) => {\n const { t } = useTranslation();\n return (\n <>\n <Helmet>\n <title>{t('public~Alerting')}</title>\n </Helmet>\n <StatusBox {...obj}>\n <AlertmanagerConfiguration {...props} obj={obj.data} />\n </StatusBox>\n </>\n );\n },\n);\n\nexport const AlertmanagerConfig: React.FC = () => {\n const { t } = useTranslation();\n const { pathname: url } = useLocation();\n\n const configPath = '/monitoring/alertmanagerconfig';\n const YAMLPath = '/monitoring/alertmanageryaml';\n\n const breadcrumbs = breadcrumbsForGlobalConfig('Alertmanager', configPath);\n\n return (\n <>\n <div className=\"pf-c-page__main-breadcrumb\">\n <Breadcrumb className=\"monitoring-breadcrumbs\">\n <BreadcrumbItem>\n <Link className=\"pf-c-breadcrumb__link\" to={breadcrumbs[0].path}>\n {breadcrumbs[0].name}\n </Link>\n </BreadcrumbItem>\n <BreadcrumbItem isActive>{breadcrumbs[1].name}</BreadcrumbItem>\n </Breadcrumb>\n </div>\n <div className=\"co-m-nav-title co-m-nav-title--detail co-m-nav-title--breadcrumbs\">\n <h1 className=\"co-m-pane__heading\">\n <div className=\"co-m-pane__name co-resource-item\">\n <span className=\"co-resource-item__resource-name\" data-test-id=\"resource-title\">\n {t('public~Alertmanager')}\n </span>\n </div>\n </h1>\n </div>\n <ul className=\"co-m-horizontal-nav__menu\">\n <li\n className={classNames('co-m-horizontal-nav__menu-item', {\n 'co-m-horizontal-nav-item--active': url === configPath,\n })}\n >\n <Link to={configPath} data-test-id=\"horizontal-link-details\">\n {t('public~Details')}\n </Link>\n </li>\n <li\n className={classNames('co-m-horizontal-nav__menu-item', {\n 'co-m-horizontal-nav-item--active': url === YAMLPath,\n })}\n >\n <Link to={YAMLPath} data-test-id=\"horizontal-link-yaml\">\n {t('public~YAML')}\n </Link>\n </li>\n </ul>\n <Firehose\n resources={[\n {\n kind: 'Secret',\n name: 'alertmanager-main',\n namespace: 'openshift-monitoring',\n isList: false,\n prop: 'obj',\n },\n ]}\n >\n <AlertmanagerConfigWrapper />\n </Firehose>\n </>\n );\n};\n\ntype AlertmanagerConfigWrapperProps = {\n obj?: {\n data?: K8sResourceKind;\n [key: string]: any;\n };\n};\n\ntype AlertmanagerConfigurationProps = {\n obj?: K8sResourceKind;\n onCancel?: () => void;\n};\ntype labels = {\n [key: string]: string;\n};\n\nexport type AlertmanagerRoute = {\n receiver?: string;\n groupBy?: { [key: string]: string };\n groupWait?: string;\n groupInterval?: string;\n repeatInterval?: string;\n match?: labels[];\n match_re?: labels[];\n routes?: AlertmanagerRoute[];\n matchers?: string[];\n};\n\ntype RoutingLabelsByReceivers = {\n receiver: string;\n labels: { [key: string]: string };\n matchers: string[];\n};\n\ntype WebhookConfig = {\n url: string;\n};\n\ntype PagerDutyConfig = {\n routingKey?: string;\n serviceKey?: string;\n};\n\nexport type AlertmanagerReceiver = {\n name: string;\n webhookConfigs?: WebhookConfig[];\n pagerdutyConfigs?: PagerDutyConfig[];\n};\n\n// eslint-disable-next-line no-redeclare\nexport type AlertmanagerConfig = {\n global: { [key: string]: string };\n route: AlertmanagerRoute;\n receivers: AlertmanagerReceiver[];\n};\n\ntype RoutingLabelsProps = {\n data: RoutingLabelsByReceivers;\n};\n","import * as React from 'react';\nimport { useModal } from '@console/dynamic-plugin-sdk/src/lib-core';\nimport { CopyToClipboard } from '@console/internal/components/utils';\nimport { Modal } from '@console/shared/src/components/modal';\nimport { ModalComponent } from 'packages/console-dynamic-plugin-sdk/src/app/modal-support/ModalProvider';\n\nconst CopyCodeModal: CopyCodeModalComponent = ({ title, snippet, closeModal }) => (\n <Modal isOpen onClose={closeModal} showClose title={title} variant=\"medium\">\n <CopyToClipboard key={snippet} value={snippet} />\n </Modal>\n);\n\nexport const useCopyCodeModal: UseCopyCodeModal = (title, snippet) => {\n const launcher = useModal();\n return React.useCallback(() => (snippet ? launcher(CopyCodeModal, { title, snippet }) : null), [\n launcher,\n snippet,\n title,\n ]);\n};\n\ntype CopyCodeModalProps = { title: string; snippet: string };\ntype CopyCodeModalComponent = ModalComponent<CopyCodeModalProps>;\ntype UseCopyCodeModal = (title: string, snippet: string) => () => void;\n","export { default as DropdownWithSwitch } from './dropdown-with-switch/DropdownWithSwitch';\nexport { default as ResourceDropdown } from './ResourceDropdown';\n","import i18next from 'i18next';\nimport {\n MachineAWSPlacement,\n MachineKind,\n MachineSetKind,\n MachineDeploymentKind,\n NodeKind,\n} from '@console/internal/module/k8s';\nimport { getName } from './common';\n\nexport const getMachineRole = (obj: MachineKind | MachineSetKind | MachineDeploymentKind): string =>\n obj?.metadata?.labels?.['machine.openshift.io/cluster-api-machine-role'];\n\nexport const getMachineInstanceType = (obj: MachineKind): string =>\n obj?.metadata?.labels?.['machine.openshift.io/instance-type'];\n\nexport const getMachineRegion = (obj: MachineKind): string =>\n obj?.metadata?.labels?.['machine.openshift.io/region'];\n\nexport const getMachineZone = (obj: MachineKind): string =>\n obj?.metadata?.labels?.['machine.openshift.io/zone'];\n\n// Machine sets don't have the region and zone labels. Use `providerSpec` if set.\nexport const getMachineAWSPlacement = (\n machineSet: MachineSetKind | MachineDeploymentKind,\n): MachineAWSPlacement => machineSet?.spec?.template?.spec?.providerSpec?.value?.placement || {};\n\nexport const getMachineNodeName = (obj: MachineKind) => obj?.status?.nodeRef?.name;\n\nexport const getMachineNode = (machine: MachineKind, nodes: NodeKind[] = []): NodeKind =>\n nodes.find((node) => getMachineNodeName(machine) === getName(node));\n\nexport const getMachineAddresses = (machine: MachineKind) => machine?.status?.addresses;\n\nexport const getMachinePhase = (obj: MachineKind): string => {\n const phase = obj?.status?.phase;\n return phase === 'Running' ? i18next.t('console-shared~Provisioned as node') : phase;\n};\n","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/helm.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/openshift.svg\";","import { k8sGet } from '@console/dynamic-plugin-sdk/src/utils/k8s';\nimport { BindableServicesModel } from './models';\nimport { BindableServiceGVK, BindableServicesKind } from './types';\n\ntype BindableServicesData = {\n bindableServices: BindableServiceGVK[];\n loaded: boolean;\n};\n\nconst bindableServicesData: BindableServicesData = {\n bindableServices: [],\n loaded: false,\n};\n\nexport const fetchBindableServices = async (): Promise<BindableServiceGVK[]> => {\n bindableServicesData.loaded = false;\n try {\n const bindableService: BindableServicesKind = await k8sGet(\n BindableServicesModel,\n 'bindable-kinds',\n );\n bindableServicesData.bindableServices = bindableService.status ?? [];\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('Error fetching bindable services', err);\n bindableServicesData.bindableServices = [];\n }\n bindableServicesData.loaded = true;\n return bindableServicesData.bindableServices;\n};\n\nexport const getBindableServicesList = () => {\n return bindableServicesData.bindableServices;\n};\n","// TODO(jtomasek): HOST_STATUS_READY is deprecated, remove its occurrences\n// once 'ready' status is replaced with 'available' in BMO\nexport const HOST_STATUS_READY = 'ready';\nexport const HOST_STATUS_AVAILABLE = 'available';\nexport const HOST_STATUS_UNMANAGED = 'unmanaged';\nexport const HOST_STATUS_OK = 'OK';\nexport const HOST_STATUS_ERROR = 'error';\nexport const HOST_STATUS_UNKNOWN = 'Unknown';\nexport const HOST_STATUS_EXTERNALLY_PROVISIONED = 'externally provisioned';\nexport const HOST_STATUS_PROVISIONED = 'provisioned';\nexport const HOST_STATUS_DEPROVISIONED = 'deprovisioned';\nexport const HOST_STATUS_REGISTERING = 'registering';\nexport const HOST_STATUS_INSPECTING = 'inspecting';\nexport const HOST_STATUS_PROVISIONING = 'provisioning';\nexport const HOST_STATUS_DEPROVISIONING = 'deprovisioning';\nexport const HOST_STATUS_MATCH_PROFILE = 'match profile';\nexport const HOST_STATUS_REGISTRATION_ERROR = 'registration error';\nexport const HOST_STATUS_INSPECTION_ERROR = 'inspection error';\nexport const HOST_STATUS_PROVISIONING_ERROR = 'provisioning error';\nexport const HOST_STATUS_POWER_MANAGEMENT_ERROR = 'power management error';\nexport const HOST_STATUS_DELETING = 'deleting';\n\nexport const HOST_POWER_STATUS_POWERED_ON = 'Powered on';\nexport const HOST_POWER_STATUS_POWERED_OFF = 'Powered off';\nexport const HOST_POWER_STATUS_POWERING_OFF = 'Powering off';\nexport const HOST_POWER_STATUS_POWERING_ON = 'Powering on';\n\n// NOTE(yaacov): HOST_STATUS_TITLE_KEYS translation keys.\n// t('metal3-plugin~Available')\n// t('metal3-plugin~OK')\n// t('metal3-plugin~Error')\n// t('metal3-plugin~Provisioned')\n// t('metal3-plugin~Externally provisioned')\n// t('metal3-plugin~Deprovisioned')\n// t('metal3-plugin~Registering')\n// t('metal3-plugin~Inspecting')\n// t('metal3-plugin~Provisioning')\n// t('metal3-plugin~Deprovisioning')\n// t('metal3-plugin~Registering')\n// t('metal3-plugin~Provisioned')\n// t('metal3-plugin~Registration error')\n// t('metal3-plugin~Inspection error')\n// t('metal3-plugin~Provisioning error')\n// t('metal3-plugin~Power Management Error'\n// t('metal3-plugin~Matching profile')\n// t('metal3-plugin~Deleting')\n// t('metal3-plugin~Unknown')\n// t('metal3-plugin~Unmanaged')\n\nexport const HOST_STATUS_TITLE_KEYS = {\n [HOST_STATUS_READY]: 'metal3-plugin~Available',\n [HOST_STATUS_AVAILABLE]: 'metal3-plugin~Available',\n [HOST_STATUS_OK]: 'metal3-plugin~OK',\n [HOST_STATUS_ERROR]: 'metal3-plugin~Error',\n [HOST_STATUS_PROVISIONED]: 'metal3-plugin~Provisioned',\n [HOST_STATUS_EXTERNALLY_PROVISIONED]: 'metal3-plugin~Externally provisioned',\n [HOST_STATUS_DEPROVISIONED]: 'metal3-plugin~Deprovisioned',\n [HOST_STATUS_REGISTERING]: 'metal3-plugin~Registering',\n [HOST_STATUS_INSPECTING]: 'metal3-plugin~Inspecting',\n [HOST_STATUS_PROVISIONING]: 'metal3-plugin~Provisioning',\n [HOST_STATUS_DEPROVISIONING]: 'metal3-plugin~Deprovisioning',\n [HOST_STATUS_REGISTRATION_ERROR]: 'metal3-plugin~Registration error',\n [HOST_STATUS_INSPECTION_ERROR]: 'metal3-plugin~Inspection error',\n [HOST_STATUS_PROVISIONING_ERROR]: 'metal3-plugin~Provisioning error',\n [HOST_STATUS_POWER_MANAGEMENT_ERROR]: 'metal3-plugin~Power Management Error',\n [HOST_STATUS_MATCH_PROFILE]: 'metal3-plugin~Matching profile',\n [HOST_STATUS_DELETING]: 'metal3-plugin~Deleting',\n [HOST_STATUS_UNKNOWN]: 'metal3-plugin~Unknown',\n [HOST_STATUS_UNMANAGED]: 'metal3-plugin~Unmanaged',\n};\n\n// NOTE(yaacov): HOST_STATUS_DESCRIPTION_KEYS translation keys.\n// t('metal3-plugin~The host is available to be provisioned as a node.')\n// t('metal3-plugin~The host is available to be provisioned as a node.')\n// t('metal3-plugin~The hardware details of the host are being collected. This will take a while. The host will become available when finished.')\n// t('metal3-plugin~An image is being written to the host's disk(s). This will take a while.\"')\n// t('metal3-plugin~The image is being wiped from the host's disk(s). This may take a while.')\n// t('metal3-plugin~The details for the host's BMC are either incorrect or incomplete therefore the host could not be managed.')\n// t('metal3-plugin~Collecting hardware details from the host failed.')\n// t('metal3-plugin~The image could not be written to the host.')\n// t('metal3-plugin~An error was found while trying to power the host either on or off.')\n// t('metal3-plugin~This host was provisioned outside of this cluster and added manually.')\n// t('metal3-plugin~Power operations cannot be performed on this host until Baseboard Management Controller (BMC) credentials are provided.')\n\nexport const HOST_STATUS_DESCRIPTION_KEYS = {\n [HOST_STATUS_READY]: 'metal3-plugin~The host is available to be provisioned as a node.',\n [HOST_STATUS_AVAILABLE]: 'metal3-plugin~The host is available to be provisioned as a node.',\n [HOST_STATUS_INSPECTING]:\n 'metal3-plugin~The hardware details of the host are being collected. This will take a while. The host will become available when finished.',\n [HOST_STATUS_PROVISIONING]:\n \"metal3-plugin~An image is being written to the host's disk(s). This will take a while.\",\n [HOST_STATUS_DEPROVISIONING]:\n \"metal3-plugin~The image is being wiped from the host's disk(s). This may take a while.\",\n [HOST_STATUS_REGISTRATION_ERROR]:\n \"metal3-plugin~The details for the host's BMC are either incorrect or incomplete therefore the host could not be managed.\",\n [HOST_STATUS_INSPECTION_ERROR]: 'metal3-plugin~Collecting hardware details from the host failed.',\n [HOST_STATUS_PROVISIONING_ERROR]: 'metal3-plugin~The image could not be written to the host.',\n [HOST_STATUS_POWER_MANAGEMENT_ERROR]:\n 'metal3-plugin~An error was found while trying to power the host either on or off.',\n [HOST_STATUS_EXTERNALLY_PROVISIONED]:\n 'metal3-plugin~This host was provisioned outside of this cluster and added manually.',\n [HOST_STATUS_UNMANAGED]:\n 'metal3-plugin~Power operations cannot be performed on this host until Baseboard Management Controller (BMC) credentials are provided.',\n};\n\nexport const HOST_REGISTERING_STATES = [\n HOST_STATUS_REGISTERING,\n HOST_STATUS_INSPECTING,\n HOST_STATUS_MATCH_PROFILE,\n];\n\nexport const HOST_PROVISIONING_STATES = [HOST_STATUS_PROVISIONING, HOST_STATUS_DEPROVISIONING];\n\nexport const HOST_ERROR_STATES = [\n HOST_STATUS_REGISTRATION_ERROR,\n HOST_STATUS_INSPECTION_ERROR,\n HOST_STATUS_PROVISIONING_ERROR,\n HOST_STATUS_POWER_MANAGEMENT_ERROR,\n HOST_STATUS_ERROR,\n];\n\nexport const HOST_WARN_STATES = [];\n\nexport const HOST_PROGRESS_STATES = [\n HOST_STATUS_INSPECTING,\n HOST_STATUS_PROVISIONING,\n HOST_STATUS_DEPROVISIONING,\n HOST_STATUS_REGISTERING,\n HOST_STATUS_MATCH_PROFILE,\n HOST_STATUS_DELETING,\n];\n\nexport const HOST_SUCCESS_STATES = [\n HOST_STATUS_READY,\n HOST_STATUS_AVAILABLE,\n HOST_STATUS_OK,\n HOST_STATUS_PROVISIONED,\n HOST_STATUS_EXTERNALLY_PROVISIONED,\n HOST_STATUS_DEPROVISIONED,\n];\n\nexport const HOST_INFO_STATES = [HOST_STATUS_UNMANAGED];\n\nexport const HOST_HARDWARE_ERROR_STATES = [HOST_STATUS_POWER_MANAGEMENT_ERROR];\n","import * as React from 'react';\nimport { ExtensionHook, ExtensionK8sKindVersionModel } from '../api/common-types';\nimport { ActionContext } from '../api/internal-types';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\nimport { AccessReviewResourceAttributes } from './console-types';\n\n/** ActionProvider contributes a hook that returns list of actions for specific context */\nexport type ActionProvider = ExtensionDeclaration<\n 'console.action/provider',\n {\n /** The context ID helps to narrow the scope of contributed actions to a particular area of the application. Ex - topology, helm */\n contextId: string | 'resource';\n /** A react hook which returns actions for the given scope.\n * If contextId = `resource` then the scope will always be a K8s resource object\n * */\n provider: CodeRef<ExtensionHook<Action[]>>;\n }\n>;\n\n/** ResourceActionProvider contributes a hook that returns list of actions for specific resource model */\nexport type ResourceActionProvider = ExtensionDeclaration<\n 'console.action/resource-provider',\n {\n /** The model for which this provider provides actions for. */\n model: ExtensionK8sKindVersionModel;\n /** A react hook which returns actions for the given resource model */\n provider: CodeRef<ExtensionHook<Action[]>>;\n }\n>;\n\n/** ActionGroup contributes an action group that can also be a submenu */\nexport type ActionGroup = ExtensionDeclaration<\n 'console.action/group',\n {\n /** ID used to identify the action section. */\n id: string;\n /** The label to display in the UI.\n * Required for submenus.\n * */\n label?: string;\n /** Whether this group should be displayed as submenu */\n submenu?: boolean;\n /** Insert this item before the item referenced here.\n * For arrays, the first one found in order is used.\n * */\n insertBefore?: string | string[];\n /** Insert this item after the item referenced here.\n * For arrays, the first one found in order is used.\n * insertBefore takes precedence.\n * */\n insertAfter?: string | string[];\n }\n>;\n\n/** ActionFilter can be used to filter an action */\nexport type ActionFilter = ExtensionDeclaration<\n 'console.action/filter',\n {\n /** The context ID helps to narrow the scope of contributed actions to a particular area of the application. Ex - topology, helm */\n contextId: string | 'resource';\n /** A function which will filter actions based on some conditions.\n * scope: The scope in which actions should be provided for.\n * Note: hook may be required if we want to remove the ModifyCount action from a deployment with HPA\n * */\n filter: CodeRef<(scope: any, action: Action) => boolean>;\n }\n>;\n\nexport type SupportedActionExtensions =\n | ActionProvider\n | ResourceActionProvider\n | ActionGroup\n | ActionFilter;\n\n// Type Guards\n\nexport const isActionProvider = (e: Extension): e is ActionProvider => {\n return e.type === 'console.action/provider';\n};\n\nexport const isResourceActionProvider = (e: Extension): e is ResourceActionProvider => {\n return e.type === 'console.action/resource-provider';\n};\n\nexport const isActionGroup = (e: Extension): e is ActionGroup => {\n return e.type === 'console.action/group';\n};\n\nexport const isActionFilter = (e: Extension): e is ActionFilter => {\n return e.type === 'console.action/filter';\n};\n\n// Support types\n\nexport type Action = {\n /** A unique identifier for this action. */\n id: string;\n /** The label to display in the UI. */\n label: React.ReactNode;\n /** Subtext for the menu item */\n description?: string;\n /** Executable callback or href.\n * External links should automatically provide an external link icon on action.\n * */\n cta: (() => void) | { href: string; external?: boolean };\n /** Whether the action is disabled. */\n disabled?: boolean;\n /** The tooltip for this action. */\n tooltip?: string;\n /** The disabled tooltip for this action. */\n disabledTooltip?: string;\n /** The icon for this action. */\n icon?: string | React.ReactNode;\n /** A `/` separated string where each segment denotes\n * Eg. `add-to-project`, `menu-1/menu-2`\n * */\n path?: string;\n /** Insert this item before the item referenced here.\n * For arrays, the first one found in order is used.\n * */\n insertBefore?: string | string[];\n /** Insert this item after the item referenced here.\n * For arrays, the first one found in order is used.\n * insertBefore takes precedence.\n * */\n insertAfter?: string | string[];\n /** Describes the access check to perform. */\n accessReview?: AccessReviewResourceAttributes;\n};\n\nexport type GroupedMenuOption = ActionGroup['properties'] & {\n children?: MenuOption[];\n};\n\nexport type MenuOption = Action | GroupedMenuOption;\n\nexport type ActionService = {\n actions: Action[];\n options: MenuOption[];\n loaded: boolean;\n error: any;\n};\n\nexport enum MenuOptionType {\n GROUP_MENU,\n SUB_MENU,\n ATOMIC_MENU,\n}\n\nexport type ActionServiceProviderProps = {\n context: ActionContext;\n children: (service: ActionService) => React.ReactNode;\n};\n","import * as React from 'react';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\nimport { AccessReviewResourceAttributes } from './console-types';\n\n/** This extension allows plugins to contribute an add action item to the add page of developer perspective.\n For example, a Serverless plugin can add a new action item for adding serverless functions\n to the add page of developer console. */\nexport type AddAction = ExtensionDeclaration<\n 'dev-console.add/action',\n {\n /** ID used to identify the action. */\n id: string;\n /** IDs used to identify the action groups the action would belong to. */\n groupId?: string;\n /** The label of the action */\n label: string;\n /** The description of the action. */\n description: string;\n /** The href to navigate to. */\n href?: string;\n /** A callback that performs an action on click */\n callback?: CodeRef<(props: Record<string, any>) => void>;\n /** The perspective display icon. */\n icon?: CodeRef<React.ReactNode>;\n /** Optional access review to control visibility / enablement of the action. */\n accessReview?: AccessReviewResourceAttributes[];\n }\n>;\n\n/** This extension allows plugins to contibute a group in the add page of developer console.\n Groups can be referenced by actions, which will be grouped together in the add action page based on their extension definition.\n For example, a Serverless plugin can contribute a Serverless group and together with multiple add actions. */\nexport type AddActionGroup = ExtensionDeclaration<\n 'dev-console.add/action-group',\n {\n /** ID used to identify the action group. */\n id: string;\n /** The title of the action group */\n name: string;\n /** ID of action group before which this group should be placed */\n insertBefore?: string;\n /** ID of action group after which this group should be placed */\n insertAfter?: string;\n /** The perspective display icon. */\n icon?: CodeRef<React.ReactNode> | string;\n }\n>;\n\n// Type guards\n\nexport const isAddAction = (e: Extension): e is AddAction => {\n return e.type === 'dev-console.add/action';\n};\n\nexport const isAddActionGroup = (e: Extension): e is AddActionGroup => {\n return e.type === 'dev-console.add/action-group';\n};\n","import { K8sModel } from '../api/common-types';\nimport { CodeRef, Extension, ExtensionDeclaration } from '../types';\n\nexport type DetailsPageBreadCrumbsHook = (\n kind: K8sModel,\n urlMatch: any,\n) => { name: string; path: string }[];\n\nexport type DetailPageBreadCrumbs = ExtensionDeclaration<\n 'dev-console.detailsPage/breadcrumbs',\n {\n /**\n * array of models(kindObj) against which bread crumb is needed\n */\n getModels: CodeRef<() => K8sModel[] | K8sModel>;\n /**\n * returns breadcrumb for the given kindref\n */\n breadcrumbsProvider: CodeRef<DetailsPageBreadCrumbsHook>;\n }\n>;\n\n// Type guards\n\nexport const isDetailPageBreadCrumbs = (e: Extension): e is DetailPageBreadCrumbs =>\n e.type === 'dev-console.detailsPage/breadcrumbs';\n","import * as React from 'react';\nimport { ExtensionHook } from '../api/common-types';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\n\n/** This extension allows plugins to contribute a new type of catalog item. For example, a Helm plugin can define\n a new catalog item type as HelmCharts that it wants to contribute to the Developer Catalog. */\nexport type CatalogItemType = ExtensionDeclaration<\n 'console.catalog/item-type',\n {\n /** Type for the catalog item. */\n type: string;\n /** Title for the catalog item. */\n title: string;\n /** Description for the type specific catalog. */\n catalogDescription?: string | CodeRef<React.ReactNode>;\n /** Description for the catalog item type. */\n typeDescription?: string;\n /** Custom filters specific to the catalog item. */\n filters?: CatalogItemAttribute[];\n /** Custom groupings specific to the catalog item. */\n groupings?: CatalogItemAttribute[];\n }\n>;\n\n/** This extension allows plugins to contribute extra metadata like custom filters or groupings for any catalog item type.\n For example, a plugin can attach a custom filter for HelmCharts that can filter based on chart provider. */\nexport type CatalogItemTypeMetadata = ExtensionDeclaration<\n 'console.catalog/item-type-metadata',\n {\n /** Type for the catalog item. */\n type: string;\n /** Custom filters specific to the catalog item. */\n filters?: CatalogItemAttribute[];\n /** Custom groupings specific to the catalog item. */\n groupings?: CatalogItemAttribute[];\n }\n>;\n\n/** This extension allows plugins to contribute a provider for a catalog item type. For example, a Helm Plugin can add a provider\n that fetches all the Helm Charts. This extension can also be used by other plugins to add more items to a specific catalog item type. */\nexport type CatalogItemProvider = ExtensionDeclaration<\n 'console.catalog/item-provider',\n {\n /** The unique identifier for the catalog this provider contributes to. */\n catalogId: string | string[];\n /** Type ID for the catalog item type. */\n type: string;\n /** Title for the catalog item provider */\n title: string;\n /** Fetch items and normalize it for the catalog. Value is a react effect hook. */\n provider: CodeRef<ExtensionHook<CatalogItem[], CatalogExtensionHookOptions>>;\n /** Priority for this provider. Defaults to 0. Higher priority providers may override catalog\n items provided by other providers. */\n priority?: number;\n }\n>;\n\n/** This extension can be used for plugins to contribute a handler that can filter specific catalog items.\n For example, the plugin can contribute a filter that filters helm charts from specific provider. */\nexport type CatalogItemFilter = ExtensionDeclaration<\n 'console.catalog/item-filter',\n {\n /** The unique identifier for the catalog this provider contributes to. */\n catalogId: string | string[];\n /** Type ID for the catalog item type. */\n type: string;\n /** Filters items of a specific type. Value is a function that takes CatalogItem[] and returns a subset based on the filter criteria. */\n filter: CodeRef<(item: CatalogItem) => boolean>;\n }\n>;\n\n/** This extension can be used to contribute a provider that adds extra metadata to specific catalog items. */\nexport type CatalogItemMetadataProvider = ExtensionDeclaration<\n 'console.catalog/item-metadata',\n {\n /** The unique identifier for the catalog this provider contributes to. */\n catalogId: string | string[];\n /** Type ID for the catalog item type. */\n type: string;\n /** A hook which returns a function that will be used to provide metadata to catalog items of a specific type. */\n provider: CodeRef<\n ExtensionHook<CatalogItemMetadataProviderFunction, CatalogExtensionHookOptions>\n >;\n }\n>;\n\nexport type SupportedCatalogExtensions =\n | CatalogItemType\n | CatalogItemTypeMetadata\n | CatalogItemProvider\n | CatalogItemFilter\n | CatalogItemMetadataProvider;\n\n// Type guards\n\nexport const isCatalogItemType = (e: Extension): e is CatalogItemType => {\n return e.type === 'console.catalog/item-type';\n};\n\nexport const isCatalogItemTypeMetadata = (e: Extension): e is CatalogItemTypeMetadata => {\n return e.type === 'console.catalog/item-type-metadata';\n};\n\nexport const isCatalogItemProvider = (e: Extension): e is CatalogItemProvider => {\n return e.type === 'console.catalog/item-provider';\n};\n\nexport const isCatalogItemFilter = (e: Extension): e is CatalogItemFilter => {\n return e.type === 'console.catalog/item-filter';\n};\n\nexport const isCatalogItemMetadataProvider = (e: Extension): e is CatalogItemMetadataProvider => {\n return e.type === 'console.catalog/item-metadata';\n};\n\n// Support types\n\nexport type CatalogExtensionHookOptions = {\n namespace: string;\n};\n\nexport type CatalogItem<T extends any = any> = {\n uid: string;\n type: string;\n typeLabel?: string | React.ReactNode;\n name: string;\n /** Optional title to render a custom title using ReactNode.\n * Rendered in catalog tile and side panel\n * */\n title?: React.ReactNode;\n // Used as the second label next to the provider label in the list result.\n secondaryLabel?: React.ReactNode;\n provider?: string;\n // Used as the tile description. If provided as a string, the description is truncated to 3 lines.\n // If provided as a ReactNode, the contents will not be truncated.\n // This description will also be shown in the side panel if there are no `details.descriptions`.\n description?: string | React.ReactNode;\n tags?: string[];\n creationTimestamp?: string;\n supportUrl?: string;\n documentationUrl?: string;\n attributes?: {\n [key: string]: any;\n };\n cta?: {\n label: string;\n href?: string;\n callback?: (props?: any) => void;\n };\n icon?: {\n url?: string;\n class?: string;\n node?: React.ReactNode;\n };\n details?: CatalogItemDetails;\n // Optional text only badges for the catalog item which will be rendered on the tile and details panel.\n badges?: CatalogItemBadge[];\n // Optional data attached by the provider.\n // May be consumed by filters.\n // `data` for each `type` of CatalogItem should implement the same interface.\n data?: T;\n};\n\nexport type CatalogItemDetails = {\n properties?: CatalogItemDetailsProperty[];\n descriptions?: CatalogItemDetailsDescription[];\n};\n\nexport type CatalogItemDetailsProperty = {\n label: string;\n value: string | React.ReactNode;\n isHidden?: boolean;\n};\n\nexport type CatalogItemDetailsDescription = {\n label?: string;\n value: string | React.ReactNode;\n};\n\nexport type CatalogItemAttribute = {\n label: string;\n attribute: string;\n description?: string;\n};\n\nexport type CatalogItemBadge = {\n text: string;\n color?: 'blue' | 'cyan' | 'green' | 'orange' | 'purple' | 'red' | 'grey';\n icon?: React.ReactNode;\n variant?: 'outline' | 'filled';\n};\n\nexport type CatalogItemMetadataProviderFunction = (\n item: CatalogItem,\n) =>\n | {\n tags?: string[];\n badges?: CatalogItemBadge[];\n attributes?: {\n [key: string]: any;\n };\n }\n | undefined;\n","import * as React from 'react';\nimport { JSONSchema7Type } from 'json-schema';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\nimport { AccessReviewResourceAttributes } from './console-types';\n\nexport type Resource = {\n /** Resource API group and version */\n api: string;\n /** Resource kind */\n kind: string;\n /** Resource name, or namespace and name for namespaced-scoped resources */\n resource: {\n metadata: {\n namespace?: string;\n name: string;\n };\n };\n};\n\nexport type Path = string;\n\nexport type ClusterConfigurationFieldProps = {\n readonly: boolean;\n};\n\nexport enum ClusterConfigurationFieldType {\n text = 'text',\n checkbox = 'checkbox',\n dropdown = 'dropdown',\n custom = 'custom',\n}\n\nexport type ClusterConfigurationTextField = {\n type: ClusterConfigurationFieldType.text;\n defaultValue?: string;\n /**\n * Update operation that is used to save the latest text value.\n * If `update.patch.value` is not defined the text value will be used.\n * If `update.patch.value` is defined is must be a string, object or array.\n * The text value will be automatically inserted into the placeholder `$value`.\n */\n resource: Resource;\n path: Path;\n};\n\nexport type ClusterConfigurationCheckboxFieldValue = string | number | boolean;\n\nexport type ClusterConfigurationCheckboxField = {\n type: ClusterConfigurationFieldType.checkbox;\n defaultValue?: ClusterConfigurationCheckboxFieldValue;\n trueValue?: ClusterConfigurationCheckboxFieldValue;\n falseValue?: ClusterConfigurationCheckboxFieldValue;\n /**\n * A patch operation that is used to save if the checkbox is checked.\n * if `update.patch.value` is not defined a true (boolean) is automatically set.\n * If `update.patch.value` is defined is must be a string, object or array.\n * The text value will be automatically inserted into the placeholder `$value`.\n */\n resource: Resource;\n path: Path;\n};\n\nexport type ClusterConfigurationDropdownFieldValue = string;\n\nexport type ClusterConfigurationDropdownField = {\n type: ClusterConfigurationFieldType.dropdown;\n defaultValue?: ClusterConfigurationDropdownFieldValue;\n options: {\n value: ClusterConfigurationDropdownFieldValue;\n label: string;\n description?: string;\n }[];\n /**\n * A patch operation that is used to save if the checkbox is checked.\n * if `update.patch.value` is not defined a true (boolean) is automatically set.\n * If `update.patch.value` is defined is must be a string, object or array.\n * The text value will be automatically inserted into the placeholder `$value`.\n */\n resource: Resource;\n path: Path;\n};\n\nexport type ClusterConfigurationCustomField = {\n type: ClusterConfigurationFieldType.custom;\n component: CodeRef<React.ComponentType<ClusterConfigurationFieldProps>>;\n props?: { [key: string]: JSONSchema7Type };\n};\n\nexport type ClusterConfigurationField = ClusterConfigurationCustomField;\n\nexport type ClusterConfigurationGroup = ExtensionDeclaration<\n 'console.cluster-configuration/group',\n {\n /** ID used to identify the cluster configuration group. */\n id: string;\n /** The label of the cluster configuration group. */\n label: string;\n /** ID of cluster configuration group before which this group should be placed. */\n insertBefore?: string;\n /** ID of cluster configuration group after which this group should be placed. */\n insertAfter?: string;\n }\n>;\n\nexport type ClusterConfigurationItem = ExtensionDeclaration<\n 'console.cluster-configuration/item',\n {\n /** ID used to identify the cluster configuration item and referenced in insertAfter and insertBefore to define the item order. */\n id: string;\n /** IDs used to identify the cluster configuration groups the item would belong to. */\n groupId: string;\n /** The label of the cluster configuration */\n label: string;\n /** The description of the cluster configuration. */\n description: string;\n /** The UI field configuration to render input field or custom components that allow the user to change the cluster configuration. */\n field: ClusterConfigurationField;\n /** ID of cluster configuration item before which this item should be placed. */\n insertBefore?: string;\n /** ID of cluster configuration item after which this item should be placed. */\n insertAfter?: string;\n /**\n * Optional list of resources that are neccessary to render the input field with the current configuration state.\n * If the user has not access to all required fields the input field is not rendered at all.\n */\n readAccessReview?: AccessReviewResourceAttributes[];\n /**\n * Optional list of resources that are neccessary to update the configuration.\n * If The user has access to all readAccessReview resources, but not all writeAccessReview the input field is rendered read-only.\n */\n writeAccessReview?: AccessReviewResourceAttributes[];\n }\n>;\n\n// Type guards\n\nexport const isClusterConfigurationGroup = (e: Extension): e is ClusterConfigurationGroup => {\n return e.type === 'console.cluster-configuration/group';\n};\n\nexport const isClusterConfigurationItem = (e: Extension): e is ClusterConfigurationItem => {\n return e.type === 'console.cluster-configuration/item';\n};\n","import * as React from 'react';\nimport { OverviewDetailItemProps } from '@openshift-console/plugin-shared/src';\nimport { CodeRef, Extension, ExtensionDeclaration } from '../types';\nimport { Humanize, TopConsumerPopoverProps, QueryWithDescription } from './console-types';\n\n/** Adds a new inventory item into cluster overview page. */\nexport type ClusterOverviewInventoryItem = ExtensionDeclaration<\n 'console.cluster-overview/inventory-item',\n {\n /** The component to be rendered. */\n component: CodeRef<React.ComponentType>;\n }\n>;\n\nexport type GetQuery = (nodeType: string[]) => string;\nexport type GetMultilineQueries = (nodeType: string[]) => QueryWithDescription[];\n\n/** Adds a new cluster overview utilization item. */\nexport type ClusterOverviewUtilizationItem = ExtensionDeclaration<\n 'console.cluster-overview/utilization-item',\n {\n /** The title of the utilization item. */\n title: string;\n /** Prometheus utilization query. */\n getUtilizationQuery: CodeRef<GetQuery>;\n /** Convert prometheus data to human readable form. */\n humanize: CodeRef<Humanize>;\n /** Prometheus total query. */\n getTotalQuery?: CodeRef<GetQuery>;\n /** Prometheus request query. */\n getRequestQuery?: CodeRef<GetQuery>;\n /** Prometheus limit query. */\n getLimitQuery?: CodeRef<GetQuery>;\n /** Shows Top consumer popover instead of plain value */\n TopConsumerPopover?: CodeRef<React.ComponentType<TopConsumerPopoverProps>>;\n }\n>;\n\n/** Adds a new cluster overview multiline utilization item. */\nexport type ClusterOverviewMultilineUtilizationItem = ExtensionDeclaration<\n 'console.cluster-overview/multiline-utilization-item',\n {\n /** The title of the utilization item. */\n title: string;\n /** Prometheus utilization query. */\n getUtilizationQueries: CodeRef<GetMultilineQueries>;\n /** Convert prometheus data to human readable form. */\n humanize: CodeRef<Humanize>;\n /** Shows Top consumer popover instead of plain value */\n TopConsumerPopovers?: CodeRef<React.ComponentType<TopConsumerPopoverProps>[]>;\n }\n>;\n\n/**\n * @deprecated use CustomOverviewDetailItem type instead\n */\nexport type OverviewDetailItem = ExtensionDeclaration<\n 'console.dashboards/overview/detail/item',\n {\n /** The value, based on the DetailItem component */\n component: CodeRef<React.ComponentType>;\n }\n>;\n\n/** Adds an item to the Details card of Overview Dashboard */\nexport type CustomOverviewDetailItem = ExtensionDeclaration<\n 'console.dashboards/custom/overview/detail/item',\n Omit<OverviewDetailItemProps, 'children' | 'isLoading' | 'error'> & {\n /** The value, rendered by the OverviewDetailItem component */\n component: CodeRef<React.ComponentType>;\n /** Function returning the loading state of the component */\n isLoading?: CodeRef<() => boolean>;\n /** Function returning errors to be displayed by the component */\n error?: CodeRef<() => string>;\n }\n>;\n\n// Type guards\n\nexport const isClusterOverviewInventoryItem = (e: Extension): e is ClusterOverviewInventoryItem =>\n e.type === 'console.cluster-overview/inventory-item';\n\nexport const isClusterOverviewUtilizationItem = (\n e: Extension,\n): e is ClusterOverviewUtilizationItem => e.type === 'console.cluster-overview/utilization-item';\n\nexport const isClusterOverviewMultilineUtilizationItem = (\n e: Extension,\n): e is ClusterOverviewMultilineUtilizationItem =>\n e.type === 'console.cluster-overview/multiline-utilization-item';\n\nexport const isOverviewDetailItem = (e: Extension): e is OverviewDetailItem =>\n e.type === 'console.dashboards/overview/detail/item';\n\nexport const isCustomOverviewDetailItem = (e: Extension): e is CustomOverviewDetailItem =>\n e.type === 'console.dashboards/custom/overview/detail/item';\n","import { Provider } from 'react';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\n\n/** Adds new React context provider to Console application root. */\nexport type ContextProvider<T = any> = ExtensionDeclaration<\n 'console.context-provider',\n {\n /** Context Provider component. */\n provider: CodeRef<Provider<T>>;\n /** Hook for the Context value. */\n useValueHook: CodeRef<() => T>;\n }\n>;\n\n// Type guards\n\nexport const isContextProvider = (e: Extension): e is ContextProvider =>\n e.type === 'console.context-provider';\n","import { ExtensionK8sModel } from '../api/common-types';\nimport { CodeRef, Extension, ExtensionDeclaration } from '../types';\n\n/** Properties of custom CreateResource component. */\nexport type CreateResourceComponentProps = { namespace?: string };\n\n/** This extension allows plugins to provide a custom component (ie wizard or form) for specific resources,\n which will be rendered, when users try to create a new resource instance. */\nexport type CreateResource = ExtensionDeclaration<\n 'console.resource/create',\n {\n /** The model for which this create resource page will be rendered. */\n model: ExtensionK8sModel;\n /** The component to be rendered when the model matches */\n component: CodeRef<React.ComponentType<CreateResourceComponentProps>>;\n }\n>;\n\n// Type guards\n\nexport const isCreateResource = (e: Extension): e is CreateResource =>\n e.type === 'console.resource/create';\n","import { K8sModel } from '../api/common-types';\nimport { Extension, ExtensionDeclaration, CodeRef, ResolvedExtension } from '../types';\nimport {\n K8sResourceCommon,\n PrometheusResponse,\n ResourcesObject,\n StatusGroupMapper,\n WatchK8sResources,\n WatchK8sResults,\n FirehoseResource,\n FirehoseResult,\n} from './console-types';\nimport {\n CardSpan,\n GetOperatorsWithStatuses,\n K8sActivityProps,\n OperatorRowProps,\n PrometheusActivityProps,\n PrometheusHealthHandler,\n PrometheusHealthPopupProps,\n ResourceHealthHandler,\n URLHealthHandler,\n} from './dashboard-types';\n\n/** Adds a new dashboard tab, placed after the Overview tab. */\nexport type DashboardsTab = ExtensionDeclaration<\n 'console.dashboards/tab',\n {\n /** A unique tab identifier, used as tab link `href` and when adding cards to this tab. */\n id: string;\n /** NavSection to which the tab belongs to */\n navSection: 'home' | 'storage';\n /** The title of the tab. */\n title: string;\n }\n>;\n\n/** Adds a new dashboard card. */\nexport type DashboardsCard = ExtensionDeclaration<\n 'console.dashboards/card',\n {\n /** The id of the dashboard tab to which the card will be added. */\n tab: string;\n /** The grid position of the card on the dashboard. */\n position: 'LEFT' | 'RIGHT' | 'MAIN';\n /** Dashboard card component. */\n component: CodeRef<React.ComponentType>;\n /** Card's vertical span in the column. Ignored for small screens, defaults to 12. */\n span?: CardSpan;\n }\n>;\n\n/** Adds a health subsystem to the status card of Overview dashboard where the source of status is Prometheus. */\nexport type DashboardsOverviewHealthPrometheusSubsystem = ExtensionDeclaration<\n 'console.dashboards/overview/health/prometheus',\n {\n /** The display name of the subsystem. */\n title: string;\n /** The Prometheus queries */\n queries: string[];\n /** Resolve the subsystem's health. */\n healthHandler: CodeRef<PrometheusHealthHandler>;\n /** Additional resource which will be fetched and passed to `healthHandler`. */\n additionalResource?: CodeRef<FirehoseResource>;\n /** Loader for popup content. If defined, a health item will be represented as a link which opens popup with given content. */\n popupComponent?: CodeRef<React.ComponentType<PrometheusHealthPopupProps>>;\n /** The title of the popover. */\n popupTitle?: string;\n /** Optional classname for the popup top-level component. */\n popupClassname?: string;\n /** If true, the popup will stay open when clicked outside of its boundary. Default: false */\n popupKeepOnOutsideClick?: boolean;\n /** Control plane topology for which the subsystem should be hidden. */\n disallowedControlPlaneTopology?: string[];\n }\n>;\n\n/** Adds a health subsystem to the status card of Overview dashboard where the source of status is a K8s REST API. */\nexport type DashboardsOverviewHealthURLSubsystem<\n T = any,\n R extends K8sResourceCommon | K8sResourceCommon[] = K8sResourceCommon | K8sResourceCommon[]\n> = ExtensionDeclaration<\n 'console.dashboards/overview/health/url',\n {\n /** The display name of the subsystem. */\n title: string;\n /** The URL to fetch data from. It will be prefixed with base k8s URL. */\n url: string;\n /** Resolve the subsystem's health. */\n healthHandler: CodeRef<URLHealthHandler<T>>;\n /** Additional resource which will be fetched and passed to `healthHandler`. */\n additionalResource?: CodeRef<FirehoseResource>;\n /** Loader for popup content. If defined, a health item will be represented as a link which opens popup with given content. */\n popupComponent?: CodeRef<\n React.ComponentType<{\n healthResult?: T;\n healthResultError?: any;\n k8sResult?: FirehoseResult<R>;\n }>\n >;\n /** The title of the popover. */\n popupTitle?: string;\n }\n>;\n\n/** Adds a health subsystem to the status card of Overview dashboard where the source of status is a K8s Resource. */\nexport type DashboardsOverviewHealthResourceSubsystem<\n T extends ResourcesObject = ResourcesObject\n> = ExtensionDeclaration<\n 'console.dashboards/overview/health/resource',\n {\n /** The display name of the subsystem. */\n title: string;\n /** Kubernetes resources which will be fetched and passed to `healthHandler`. */\n resources: CodeRef<WatchK8sResources<T>>;\n /** Resolve the subsystem's health. */\n healthHandler: CodeRef<ResourceHealthHandler<T>>;\n /** Loader for popup content. If defined, a health item will be represented as a link which opens popup with given content. */\n popupComponent?: CodeRef<WatchK8sResults<T>>;\n /** The title of the popover. */\n popupTitle?: string;\n }\n>;\n\n/** Adds a health subsystem to the status card of Overview dashboard where the source of status is a K8s REST API. */\nexport type DashboardsOverviewHealthOperator<\n T extends K8sResourceCommon = K8sResourceCommon\n> = ExtensionDeclaration<\n 'console.dashboards/overview/health/operator',\n {\n /** Title of operators section in the popup. */\n title: string;\n /** Kubernetes resources which will be fetched and passed to `healthHandler`. */\n resources: CodeRef<FirehoseResource[]>;\n /** Resolves status for the operators. */\n getOperatorsWithStatuses?: CodeRef<GetOperatorsWithStatuses<T>>;\n /** Loader for popup row component. */\n operatorRowLoader?: CodeRef<React.ComponentType<OperatorRowProps<T>>>;\n /** Links to all resources page. If not provided then a list page of the first resource from resources prop is used. */\n viewAllLink?: string;\n }\n>;\n\n/** Adds an inventory status group. */\nexport type DashboardsInventoryItemGroup = ExtensionDeclaration<\n 'console.dashboards/overview/inventory/item/group',\n {\n /** The id of the status group. */\n id: string;\n /** React component representing the status group icon. */\n icon: CodeRef<React.ReactElement>;\n }\n>;\n\n/** Adds a resource tile to the overview inventory card. */\nexport type DashboardsOverviewInventoryItem<\n T extends K8sModel = K8sModel,\n R extends { [key: string]: K8sResourceCommon[] } = { [key: string]: K8sResourceCommon[] }\n> = ExtensionDeclaration<\n 'console.dashboards/overview/inventory/item',\n DashboardsOverviewInventoryItemProperties<T, R> & {}\n>;\n\n/** Replaces an overview inventory card. */\nexport type DashboardsOverviewInventoryItemReplacement<\n T extends K8sModel = K8sModel,\n R extends { [key: string]: K8sResourceCommon[] } = { [key: string]: K8sResourceCommon[] }\n> = ExtensionDeclaration<\n 'console.dashboards/overview/inventory/item/replacement',\n DashboardsOverviewInventoryItemProperties<T, R> & {}\n>;\n\n/** Adds a resource tile to the project overview inventory card. */\nexport type DashboardsProjectOverviewInventoryItem<\n T extends K8sModel = K8sModel,\n R extends { [key: string]: K8sResourceCommon[] } = { [key: string]: K8sResourceCommon[] }\n> = ExtensionDeclaration<\n 'console.dashboards/project/overview/item',\n DashboardsOverviewInventoryItemProperties<T, R> & {}\n>;\n\n/** Adds an activity to the Activity Card of Overview Dashboard where the triggering of activity is based on watching a K8s resource. */\nexport type DashboardsOverviewResourceActivity<\n T extends K8sResourceCommon = K8sResourceCommon\n> = ExtensionDeclaration<\n 'console.dashboards/overview/activity/resource',\n {\n /** The utilization item to be replaced. */\n k8sResource: CodeRef<FirehoseResource & { isList: true }>;\n /** Function which determines if the given resource represents the action. If not defined, every resource represents activity. */\n isActivity?: CodeRef<(resource: T) => boolean>;\n /** Timestamp for the given action, which will be used for ordering. */\n getTimestamp?: CodeRef<(resource: T) => Date>;\n /** The action component. */\n component: CodeRef<React.ComponentType<K8sActivityProps<T>>>;\n }\n>;\n\n/** Adds an activity to the Activity Card of Prometheus Overview Dashboard where the triggering of activity is based on watching a K8s resource. */\nexport type DashboardsOverviewPrometheusActivity = ExtensionDeclaration<\n 'console.dashboards/overview/prometheus/activity/resource',\n {\n /** Queries to watch */\n queries: string[];\n /** Function which determines if the given resource represents the action. If not defined, every resource represents activity. */\n isActivity?: CodeRef<(results: PrometheusResponse[]) => boolean>;\n /** The action component. */\n component: CodeRef<React.ComponentType<PrometheusActivityProps>>;\n }\n>;\n\n// Type guards\n\nexport const isDashboardsTab = (e: Extension): e is DashboardsTab =>\n e.type === 'console.dashboards/tab';\n\nexport const isDashboardsCard = (e: Extension): e is DashboardsCard =>\n e.type === 'console.dashboards/card';\n\nexport const isDashboardsOverviewHealthPrometheusSubsystem = (\n e: Extension,\n): e is DashboardsOverviewHealthPrometheusSubsystem =>\n e.type === 'console.dashboards/overview/health/prometheus';\n\nexport const isResolvedDashboardsOverviewHealthPrometheusSubsystem = (\n e: Extension,\n): e is ResolvedExtension<DashboardsOverviewHealthPrometheusSubsystem> =>\n e.type === 'console.dashboards/overview/health/prometheus';\n\nexport const isDashboardsOverviewHealthURLSubsystem = (\n e: Extension,\n): e is DashboardsOverviewHealthURLSubsystem => e.type === 'console.dashboards/overview/health/url';\n\nexport const isResolvedDashboardsOverviewHealthURLSubsystem = (\n e: Extension,\n): e is ResolvedExtension<DashboardsOverviewHealthURLSubsystem> =>\n e.type === 'console.dashboards/overview/health/url';\n\nexport const isDashboardsOverviewHealthResourceSubsystem = (\n e: Extension,\n): e is DashboardsOverviewHealthResourceSubsystem =>\n e.type === 'console.dashboards/overview/health/resource';\n\nexport const isResolvedDashboardsOverviewHealthResourceSubsystem = (\n e: Extension,\n): e is ResolvedExtension<DashboardsOverviewHealthResourceSubsystem> =>\n e.type === 'console.dashboards/overview/health/resource';\n\nexport const isDashboardsOverviewHealthOperator = (\n e: Extension,\n): e is DashboardsOverviewHealthOperator =>\n e.type === 'console.dashboards/overview/health/operator';\n\nexport const isResolvedDashboardsOverviewHealthOperator = (\n e: Extension,\n): e is ResolvedExtension<DashboardsOverviewHealthOperator> =>\n e.type === 'console.dashboards/overview/health/operator';\n\nexport const isDashboardsInventoryItemGroup = (e: Extension): e is DashboardsInventoryItemGroup =>\n e.type === 'console.dashboards/overview/inventory/item/group';\n\nexport const isDashboardsOverviewInventoryItem = (\n e: Extension,\n): e is DashboardsOverviewInventoryItem => e.type === 'console.dashboards/overview/inventory/item';\n\nexport const isDashboardsOverviewInventoryItemReplacement = (\n e: Extension,\n): e is DashboardsOverviewInventoryItemReplacement =>\n e.type === 'console.dashboards/overview/inventory/item/replacement';\n\nexport const isDashboardsProjectOverviewInventoryItem = (\n e: Extension,\n): e is DashboardsProjectOverviewInventoryItem =>\n e.type === 'console.dashboards/project/overview/item';\n\nexport const isDashboardsOverviewResourceActivity = (\n e: Extension,\n): e is DashboardsOverviewResourceActivity =>\n e.type === 'console.dashboards/overview/activity/resource';\n\nexport const isDashboardsOverviewPrometheusActivity = (\n e: Extension,\n): e is DashboardsOverviewPrometheusActivity =>\n e.type === 'console.dashboards/overview/prometheus/activity/resource';\n\nexport type DashboardsOverviewHealthSubsystem =\n | DashboardsOverviewHealthURLSubsystem\n | DashboardsOverviewHealthPrometheusSubsystem\n | DashboardsOverviewHealthResourceSubsystem\n | DashboardsOverviewHealthOperator;\n\nexport const isDashboardsOverviewHealthSubsystem = (\n e: Extension,\n): e is DashboardsOverviewHealthSubsystem =>\n isDashboardsOverviewHealthURLSubsystem(e) ||\n isDashboardsOverviewHealthPrometheusSubsystem(e) ||\n isDashboardsOverviewHealthResourceSubsystem(e) ||\n isDashboardsOverviewHealthOperator(e);\n\ntype DashboardsOverviewInventoryItemProperties<\n T extends K8sModel = K8sModel,\n R extends { [key: string]: K8sResourceCommon[] } = { [key: string]: K8sResourceCommon[] }\n> = {\n /** The model for `resource` which will be fetched. Used to get the model's `label` or `abbr`. */\n model: CodeRef<T>;\n /** Function which maps various statuses to groups. */\n mapper?: CodeRef<StatusGroupMapper<T, R>>;\n /** Additional resources which will be fetched and passed to the `mapper` function. */\n additionalResources?: CodeRef<WatchK8sResources<R>>;\n};\n","import { Extension, ExtensionDeclaration, CodeRef } from '../types';\n\n/** This extension can be used to provide a handler for the file drop action on specific file extensions. */\nexport type FileUpload = ExtensionDeclaration<\n 'console.file-upload',\n {\n /** Supported file extensions. */\n fileExtensions: string[];\n /** Function which handles the file drop action. */\n handler: CodeRef<FileUploadHandler>;\n }\n>;\n\n// Type guards\n\nexport const isFileUpload = (e: Extension): e is FileUpload => e.type === 'console.file-upload';\n\n// Support types\n\nexport type FileUploadHandler = (file: File, namespace: string) => void;\n","import { Extension, ExtensionDeclaration } from '../types';\n\nexport type ImageEnvironment = {\n /** Environment variable key */\n key: string;\n /** The input field's label */\n label: string;\n /** Default value to use as a placeholder */\n defaultValue?: string;\n /** Description of the environment variable */\n description?: string;\n};\n\n/** This extension can be used to specify extra build environment variable fields under the builder image selector\n in the dev console git import form. When set, the fields will override environment variables\n of the same name in the build section. */\nexport type ImportEnvironment = ExtensionDeclaration<\n 'dev-console.import/environment',\n {\n /** Name of the image stream to provide custom environment variables for */\n imageStreamName: string;\n /** List of supported image stream tags */\n imageStreamTags: string[];\n /** List of environment variables */\n environments: ImageEnvironment[];\n }\n>;\n\n// Type guards\n\nexport const isImportEnvironment = (e: Extension): e is ImportEnvironment => {\n return e.type === 'dev-console.import/environment';\n};\n","import { ExtensionK8sModel } from '../api/common-types';\nimport { Extension, ExtensionDeclaration } from '../types';\n\ntype NavItemProperties = {\n /** A unique identifier for this item. */\n id: string;\n /** The perspective ID to which this item belongs to. If not specified, contributes to the default perspective. */\n perspective?: string;\n /** Navigation section to which this item belongs to. If not specified, render this item as a top level link. */\n section?: string;\n /** Adds data attributes to the DOM. */\n dataAttributes?: { [key: string]: string };\n /** Mark this item as active when the URL starts with one of these paths. */\n startsWith?: string[];\n /** Insert this item before the item referenced here. For arrays, the first one found in order is used. */\n insertBefore?: string | string[];\n /** Insert this item after the item referenced here. For arrays, the first one found in order is used. `insertBefore` takes precedence. */\n insertAfter?: string | string[];\n};\n\nexport type NavItem = ExtensionDeclaration<\n 'console.navigation/href',\n NavItemProperties & {\n name: string;\n }\n>;\n\n/** This extension can be used to contribute a navigation item that points to a specific link in the UI. */\nexport type HrefNavItem = ExtensionDeclaration<\n 'console.navigation/href',\n NavItemProperties & {\n /** The name of this item. */\n name: string;\n /** The link href value. */\n href: string;\n /** if true, adds /ns/active-namespace to the end */\n namespaced?: boolean;\n /** if true, adds /k8s/ns/active-namespace to the begining */\n prefixNamespaced?: boolean;\n }\n>;\n\n/** This extension can be used to contribute a navigation item that points to a namespaced resource details page.\n The K8s model of that resource can be used to define the navigation item. */\nexport type ResourceNSNavItem = ExtensionDeclaration<\n 'console.navigation/resource-ns',\n NavItemProperties & {\n /** Overrides the default name. If not supplied the name of the link will equal the plural value of the model. */\n name?: string;\n /** The model for which this nav item links to. */\n model: ExtensionK8sModel;\n }\n>;\n\n/** This extension can be used to contribute a navigation item that points to a cluster resource details page.\n The K8s model of that resource can be used to define the navigation item. */\nexport type ResourceClusterNavItem = ExtensionDeclaration<\n 'console.navigation/resource-cluster',\n NavItemProperties & {\n /** Overrides the default name. If not supplied the name of the link will equal the plural value of the model. */\n name?: string;\n /** The model for which this nav item links to. */\n model: ExtensionK8sModel;\n }\n>;\n\n/** This extension can be used to add a separator between navigation items in the navigation. */\nexport type Separator = ExtensionDeclaration<\n 'console.navigation/separator',\n Omit<NavItemProperties, 'startsWith'>\n>;\n\n/** This extension can be used to define a new section of navigation items in the navigation tab. */\nexport type NavSection = ExtensionDeclaration<\n 'console.navigation/section',\n Omit<NavItemProperties, 'startsWith' | 'section'> & {\n /** Name of this section. If not supplied, only a separator will be shown above the section. */\n name?: string;\n }\n>;\n\nexport type ResourceNavItem = ResourceClusterNavItem | ResourceNSNavItem;\n\nexport type NavExtension =\n | NavSection\n | Separator\n | HrefNavItem\n | ResourceNSNavItem\n | ResourceClusterNavItem;\n\n// Type guards\n\nexport const isHrefNavItem = (e: Extension): e is HrefNavItem =>\n e.type === 'console.navigation/href';\n\nexport const isResourceNSNavItem = (e: Extension): e is ResourceNSNavItem =>\n e.type === 'console.navigation/resource-ns';\n\nexport const isResourceClusterNavItem = (e: Extension): e is ResourceClusterNavItem =>\n e.type === 'console.navigation/resource-cluster';\n\nexport const isResourceNavItem = (e: Extension): e is ResourceNavItem =>\n isResourceNSNavItem(e) || isResourceClusterNavItem(e);\n\nexport const isSeparator = (e: Extension): e is Separator =>\n e.type === 'console.navigation/separator';\n\nexport const isNavSection = (e: Extension): e is NavSection =>\n e.type === 'console.navigation/section';\n\nexport const isNavItem = (e: Extension): e is NavItem =>\n isHrefNavItem(e) || isResourceNSNavItem(e) || isResourceClusterNavItem(e);\n\nexport const isNavItemOrSeparator = (e: Extension): e is NavItem | Separator =>\n isNavItem(e) || isSeparator(e);\n\nexport const isNavExtension = (e: Extension): e is NavExtension =>\n isNavItem(e) || isSeparator(e) || isNavSection(e);\n","import { Alert } from '../api/common-types';\nimport { LaunchModal } from '../app/modal-support/ModalProvider';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\n\n/** This extension can be used to trigger a specific action when a specific Prometheus alert is observed by the Console based on its `rule.name` value. */\nexport type AlertAction = ExtensionDeclaration<\n 'console.alert-action',\n {\n /** Alert name as defined by `alert.rule.name` property */\n alert: string;\n /** Action text */\n text: string;\n /** Function to perform side effect */\n action: CodeRef<(alert: Alert, launchModal: LaunchModal) => void>;\n }\n>;\n\nexport const isAlertAction = (e: Extension): e is AlertAction => e.type === 'console.alert-action';\n","import { ExtensionK8sGroupKindModel, ExtensionK8sModel } from '../api/common-types';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\n\ntype ResourcePageProperties = {\n /** The model for which this resource page links to. */\n model: ExtensionK8sGroupKindModel;\n /** The component to be rendered when the route matches. */\n component: CodeRef<\n React.ComponentType<{\n /** The namespace for which this resource page links to. */\n namespace: string;\n /** The model for which this resource page links to. */\n model: ExtensionK8sModel;\n }>\n >;\n};\n\ntype RoutePageProperties = {\n /** The perspective to which this page belongs to. If not specified, contributes to all perspectives. */\n perspective?: string;\n /** The component to be rendered when the route matches. */\n component: CodeRef<React.ComponentType>;\n /** Valid URL path or array of paths that `path-to-regexp@^1.7.0` understands. */\n path: string | string[];\n /** When true, will only match if the path matches the `location.pathname` exactly. */\n exact?: boolean;\n};\n\n/**\n * Adds new page to Console router.\n *\n * Under the hood we use React Router.\n * See https://v5.reactrouter.com/\n *\n * Note: This extension should not be used for resource list and details page. For adding both list and details page for a resource use the\n * [console.navigation/resource-ns](#consolenavigationresource-ns) extension, instead, which renders elementary fields.\n */\nexport type RoutePage = ExtensionDeclaration<'console.page/route', RoutePageProperties>;\n\n/** Adds new resource list page to Console router. */\nexport type ResourceListPage = ExtensionDeclaration<\n 'console.page/resource/list',\n ResourcePageProperties & {}\n>;\n\n/** Adds new resource details page to Console router. */\nexport type ResourceDetailsPage = ExtensionDeclaration<\n 'console.page/resource/details',\n ResourcePageProperties & {}\n>;\n\n/**\n * @deprecated - Use `console.tab/horizontalNav` instead\n * Adds new resource tab page to Console router.\n */\nexport type ResourceTabPage = ExtensionDeclaration<\n 'console.page/resource/tab',\n Omit<ResourcePageProperties, 'component'> & {\n /** The component to be rendered when the route matches. */\n component: CodeRef<React.ComponentType>;\n /** The name of the tab. */\n name: string;\n /** The optional href for the tab link. If not provided, the first `path` is used. */\n href?: string;\n /** When true, will only match if the path matches the `location.pathname` exactly. */\n exact?: boolean;\n }\n>;\n\n/**\n * Adds new standalone page (rendered outside the common page layout) to Console router.\n *\n * Under the hood we use React Router.\n * See https://v5.reactrouter.com/\n */\nexport type StandaloneRoutePage = ExtensionDeclaration<\n 'console.page/route/standalone',\n Omit<RoutePageProperties, 'perspective'>\n>;\n\n// Type guards\n\nexport const isRoutePage = (e: Extension): e is RoutePage => e.type === 'console.page/route';\n\nexport const isStandaloneRoutePage = (e: Extension): e is StandaloneRoutePage =>\n e.type === 'console.page/route/standalone';\n\nexport const isResourceListPage = (e: Extension): e is ResourceListPage =>\n e.type === 'console.page/resource/list';\n\nexport const isResourceDetailsPage = (e: Extension): e is ResourceDetailsPage =>\n e.type === 'console.page/resource/details';\n\n/** @deprecated - use `console.tab/horizontalNav` */\nexport const isResourceTabPage = (e: Extension): e is ResourceTabPage =>\n e.type === 'console.page/resource/tab';\n","import * as React from 'react';\nimport { ExtensionK8sModel } from '../api/common-types';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\n\n// Align type with React.lazy\ntype LazyComponent = { default: React.ComponentType };\n\n/** This extension contributes a new perspective to the console which enables customization of the navigation menu. */\nexport type Perspective = ExtensionDeclaration<\n 'console.perspective',\n {\n /** The perspective identifier. */\n id: string;\n /** The perspective display name. */\n name: string;\n /** The perspective display icon. */\n icon: CodeRef<LazyComponent>;\n /** Whether the perspective is the default. There can only be one default. */\n default?: boolean;\n /** Default pinned resources on the nav */\n defaultPins?: ExtensionK8sModel[];\n /** The function to get perspective landing page URL. */\n landingPageURL: CodeRef<(flags: { [key: string]: boolean }, isFirstVisit: boolean) => string>;\n /** The function to get a relative redirect URL for import flow. */\n importRedirectURL: CodeRef<(namespace: string) => string>;\n /** The hook to detect default perspective */\n usePerspectiveDetection?: CodeRef<() => [boolean, boolean]>; // [enablePerspective: boolean, loading: boolean]\n }\n>;\n\nexport const isPerspective = (e: Extension): e is Perspective => {\n return e.type === 'console.perspective';\n};\n","import * as React from 'react';\nimport { CodeRef, Extension, ExtensionDeclaration } from '../types';\nimport { Humanize, TopConsumerPopoverProps } from './console-types';\n\n/** Adds a new inventory item into project overview page. */\nexport type ProjectOverviewInventoryItem = ExtensionDeclaration<\n 'console.project-overview/inventory-item',\n {\n /** The component to be rendered. */\n component: CodeRef<React.ComponentType<{ projectName: string }>>;\n }\n>;\n\nexport type GetProjectQuery = (projectName: string) => string;\n\n/** Adds a new project overview utilization item. */\nexport type ProjectOverviewUtilizationItem = ExtensionDeclaration<\n 'console.project-overview/utilization-item',\n {\n /** The title of the utilization item. */\n title: string;\n /** Prometheus utilization query. */\n getUtilizationQuery: CodeRef<GetProjectQuery>;\n /** Convert prometheus data to human readable form. */\n humanize: CodeRef<Humanize>;\n /** Prometheus total query. */\n getTotalQuery?: CodeRef<GetProjectQuery>;\n /** Prometheus request query. */\n getRequestQuery?: CodeRef<GetProjectQuery>;\n /** Prometheus limit query. */\n getLimitQuery?: CodeRef<GetProjectQuery>;\n /** Shows Top consumer popover instead of plain value */\n TopConsumerPopover?: CodeRef<React.ComponentType<TopConsumerPopoverProps>>;\n }\n>;\n\n// Type guards\n\nexport const isProjectOverviewInventoryItem = (e: Extension): e is ProjectOverviewInventoryItem =>\n e.type === 'console.project-overview/inventory-item';\n\nexport const isProjectOverviewUtilizationItem = (\n e: Extension,\n): e is ProjectOverviewUtilizationItem => e.type === 'console.project-overview/utilization-item';\n","import { Reducer } from 'redux';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\n\n/** Adds new reducer to Console Redux store which operates on `plugins.<scope>` substate. */\nexport type ReduxReducer = ExtensionDeclaration<\n 'console.redux-reducer',\n {\n /** The key to represent the reducer-managed substate within the Redux state object. */\n scope: string;\n /** The reducer function, operating on the reducer-managed substate. */\n reducer: CodeRef<Reducer>;\n }\n>;\n\n// Type guards\n\nexport const isReduxReducer = (e: Extension): e is ReduxReducer =>\n e.type === 'console.redux-reducer';\n","import { Extension } from '@console/plugin-sdk/src/typings/base';\nimport { CodeRef, ExtensionDeclaration } from '../types';\nimport { StorageClass } from './console-types';\n\nexport type ProvisionerProps = {\n onParamChange: (id: string, paramName: string, checkbox: boolean) => void;\n parameterKey: string;\n parameterValue: string;\n};\n\nexport enum ProvisionerType {\n /** Container Storage Interface provisioner type */\n CSI = 'CSI',\n /** Other provisioner type */\n OTHERS = 'OTHERS',\n}\n\nexport type ProvisionerDetails = {\n title: string;\n provisioner: string;\n allowVolumeExpansion: CodeRef<(arg) => boolean> | boolean;\n volumeBindingMode?: string;\n documentationLink?: CodeRef<() => string>;\n parameters?: {\n [paramKey: string]: {\n name: string;\n hintText: string;\n value?: string;\n values?: Record<string, string>;\n visible?: CodeRef<(arg) => boolean> | boolean;\n required?: CodeRef<(arg) => boolean> | boolean;\n validation?: CodeRef<(params) => string>;\n format?: CodeRef<(arg) => string>;\n Component?: CodeRef<React.ComponentType<ProvisionerProps>>;\n type?: 'checkbox';\n validationMsg?: string;\n };\n };\n mutator?: CodeRef<(storageClass: StorageClass) => StorageClass>;\n};\n\n/** Adds a new storage class provisioner as an option during storage class creation. */\nexport type StorageClassProvisioner = ExtensionDeclaration<\n 'console.storage-class/provisioner',\n {\n [provisionerType in keyof typeof ProvisionerType]?: ProvisionerDetails;\n }\n>;\n\nexport const isStorageClassProvisioner = (e: Extension): e is StorageClassProvisioner =>\n e.type === 'console.storage-class/provisioner';\n","import { Extension, ExtensionDeclaration, CodeRef } from '../types';\n\n/** This extension can be used to contribute a new storage provider to select,\n when attaching storage and a provider specific component. */\nexport type StorageProvider = ExtensionDeclaration<\n 'console.storage-provider',\n {\n /** Displayed name of the provider. */\n name: string;\n /** Provider specific component to render. */\n Component: CodeRef<React.ComponentType>;\n }\n>;\n\nexport const isStorageProvider = (e: Extension): e is StorageProvider =>\n e.type === 'console.storage-provider';\n","import { Extension, ExtensionDeclaration, CodeRef } from '../types';\n\n/** This component can be used to register a listener function receiving telemetry events.\n These events include user identification, page navigation, and other application specific events.\n The listener may use this data for reporting and analytics purposes. */\nexport type TelemetryListener = ExtensionDeclaration<\n 'console.telemetry/listener',\n {\n /** Listen for telemetry events */\n listener: CodeRef<TelemetryEventListener>;\n }\n>;\n\n// P should be valid JSON\nexport type TelemetryEventListener = <P = any>(eventType: string, properties?: P) => void;\n\n// Type guards\n\nexport const isTelemetryListener = (e: Extension): e is TelemetryListener => {\n return e.type === 'console.telemetry/listener';\n};\n","import * as React from 'react';\nimport { GraphElement } from '@patternfly/react-topology';\nimport { ExtensionHook } from '../api/common-types';\nimport { Extension, CodeRef, ExtensionDeclaration } from '../types';\nimport { K8sResourceCommon } from './console-types';\nimport { BuildConfigData } from './topology-types';\n\n/** DetailsTab contributes a tab for the topology details panel. */\nexport type DetailsTab = ExtensionDeclaration<\n 'console.topology/details/tab',\n {\n /** A unique identifier for this details tab. */\n id: string;\n /** The tab label to display in the UI. */\n label: string;\n /** Insert this item before the item referenced here.\n * For arrays, the first one found in order is used.\n * */\n insertBefore?: string | string[];\n /** Insert this item after the item referenced here.\n * For arrays, the first one found in order is used.\n * insertBefore takes precedence.\n * */\n insertAfter?: string | string[];\n }\n>;\n\n/** DetailsTabSection contributes a section for a specific tab in topology details panel. */\nexport type DetailsTabSection = ExtensionDeclaration<\n 'console.topology/details/tab-section',\n {\n /** A unique identifier for this details tab section. */\n id: string;\n /** The parent tab ID that this section should contribute to. */\n tab: string;\n /** A hook that returns a component or null/undefined that will be rendered\n * in the topology sidebar.\n * SDK component: <Section title={<optional>}>... padded area </Section>\n * */\n provider: CodeRef<DetailsTabSectionExtensionHook>;\n /** Returns a section for the graph element or undefined if not provided.\n * @deprecated Fallback if no provider is defined. renderNull is a no-op already.\n */\n section: CodeRef<\n (element: GraphElement, renderNull?: () => null) => React.Component | undefined\n >;\n /** Insert this item before the item referenced here.\n * For arrays, the first one found in order is used.\n * */\n insertBefore?: string | string[];\n /** Insert this item after the item referenced here.\n * For arrays, the first one found in order is used.\n * insertBefore takes precedence.\n * */\n insertAfter?: string | string[];\n }\n>;\n\n/** DetailsResourceLink contributes a link for specific topology context or graph element. */\nexport type DetailsResourceLink = ExtensionDeclaration<\n 'console.topology/details/resource-link',\n {\n /** A higher priority factory will get the first chance to create the link. */\n priority?: number;\n /** Return the resource link if provided, otherwise undefined.\n * Use ResourceIcon and ResourceLink for styles.\n * */\n link: CodeRef<(element: GraphElement) => React.Component | undefined>;\n }\n>;\n\n/** DetailsResourceAlert contributes an alert for specific topology context or graph element. */\nexport type DetailsResourceAlert = ExtensionDeclaration<\n 'console.topology/details/resource-alert',\n {\n /** The ID of this alert. Used to save state if the alert shouldn't be shown after dismissed. */\n id: string;\n /** Hook to return the contents of the Alert. */\n contentProvider: CodeRef<(element: GraphElement) => DetailsResourceAlertContent | null>;\n }\n>;\n\n/** PodAdapter contributes an adapter to adapt element to data that can be used by Pod component */\nexport type PodAdapter = ExtensionDeclaration<\n 'console.topology/adapter/pod',\n {\n /** adapter to adapt element to data that can be used by Pod component. */\n adapt: CodeRef<(element: GraphElement) => AdapterDataType<PodsAdapterDataType> | undefined>;\n }\n>;\n\n/** BuildAdapter contributes an adapter to adapt element to data that can be used by Build component */\nexport type BuildAdapter = ExtensionDeclaration<\n 'console.topology/adapter/build',\n {\n /** adapter to adapt element to data that can be used by Build component. */\n adapt: CodeRef<(element: GraphElement) => AdapterDataType<BuildConfigData> | undefined>;\n }\n>;\n\n/** NetworkAdpater contributes an adapter to adapt element to data that can be used by Networking component */\nexport type NetworkAdapter = ExtensionDeclaration<\n 'console.topology/adapter/network',\n {\n /** adapter to adapt element to data that can be used by Networking component. */\n adapt: CodeRef<(element: GraphElement) => NetworkAdapterType | undefined>;\n }\n>;\n\nexport type SupportedTopologyDetailsExtensions =\n | DetailsTab\n | DetailsTabSection\n | DetailsResourceLink\n | DetailsResourceAlert\n | PodAdapter\n | BuildAdapter\n | NetworkAdapter;\n\n// Type guards\n\nexport const isDetailsTab = (e: Extension): e is DetailsTab => {\n return e.type === 'console.topology/details/tab';\n};\n\nexport const isDetailsTabSection = (e: Extension): e is DetailsTabSection => {\n return e.type === 'console.topology/details/tab-section';\n};\n\nexport const isDetailsResourceLink = (e: Extension): e is DetailsResourceLink => {\n return e.type === 'console.topology/details/resource-link';\n};\n\nexport const isDetailsResourceAlert = (e: Extension): e is DetailsResourceAlert => {\n return e.type === 'console.topology/details/resource-alert';\n};\n\nexport const isPodAdapter = (e: Extension): e is PodAdapter => {\n return e.type === 'console.topology/adapter/pod';\n};\n\nexport const isBuildAdapter = (e: Extension): e is BuildAdapter => {\n return e.type === 'console.topology/adapter/build';\n};\n\nexport const isNetworkAdapter = (e: Extension): e is NetworkAdapter => {\n return e.type === 'console.topology/adapter/network';\n};\n\nexport type DetailsResourceAlertContent = {\n /** The title of the alert */\n title: string;\n /** Whether to show a dismiss button. false by default.\n * State will be store in user settings, once dismissed alert won't show up again untill user settings state resets\n */\n dismissible?: boolean;\n content: React.Component | undefined | JSX.Element | string;\n variant?: 'success' | 'danger' | 'warning' | 'info' | 'custom';\n actionLinks?: React.ReactNode;\n};\n\nexport type AdapterDataType<D = {}, T = {}> = {\n resource: K8sResourceCommon;\n data?: T;\n provider: (resource: K8sResourceCommon, data?: T) => D;\n};\n\nexport type PodsAdapterDataType<E = K8sResourceCommon> = {\n pods: E[];\n loaded: boolean;\n loadError: string;\n emptyText?: string;\n allPodsLink?: string;\n buildConfigData?: BuildConfigData;\n};\n\nexport type NetworkAdapterType = {\n resource: K8sResourceCommon;\n};\n\nexport type DetailsTabSectionExtensionHook = ExtensionHook<\n React.ReactElement | undefined,\n GraphElement\n>;\n","import { TopologyQuadrant } from '@patternfly/react-topology/dist/esm/types';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\nimport { WatchK8sResourcesGeneric } from './console-types';\nimport {\n CreateConnectionGetter,\n RelationshipProviderCreate,\n RelationshipProviderProvides,\n TopologyApplyDisplayOptions,\n TopologyDataModelDepicted,\n TopologyDataModelGetter,\n TopologyDataModelReconciler,\n TopologyDecoratorGetter,\n TopologyDisplayOption,\n ViewComponentFactory,\n} from './topology-types';\n\n/** Getter for a ViewComponentFactory */\nexport type TopologyComponentFactory = ExtensionDeclaration<\n 'console.topology/component/factory',\n {\n /** Getter for a ViewComponentFactory */\n getFactory: CodeRef<ViewComponentFactory>;\n }\n>;\n\n/** Getter for the create connector function */\nexport type TopologyCreateConnector = ExtensionDeclaration<\n 'console.topology/create/connector',\n {\n /** Getter for the create connector function */\n getCreateConnector: CodeRef<CreateConnectionGetter>;\n }\n>;\n\n/** Topology Data Model Factory Extension */\nexport type TopologyDataModelFactory = ExtensionDeclaration<\n 'console.topology/data/factory',\n {\n /** Unique ID for the factory. */\n id: string;\n /** Priority for the factory */\n priority: number;\n /** Resources to be fetched from useK8sWatchResources hook. */\n resources?: WatchK8sResourcesGeneric;\n /** Keys in resources containing workloads. */\n workloadKeys?: string[];\n /** Getter for the data model factory */\n getDataModel?: CodeRef<TopologyDataModelGetter>;\n /** Getter for function to determine if a resource is depicted by this model factory */\n isResourceDepicted?: CodeRef<TopologyDataModelDepicted>;\n /** Getter for function to reconcile data model after all extensions' models have loaded */\n getDataModelReconciler?: CodeRef<TopologyDataModelReconciler>;\n }\n>;\n\n/** Topology Display Filters Extension */\nexport type TopologyDisplayFilters = ExtensionDeclaration<\n 'console.topology/display/filters',\n {\n /** Getter for topology filters specific to the extension */\n getTopologyFilters: CodeRef<() => TopologyDisplayOption[]>;\n /** Function to apply filters to the model */\n applyDisplayOptions: CodeRef<TopologyApplyDisplayOptions>;\n }\n>;\n\n/** Topology Decorator Provider Extension */\nexport type TopologyDecoratorProvider = ExtensionDeclaration<\n 'console.topology/decorator/provider',\n {\n /** id for topology decorator specific to the extension */\n id: string;\n /** priority for topology decorator specific to the extension */\n priority: number;\n /** quadrant for topology decorator specific to the extension */\n quadrant: TopologyQuadrant;\n /** decorator specific to the extension */\n decorator: CodeRef<TopologyDecoratorGetter>;\n }\n>;\n\n/** Topology relationship provider connector extension */\nexport type TopologyRelationshipProvider = ExtensionDeclaration<\n 'console.topology/relationship/provider',\n {\n /** use to determine if a connection can be created between the source and target node */\n provides: CodeRef<RelationshipProviderProvides>;\n /** tooltip to show when connector operation is hovering over the drop target ex: \"Create a Visual Connector\" */\n tooltip: string;\n /** callback to execute when connector is drop over target node to create a connection */\n create: CodeRef<RelationshipProviderCreate>;\n /** priority for relationship, higher will be preferred in case of multiple */\n priority: number;\n }\n>;\n\n// Type Guards\n\nexport const isTopologyComponentFactory = (e: Extension): e is TopologyComponentFactory =>\n e.type === 'console.topology/component/factory';\n\nexport const isTopologyCreateConnector = (e: Extension): e is TopologyCreateConnector =>\n e.type === 'console.topology/create/connector';\n\nexport const isTopologyDataModelFactory = (e: Extension): e is TopologyDataModelFactory =>\n e.type === 'console.topology/data/factory';\n\nexport const isTopologyDisplayFilters = (e: Extension): e is TopologyDisplayFilters =>\n e.type === 'console.topology/display/filters';\n\nexport const isTopologyDecoratorProvider = (e: Extension): e is TopologyDecoratorProvider =>\n e.type === 'console.topology/decorator/provider';\n\nexport const isTopologyRelationshipProvider = (e: Extension): e is TopologyRelationshipProvider =>\n e.type === 'console.topology/relationship/provider';\n","import * as React from 'react';\nimport { JSONSchema7Type } from 'json-schema';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\n\nexport enum UserPreferenceFieldType {\n dropdown = 'dropdown',\n checkbox = 'checkbox',\n custom = 'custom',\n}\n\nexport type UserPreferenceDropdownField = {\n type: UserPreferenceFieldType.dropdown;\n userSettingsKey: string;\n defaultValue?: string;\n description?: string;\n options: {\n value: string;\n label: string;\n description?: string;\n }[];\n};\n\nexport type UserPreferenceCheckboxFieldValue = string | number | boolean;\n\nexport type UserPreferenceCheckboxField = {\n type: UserPreferenceFieldType.checkbox;\n userSettingsKey: string;\n label: string;\n trueValue: UserPreferenceCheckboxFieldValue;\n falseValue: UserPreferenceCheckboxFieldValue;\n defaultValue?: UserPreferenceCheckboxFieldValue;\n description?: string;\n};\n\nexport type UserPreferenceCustomField = {\n type: UserPreferenceFieldType.custom;\n component: CodeRef<React.ComponentType>;\n props?: { [key: string]: JSONSchema7Type };\n};\n\nexport type UserPreferenceField =\n | UserPreferenceDropdownField\n | UserPreferenceCheckboxField\n | UserPreferenceCustomField;\n\n/** This extension can be used to add a group on the console user-preferences page.\n It will appear as a vertical tab option on the console user-preferences page. */\nexport type UserPreferenceGroup = ExtensionDeclaration<\n 'console.user-preference/group',\n {\n /** ID used to identify the user preference group. */\n id: string;\n /** The label of the user preference group. */\n label: string;\n /** ID of user preference group before which this group should be placed. */\n insertBefore?: string;\n /** ID of user preference group after which this group should be placed. */\n insertAfter?: string;\n }\n>;\n\n/** This extension can be used to add an item to the user preferences group on the console user preferences page. */\nexport type UserPreferenceItem = ExtensionDeclaration<\n 'console.user-preference/item',\n {\n /** ID used to identify the user preference item and referenced in insertAfter and insertBefore to define the item order. */\n id: string;\n /** IDs used to identify the user preference groups the item would belong to. */\n groupId: string;\n /** The label of the user preference. */\n label: string;\n /** The description of the user preference. */\n description: string;\n /** The input field options used to render the values to set the user preference. */\n field: UserPreferenceField;\n /** ID of user preference item before which this item should be placed. */\n insertBefore?: string;\n /** ID of user preference item after which this item should be placed. */\n insertAfter?: string;\n }\n>;\n\n// Type guards\n\nexport const isUserPreferenceGroup = (e: Extension): e is UserPreferenceGroup => {\n return e.type === 'console.user-preference/group';\n};\n\nexport const isUserPreferenceItem = (e: Extension): e is UserPreferenceItem => {\n return e.type === 'console.user-preference/item';\n};\n","import * as React from 'react';\nimport { CodeRef, Extension, ExtensionDeclaration } from '../types';\nimport { NodeKind, ResourcesObject, WatchK8sResources, WatchK8sResults } from './console-types';\n\nexport type IsNodeStatusActive<T extends ResourcesObject> = (\n node: NodeKind,\n resources: WatchK8sResults<T>,\n) => boolean;\n\nexport type NodePopoverContentProps<T extends ResourcesObject> = {\n node: NodeKind;\n resources: WatchK8sResults<T>;\n};\n\n/** This extension can be used to add additional states to Node resource. */\nexport type NodeStatus<T extends ResourcesObject = ResourcesObject> = ExtensionDeclaration<\n 'console.node/status',\n {\n /** Returns true if the additional state is active */\n isActive: CodeRef<IsNodeStatusActive<T>>;\n /** React component that will be rendered in status popover */\n PopoverContent: CodeRef<React.ComponentType<NodePopoverContentProps<T>>>;\n /** Title of the additional Node state */\n title: string;\n /** Additional resources that are needed to determine the additional state */\n resources?: WatchK8sResources<T>;\n }\n>;\n\nexport const isNodeStatus = (e: Extension): e is NodeStatus => e.type === 'console.node/status';\n","import { ModalComponent } from '../app/modal-support/ModalProvider';\nimport { Extension, ExtensionDeclaration, CodeRef } from '../types';\nimport { K8sResourceCommon } from './console-types';\n\nexport type CreateProjectModalProps = {\n onSubmit?: (project: K8sResourceCommon) => void;\n};\n\n/** This extension can be used to pass a component that will be rendered in place of the standard create project modal. */\nexport type CreateProjectModal = ExtensionDeclaration<\n 'console.create-project-modal',\n {\n /** A component to render in place of the create project modal */\n component: CodeRef<ModalComponent<CreateProjectModalProps>>;\n }\n>;\n\nexport const isCreateProjectModal = (e: Extension): e is CreateProjectModal =>\n e.type === 'console.create-project-modal';\n","export { default as useActivePerspective } from './useActivePerspective';\nexport * from './perspective-context';\n","export { default as AppInitSDK } from './AppInitSDK';\nexport { SDKReducers } from './redux';\nexport * from './components';\nexport * from './core';\nexport * from './redux-types';\n","import * as React from 'react';\nimport { Provider } from 'react-redux';\nimport { Store } from 'redux';\nimport { setUtilsConfig, UtilsConfig } from './configSetup';\nimport { initApiDiscovery } from './k8s/api-discovery/api-discovery';\nimport { InitApiDiscovery } from './k8s/api-discovery/api-discovery-types';\nimport { useReduxStore } from './useReduxStore';\n\ntype AppInitSDKProps = {\n children: React.ReactNode;\n configurations: {\n apiDiscovery?: InitApiDiscovery;\n appFetch: UtilsConfig['appFetch'];\n /** @deprecated - will be removed later when we have an interface for plugin */\n initPlugins?: (store: Store<any>) => void;\n };\n};\n\n/**\n * Component for providing store access to the SDK.\n * Add this at app-level to make use of app's redux store and pass configurations prop needed to initialize the app, preferred to have it under Provider.\n * It checks for store instance if present or not.\n * If the store is there then the reference is persisted to be used in SDK else it creates a new store and passes it to the children with the provider\n * @component AppInitSDK\n * @example\n * ```ts\n * return (\n * <Provider store={store}>\n * <AppInitSDK configurations={{ appFetch, apiDiscovery }}>\n * <CustomApp />\n * ...\n * </AppInitSDK>\n * </Provider>\n * )\n * ```\n */\nconst AppInitSDK: React.FC<AppInitSDKProps> = ({ children, configurations }) => {\n const { store, storeContextPresent } = useReduxStore();\n React.useEffect(() => {\n const { appFetch, initPlugins, apiDiscovery = initApiDiscovery } = configurations;\n try {\n setUtilsConfig({ appFetch });\n if (initPlugins) {\n initPlugins(store);\n }\n apiDiscovery(store);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(e);\n }\n }, [configurations, store]);\n\n return !storeContextPresent ? <Provider store={store}>{children}</Provider> : <>{children}</>;\n};\n\nexport default AppInitSDK;\n","import * as React from 'react';\n\nconst ListPageBody: React.FC = ({ children }) => {\n return <div className=\"co-m-pane__body co-m-pane__body--no-top-margin\">{children}</div>;\n};\n\nexport default ListPageBody;\n","export * from './actions';\nexport * from './reducers';\n","import { global_palette_purple_300 as globalPurple300 } from '@patternfly/react-tokens/dist/js/global_palette_purple_300';\nimport { global_palette_white as globalWhite } from '@patternfly/react-tokens/dist/js/global_palette_white';\nimport { global_warning_color_100 as globalWarning100 } from '@patternfly/react-tokens/dist/js/global_warning_color_100';\n\nexport enum AllPodStatus {\n Running = 'Running',\n NotReady = 'Not Ready',\n Warning = 'Warning',\n Empty = 'Empty',\n Failed = 'Failed',\n Pending = 'Pending',\n Succeeded = 'Succeeded',\n Terminating = 'Terminating',\n Unknown = 'Unknown',\n ScaledTo0 = 'Scaled to 0',\n Idle = 'Idle',\n AutoScaledTo0 = 'Autoscaled to 0',\n ScalingUp = 'Scaling Up',\n CrashLoopBackOff = 'CrashLoopBackOff',\n}\n\nexport const podColor = {\n [AllPodStatus.Running]: '#0066CC',\n [AllPodStatus.NotReady]: '#519DE9',\n [AllPodStatus.Warning]: globalWarning100.value,\n [AllPodStatus.Empty]: globalWhite.value,\n [AllPodStatus.Failed]: '#CC0000',\n [AllPodStatus.Pending]: '#8BC1F7',\n [AllPodStatus.Succeeded]: '#519149',\n [AllPodStatus.Terminating]: '#002F5D',\n [AllPodStatus.Unknown]: globalPurple300.value,\n [AllPodStatus.ScaledTo0]: globalWhite.value,\n [AllPodStatus.Idle]: globalWhite.value,\n [AllPodStatus.AutoScaledTo0]: globalWhite.value,\n [AllPodStatus.ScalingUp]: globalWhite.value,\n [AllPodStatus.CrashLoopBackOff]: '#CC0000',\n};\n","export const DASH = '-';\n","import * as React from 'react';\nimport {\n ExtensionFlags,\n Extension,\n ExtensionTypeGuard,\n LoadedExtension,\n} from '@console/dynamic-plugin-sdk/src/types';\n\nexport type { ExtensionFlags, Extension, ExtensionTypeGuard, LoadedExtension };\n\n/**\n * An extension that is always effective, regardless of feature flags.\n */\nexport type AlwaysOnExtension<P extends {} = any> = Omit<Extension<P>, 'flags'>;\n\n/**\n * From plugin author perspective, a plugin is simply a list of extensions.\n *\n * Plugin metadata is stored in the `package.json` file of the corresponding\n * monorepo package. The `consolePlugin.entry` path should point to a module\n * that exports the plugin object.\n *\n * ```json\n * {\n * \"name\": \"@console/demo-plugin\",\n * \"version\": \"0.0.0-fixed\",\n * // scripts, dependencies, etc.\n * \"consolePlugin\": {\n * \"entry\": \"src/plugin.ts\"\n * }\n * }\n * ```\n *\n * For better type checking and code completion, use a type parameter that\n * represents the union of all the extension types consumed by the plugin:\n *\n * ```ts\n * // packages/console-demo-plugin/src/plugin.ts\n * import { Plugin } from '@console/plugin-sdk';\n *\n * const plugin: Plugin<FooExtension | BarExtension> = [\n * {\n * type: 'Foo',\n * properties: {} // Foo extension specific properties\n * },\n * {\n * type: 'Bar',\n * properties: {} // Bar extension specific properties\n * }\n * ];\n *\n * export default plugin;\n * ```\n */\nexport type Plugin<E extends Extension> = E[];\n\n/**\n * Common interface for loading async React components.\n */\nexport type LazyLoader<T extends {} = {}> = () => Promise<React.ComponentType<Partial<T>>>;\n\n/**\n * From Console application perspective, a plugin is a list of extensions\n * enhanced with additional data.\n */\nexport type ActivePlugin = {\n name: string;\n extensions: Extension[];\n};\n","import { TFunction } from 'i18next';\nimport {\n WatchK8sResources,\n ResourcesObject,\n WatchK8sResults,\n GridPosition,\n} from '@console/dynamic-plugin-sdk';\nimport { PrometheusResponse } from '@console/internal/components/graphs';\nimport {\n FirehoseResource,\n FirehoseResult,\n FirehoseResourcesResult,\n} from '@console/internal/components/utils';\nimport { K8sKind, K8sResourceKind, K8sResourceCommon } from '@console/internal/module/k8s';\nimport {\n StatusGroupMapper,\n ExpandedComponentProps,\n} from '@console/shared/src/components/dashboard/inventory-card/InventoryItem';\nimport { HealthState } from '@console/shared/src/components/dashboard/status-card/states';\nimport { Extension, LazyLoader } from './base';\n\nnamespace ExtensionProperties {\n interface DashboardsOverviewHealthSubsystem {\n /** The subsystem's display name */\n title: string;\n }\n\n export interface DashboardsOverviewHealthURLSubsystem<R>\n extends DashboardsOverviewHealthSubsystem {\n /**\n * The URL to fetch data from. It will be prefixed with base k8s URL.\n * For example: `healthz` will result in `<k8sBasePath>/healthz`\n */\n url: string;\n\n /**\n * Custom function to fetch data from the URL.\n * If none is specified, default one (`coFetchJson`) will be used.\n * Response is then parsed by `healthHandler`.\n */\n fetch?: (url: string) => Promise<R>;\n\n /** Additional resource which will be fetched and passed to healthHandler */\n additionalResource?: FirehoseResource;\n\n /** Resolve the subsystem's health */\n healthHandler: URLHealthHandler<R>;\n\n /**\n * Loader for popup content. If defined health item will be represented as link\n * which opens popup with given content.\n */\n popupComponent?: LazyLoader<any>;\n\n /**\n * Popup title\n */\n popupTitle?: string;\n }\n\n export interface DashboardsOverviewHealthPrometheusSubsystem\n extends DashboardsOverviewHealthSubsystem {\n /** The Prometheus queries */\n queries: string[];\n\n /** Additional resource which will be fetched and passed to healthHandler */\n additionalResource?: FirehoseResource;\n\n /** Resolve the subsystem's health */\n healthHandler: PrometheusHealthHandler;\n\n /**\n * Loader for popup content. If defined health item will be represented as link\n * which opens popup with given content.\n */\n popupComponent?: LazyLoader<PrometheusHealthPopupProps>;\n\n /**\n * Popup title\n */\n popupTitle?: string;\n\n /** Optional classname for the popup top-level component. */\n popupClassname?: string;\n\n /** Content of the popup */\n popupBodyContent?: React.ReactNode | ((hide: () => void) => React.ReactNode);\n\n /** If true, the popup will stay open when clicked outside of its boundary. Default: false */\n popupKeepOnOutsideClick?: boolean;\n\n /** Control plane topology for which the subsystem should be hidden. */\n disallowedControlPlaneTopology?: string[];\n }\n\n export interface DashboardsOverviewHealthResourceSubsystem<R extends ResourcesObject>\n extends DashboardsOverviewHealthSubsystem {\n /** Kubernetes resources which will be fetched and passed to healthHandler */\n resources: WatchK8sResources<R>;\n\n /** Resolve the subsystem's health */\n healthHandler: ResourceHealthHandler<R>;\n\n /**\n * Loader for popup content. If defined health item will be represented as link\n * which opens popup with given content.\n */\n popupComponent?: LazyLoader<WatchK8sResults<R>>;\n\n /**\n * Popup title\n */\n popupTitle?: string;\n }\n\n export interface DashboardsOverviewHealthOperator<R extends K8sResourceCommon>\n extends DashboardsOverviewHealthSubsystem {\n /** Title of operators section in popup */\n title: string;\n\n /** Resources which will be fetched and passed to healthHandler */\n resources: FirehoseResource[];\n\n /** Resolve status for operators */\n getOperatorsWithStatuses: GetOperatorsWithStatuses<R>;\n\n /** Loader for popup row component */\n operatorRowLoader: LazyLoader<OperatorRowProps<R>>;\n\n /**\n * Link to all resources page.\n * If not provided then a list page of first resource from resources prop is used.\n */\n viewAllLink?: string;\n }\n\n export interface DashboardsTab {\n /** The tab's ID which will be used as part of href within dashboards page */\n id: string;\n\n /** NavSection to which the tab belongs to */\n navSection: 'home' | 'storage';\n\n /** The tab title */\n title: string;\n }\n\n export interface DashboardsCard {\n /** The tab's ID where this card should be rendered */\n tab: string;\n\n /** The card position in the tab */\n position: GridPosition;\n\n /** Loader for the corresponding dashboard card component. */\n loader: LazyLoader;\n\n /** Card's vertical span in the column. Ignored for small screens, defaults to 12. */\n span?: CardSpan;\n }\n\n export interface DashboardsOverviewInventoryItem {\n /** The model for `resource` which will be fetched. The model is used for getting model's label or abbr. */\n model: K8sKind;\n\n /** Function which will map various statuses to groups. */\n mapper?: () => Promise<StatusGroupMapper>;\n\n /** Additional resources which will be fetched and passed to `mapper` function. */\n additionalResources?: WatchK8sResources<any>;\n\n /** Loader for the component which will be used when item is expanded. */\n expandedComponent?: LazyLoader<ExpandedComponentProps>;\n }\n\n export interface DashboardsInventoryItemGroup {\n /** The ID of status group. */\n id: string;\n\n /** React component representing status group icon. */\n icon: React.ReactElement;\n }\n\n export interface DashboardsOverviewUtilizationItem {\n /** The utilization item to be replaced */\n id: string;\n\n /** The Prometheus utilization query */\n query: string;\n\n /** The Prometheus total query */\n totalQuery: string;\n }\n\n export interface DashboardsOverviewResourceActivity {\n /** Resource to watch */\n k8sResource: FirehoseResource & { isList: true };\n\n /**\n * Function which will determine if given resource represents the action.\n * If the function is not defined, every resource represents activity.\n */\n isActivity?: (resource: K8sResourceKind) => boolean;\n\n /** Timestamp for given action, which will be used for ordering */\n getTimestamp?: (resource: K8sResourceKind) => Date;\n\n /** Loader for corresponding action component */\n loader: LazyLoader<K8sActivityProps>;\n }\n\n export interface DashboardsOverviewPrometheusActivity {\n /** Queries to watch */\n queries: string[];\n\n /** Function which will determine if given query results represent the action */\n isActivity: (results: PrometheusResponse[]) => boolean;\n\n /** Loader for corresponding action component */\n loader: LazyLoader<PrometheusActivityProps>;\n }\n\n export interface ProjectDashboardInventoryItem {\n /** The K8s model which will be scoped to project, fetched and passed to `mapper` function. */\n model: K8sKind;\n\n /** Additional resources which will be fetched and passed to `mapper` function. */\n additionalResources?: FirehoseResource[];\n\n /** Function which will map various statuses to groups. */\n mapper: StatusGroupMapper;\n }\n}\n\nexport interface DashboardsOverviewHealthURLSubsystem<R = any>\n extends Extension<ExtensionProperties.DashboardsOverviewHealthURLSubsystem<R>> {\n type: 'Dashboards/Overview/Health/URL';\n}\n\nexport const isDashboardsOverviewHealthURLSubsystem = (\n e: Extension,\n): e is DashboardsOverviewHealthURLSubsystem => e.type === 'Dashboards/Overview/Health/URL';\n\nexport interface DashboardsOverviewHealthPrometheusSubsystem\n extends Extension<ExtensionProperties.DashboardsOverviewHealthPrometheusSubsystem> {\n type: 'Dashboards/Overview/Health/Prometheus';\n}\n\nexport const isDashboardsOverviewHealthPrometheusSubsystem = (\n e: Extension,\n): e is DashboardsOverviewHealthPrometheusSubsystem =>\n e.type === 'Dashboards/Overview/Health/Prometheus';\n\nexport interface DashboardsOverviewHealthResourceSubsystem<\n R extends ResourcesObject = ResourcesObject\n> extends Extension<ExtensionProperties.DashboardsOverviewHealthResourceSubsystem<R>> {\n type: 'Dashboards/Overview/Health/Resource';\n}\n\nexport const isDashboardsOverviewHealthResourceSubsystem = (\n e: Extension,\n): e is DashboardsOverviewHealthResourceSubsystem =>\n e.type === 'Dashboards/Overview/Health/Resource';\n\nexport interface DashboardsOverviewHealthOperator<R extends K8sResourceCommon = K8sResourceCommon>\n extends Extension<ExtensionProperties.DashboardsOverviewHealthOperator<R>> {\n type: 'Dashboards/Overview/Health/Operator';\n}\n\nexport const isDashboardsOverviewHealthOperator = (\n e: Extension,\n): e is DashboardsOverviewHealthOperator => e.type === 'Dashboards/Overview/Health/Operator';\n\nexport type DashboardsOverviewHealthSubsystem =\n | DashboardsOverviewHealthURLSubsystem\n | DashboardsOverviewHealthPrometheusSubsystem\n | DashboardsOverviewHealthResourceSubsystem\n | DashboardsOverviewHealthOperator;\n\nexport const isDashboardsOverviewHealthSubsystem = (\n e: Extension,\n): e is DashboardsOverviewHealthSubsystem =>\n isDashboardsOverviewHealthURLSubsystem(e) ||\n isDashboardsOverviewHealthPrometheusSubsystem(e) ||\n isDashboardsOverviewHealthResourceSubsystem(e) ||\n isDashboardsOverviewHealthOperator(e);\n\nexport interface DashboardsTab extends Extension<ExtensionProperties.DashboardsTab> {\n type: 'Dashboards/Tab';\n}\n\nexport const isDashboardsTab = (e: Extension): e is DashboardsTab => e.type === 'Dashboards/Tab';\n\nexport interface DashboardsCard extends Extension<ExtensionProperties.DashboardsCard> {\n type: 'Dashboards/Card';\n}\n\nexport const isDashboardsCard = (e: Extension): e is DashboardsCard => e.type === 'Dashboards/Card';\n\nexport interface DashboardsOverviewInventoryItem\n extends Extension<ExtensionProperties.DashboardsOverviewInventoryItem> {\n type: 'Dashboards/Overview/Inventory/Item';\n}\n\nexport const isDashboardsOverviewInventoryItem = (\n e: Extension,\n): e is DashboardsOverviewInventoryItem => e.type === 'Dashboards/Overview/Inventory/Item';\n\nexport interface DashboardsInventoryItemGroup\n extends Extension<ExtensionProperties.DashboardsInventoryItemGroup> {\n type: 'Dashboards/Inventory/Item/Group';\n}\n\nexport const isDashboardsInventoryItemGroup = (e: Extension): e is DashboardsInventoryItemGroup =>\n e.type === 'Dashboards/Inventory/Item/Group';\n\nexport interface DashboardsOverviewResourceActivity\n extends Extension<ExtensionProperties.DashboardsOverviewResourceActivity> {\n type: 'Dashboards/Overview/Activity/Resource';\n}\n\nexport const isDashboardsOverviewResourceActivity = (\n e: Extension,\n): e is DashboardsOverviewResourceActivity => e.type === 'Dashboards/Overview/Activity/Resource';\n\nexport interface DashboardsOverviewPrometheusActivity\n extends Extension<ExtensionProperties.DashboardsOverviewPrometheusActivity> {\n type: 'Dashboards/Overview/Activity/Prometheus';\n}\n\nexport const isDashboardsOverviewPrometheusActivity = (\n e: Extension,\n): e is DashboardsOverviewPrometheusActivity =>\n e.type === 'Dashboards/Overview/Activity/Prometheus';\n\nexport interface ProjectDashboardInventoryItem\n extends Extension<ExtensionProperties.ProjectDashboardInventoryItem> {\n type: 'Project/Dashboard/Inventory/Item';\n}\n\nexport const isProjectDashboardInventoryItem = (e: Extension): e is ProjectDashboardInventoryItem =>\n e.type === 'Project/Dashboard/Inventory/Item';\n\nexport interface DashboardsOverviewInventoryItemReplacement\n extends Extension<ExtensionProperties.DashboardsOverviewInventoryItem> {\n type: 'Dashboards/Overview/Inventory/Item/Replacement';\n}\n\nexport const isDashboardsOverviewInventoryItemReplacement = (\n e: Extension,\n): e is DashboardsOverviewInventoryItemReplacement =>\n e.type === 'Dashboards/Overview/Inventory/Item/Replacement';\n\nexport type CardSpan = 4 | 6 | 12;\n\nexport type K8sActivityProps = {\n resource: K8sResourceKind;\n};\n\nexport type PrometheusActivityProps = {\n results: PrometheusResponse[];\n};\n\nexport type SubsystemHealth = {\n message?: string;\n state: HealthState;\n};\n\nexport type URLHealthHandler<R> = (\n response: R,\n error: any,\n additionalResource?: FirehoseResult<K8sResourceKind | K8sResourceKind[]>,\n) => SubsystemHealth;\n\nexport type PrometheusHealthPopupProps = {\n responses: { response: PrometheusResponse; error: any }[];\n k8sResult?: FirehoseResult<K8sResourceKind | K8sResourceKind[]>;\n};\n\nexport type PrometheusHealthHandler = (\n responses: { response: PrometheusResponse; error: any }[],\n t?: TFunction,\n additionalResource?: FirehoseResult<K8sResourceKind | K8sResourceKind[]>,\n infrastructure?: K8sResourceKind,\n) => SubsystemHealth;\n\nexport type ResourceHealthHandler<R extends ResourcesObject> = (\n resourcesResult: WatchK8sResults<R>,\n t?: TFunction,\n) => SubsystemHealth;\n\nexport type OperatorHealthHandler = (resources: FirehoseResourcesResult) => OperatorHealth;\n\nexport type OperatorHealth = {\n health: keyof typeof HealthState;\n count?: number;\n};\n\nexport type GetOperatorsWithStatuses<R extends K8sResourceCommon = K8sResourceCommon> = (\n resources: FirehoseResourcesResult,\n) => OperatorStatusWithResources<R>[];\n\nexport type OperatorStatusWithResources<R extends K8sResourceCommon = K8sResourceCommon> = {\n operators: R[];\n status: OperatorStatusPriority;\n};\n\nexport type GetOperatorStatusPriority<R extends K8sResourceCommon = K8sResourceCommon> = (\n operator: R,\n) => OperatorStatusPriority;\n\nexport type OperatorStatusPriority = {\n title: string;\n priority: number;\n icon: React.ReactNode;\n health: keyof typeof HealthState;\n};\n\nexport type OperatorRowProps<R extends K8sResourceCommon = K8sResourceCommon> = {\n operatorStatus: OperatorStatusWithResources<R>;\n};\n","import { Dispatch } from 'react-redux';\nimport { Action } from 'typesafe-actions';\nimport { K8sKind } from '@console/internal/module/k8s';\nimport { Extension, AlwaysOnExtension } from './base';\n\nnamespace ExtensionProperties {\n export interface ModelFeatureFlag {\n /** The name of the feature flag. */\n flag: string;\n /** If a CRD for this model exists, the feature will be enabled. */\n model: K8sKind;\n }\n\n export interface CustomFeatureFlag {\n /** Function used to detect the feature and set arbitrary flag name/value via Redux action dispatch. */\n detect: FeatureDetector;\n }\n}\n\nexport interface ModelFeatureFlag extends AlwaysOnExtension<ExtensionProperties.ModelFeatureFlag> {\n type: 'FeatureFlag/Model';\n}\n\nexport interface CustomFeatureFlag extends Extension<ExtensionProperties.CustomFeatureFlag> {\n type: 'FeatureFlag/Custom';\n}\n\nexport const isModelFeatureFlag = (e: Extension): e is ModelFeatureFlag => {\n return e.type === 'FeatureFlag/Model';\n};\n\nexport const isCustomFeatureFlag = (e: Extension): e is CustomFeatureFlag => {\n return e.type === 'FeatureFlag/Custom';\n};\n\nexport type FeatureDetector = (dispatch: Dispatch) => Promise<void | Action>;\n","import { K8sKind } from '@console/internal/module/k8s';\nimport { Extension, AlwaysOnExtension } from './base';\n\nnamespace ExtensionProperties {\n export interface ModelDefinition {\n /** Additional Kubernetes model definitions to register with Console. */\n models: K8sKind[];\n }\n}\n\nexport interface ModelDefinition extends AlwaysOnExtension<ExtensionProperties.ModelDefinition> {\n type: 'ModelDefinition';\n}\n\nexport const isModelDefinition = (e: Extension): e is ModelDefinition => {\n return e.type === 'ModelDefinition';\n};\n","import { OverviewDetailsResourcesTabProps } from '@console/internal/components/overview/resource-overview-page';\nimport { Extension, LazyLoader } from './base';\n\nnamespace ExtensionProperties {\n export interface OverviewResourceTab {\n /** The name of Overview tab to be updated. */\n name: string;\n\n /** Name of key to be checked in prop items. */\n key: string;\n\n /** Loader for the corresponding tab component. */\n loader: LazyLoader<OverviewDetailsResourcesTabProps>;\n }\n\n export interface OverviewTabSection {\n /** Name of key to be checked in prop items. */\n key: string;\n\n /** Loader for the corresponding tab component. */\n loader: LazyLoader<OverviewDetailsResourcesTabProps>;\n }\n}\n\nexport interface OverviewResourceTab extends Extension<ExtensionProperties.OverviewResourceTab> {\n type: 'Overview/Resource';\n}\n\nexport const isOverviewResourceTab = (e: Extension): e is OverviewResourceTab => {\n return e.type === 'Overview/Resource';\n};\n\nexport interface OverviewTabSection extends Extension<ExtensionProperties.OverviewTabSection> {\n type: 'Overview/Section';\n}\n\nexport const isOverviewTabSection = (e: Extension): e is OverviewTabSection => {\n return e.type === 'Overview/Section';\n};\n","import { RouteComponentProps, RouteProps } from 'react-router-dom';\nimport { PageComponentProps } from '@console/internal/components/utils';\nimport {\n K8sKind,\n K8sResourceKindReference,\n K8sResourceKind,\n K8sResourceCommon,\n} from '@console/internal/module/k8s';\nimport { Extension, LazyLoader } from './base';\n\nnamespace ExtensionProperties {\n export interface ResourcePage<T> {\n /** Model associated with the resource page. */\n model: K8sKind;\n /** Loader for the corresponding React page component. */\n loader: LazyLoader<T>;\n }\n\n /** To add an additonal page to public components(ex: PVs, PVCs) via plugins */\n export type ResourceTabPage<R extends K8sResourceCommon> = ResourcePage<PageComponentProps<R>> & {\n /** The href for the resource page */\n href: string;\n /** Name of the resource tab inside detailsPage */\n name: string;\n };\n\n export type ResourceListPage = ResourcePage<{\n /** See https://reacttraining.com/react-router/web/api/match */\n match: RouteComponentProps['match'];\n /** The resource kind scope. */\n kind: K8sResourceKindReference;\n /** Whether the page should assign focus when loaded. */\n autoFocus: boolean;\n /** Whether the page should mock the UI empty state. */\n mock: boolean;\n /** The namespace scope. */\n namespace: string;\n }> & {\n /** Some Resources require ReferenceFor instead of ReferenceForModel */\n modelParser?: (obj: K8sResourceKind) => string;\n };\n\n export type ResourceDetailsPage = ResourcePage<{\n /** See https://reacttraining.com/react-router/web/api/match */\n match: RouteComponentProps['match'];\n /** The resource kind scope. */\n kind: K8sResourceKindReference;\n /** The namespace scope. */\n namespace: string;\n /** The page name. */\n name: string;\n }> & {\n /** Some Resources require ReferenceFor instead of ReferenceForModel */\n modelParser?: (obj: K8sResourceKind) => string;\n };\n\n // Maps to react-router#https://reacttraining.com/react-router/web/api/Route\n // See https://reacttraining.com/react-router/web/api/Route\n export type RoutePage = Omit<RouteProps, 'location'> & {\n /** Loader for the corresponding React page component. */\n loader?: LazyLoader<RouteComponentProps>;\n /** Any valid URL path or array of paths that path-to-regexp@^1.7.0 understands. */\n path: string | string[];\n /** Perspective id to which this page belongs to. */\n perspective?: string;\n };\n}\n\nexport interface ResourceListPage extends Extension<ExtensionProperties.ResourceListPage> {\n type: 'Page/Resource/List';\n}\n\nexport interface ResourceDetailsPage extends Extension<ExtensionProperties.ResourceDetailsPage> {\n type: 'Page/Resource/Details';\n}\n\nexport interface RoutePage extends Extension<ExtensionProperties.RoutePage> {\n type: 'Page/Route';\n}\n\nexport interface ResourceTabPage<R extends K8sResourceCommon = K8sResourceCommon>\n extends Extension<ExtensionProperties.ResourceTabPage<R>> {\n type: 'Page/Resource/Tab';\n}\n\nexport type ResourcePage = ResourceListPage | ResourceDetailsPage;\n\nexport const isResourceListPage = (e: Extension): e is ResourceListPage => {\n return e.type === 'Page/Resource/List';\n};\n\nexport const isResourceDetailsPage = (e: Extension): e is ResourceDetailsPage => {\n return e.type === 'Page/Resource/Details';\n};\n\nexport const isResourceTabPage = (e: Extension): e is ResourceTabPage => {\n return e.type === 'Page/Resource/Tab';\n};\n\nexport const isRoutePage = (e: Extension): e is RoutePage => {\n return e.type === 'Page/Route';\n};\n","import { PageComponentProps, Page } from '@console/internal/components/utils/horizontal-nav';\nimport { K8sKind } from '@console/internal/module/k8s';\nimport { Extension, LazyLoader } from './base';\n\nnamespace ExtensionProperties {\n export interface HorizontalNavTab {\n model: K8sKind;\n page: Pick<Page, 'name' | 'href' | 'path'>;\n loader: LazyLoader<PageComponentProps>;\n }\n}\n\nexport interface HorizontalNavTab extends Extension<ExtensionProperties.HorizontalNavTab> {\n type: 'HorizontalNavTab';\n}\n\nexport const isHorizontalNavTab = (e: Extension): e is HorizontalNavTab => {\n return e.type === 'HorizontalNavTab';\n};\n","import { Extension } from './base';\n\nnamespace ExtensionProperties {\n export interface PostFormSubmissionAction<T, P> {\n /** action type */\n type: string;\n /** callback for the related action */\n callback: (arg: T, payload?: P) => Promise<T>;\n }\n}\n\nexport interface PostFormSubmissionAction<R = any, P = string>\n extends Extension<ExtensionProperties.PostFormSubmissionAction<R, P>> {\n type: 'PostFormSubmissionAction';\n}\n\nexport const isPostFormSubmissionAction = (e: Extension): e is PostFormSubmissionAction => {\n return e.type === 'PostFormSubmissionAction';\n};\n","import { Location } from 'react-router-dom-v5-compat';\nimport { CodeRef } from '@console/dynamic-plugin-sdk/src/types';\nimport { K8sKind } from '@console/internal/module/k8s';\nimport { Extension } from './base';\n\nexport type DetailsPageBreadCrumbsHook = (\n kind: K8sKind,\n urlMatch: any,\n) => ({ name: string; path: string } | { name: string; path: Location })[];\n\nnamespace ExtensionProperties {\n export interface DetailPageBreadCrumbs {\n /**\n * array of models(kindObj) against which bread crumb is needed\n */\n getModels: CodeRef<() => K8sKind[] | K8sKind>;\n /**\n * returns breadcrumb for the given kindref\n */\n breadcrumbsProvider: CodeRef<DetailsPageBreadCrumbsHook>;\n }\n}\n\nexport interface DetailPageBreadCrumbs\n extends Extension<ExtensionProperties.DetailPageBreadCrumbs> {\n type: 'DetailPageBreadCrumbs';\n}\n\nexport const isDetailPageBreadCrumbs = (e: Extension): e is DetailPageBreadCrumbs => {\n return e.type === 'DetailPageBreadCrumbs';\n};\n","import i18next from 'i18next';\n\nexport const getJobTypeAndCompletions = ({ spec }) => {\n // if neither completions nor parallelism are defined, then it is a non-parallel job.\n if (!spec.completions && !spec.parallelism) {\n return { type: i18next.t('public~Non-parallel'), completions: 1 };\n }\n // if completions are defined and no parallelism is defined, or if parallelism is 0 or 1, then it is a 'Non-parallel' job.\n if (spec.completions && (!spec.parallelism || spec.parallelism === 1)) {\n return { type: i18next.t('public~Non-parallel'), completions: spec.completions };\n }\n // if parallelism is greater than 1 and completions are defined, then it is a 'Fixed Completion Count' job.\n if (spec.hasOwnProperty('parallelism') && spec.completions) {\n return { type: i18next.t('public~Fixed completion count'), completions: spec.completions };\n }\n // otherwise, if parallelism is defined, but completions is not, then it is a 'Work Queue' job.\n return { type: i18next.t('public~Work queue'), completions: 1 };\n};\n","import { K8sResourceCommon, QueryParams } from '@console/dynamic-plugin-sdk/src';\nimport {\n k8sPatch,\n k8sKill,\n k8sList,\n resourceURL,\n k8sWatch,\n} from '@console/dynamic-plugin-sdk/src/utils/k8s';\nimport { K8sKind, Patch } from './types';\n\nexport type Options = {\n ns?: string;\n name?: string;\n path?: string;\n queryParams?: QueryParams;\n};\n\nexport const watchURL = (kind: K8sKind, options: Options): string => {\n const opts = options || {};\n\n opts.queryParams = opts.queryParams || {};\n opts.queryParams.watch = 'true';\n return resourceURL(kind, opts);\n};\n\nexport const k8sPatchByName = (\n kind: K8sKind,\n name: string,\n namespace: string,\n data: Patch[],\n opts: Options = {},\n) => k8sPatch(kind, { metadata: { name, namespace } }, data, opts);\n\nexport const k8sKillByName = <R extends K8sResourceCommon>(\n kind: K8sKind,\n name: string,\n namespace?: string,\n opts: Options = {},\n requestInit: RequestInit = {},\n): Promise<R> => k8sKill(kind, { metadata: { name, namespace } }, opts, requestInit);\n\nexport const k8sListPartialMetadata = (\n kind: K8sKind,\n params: { [key: string]: any } = {},\n raw = false,\n) => {\n return k8sList(kind, params, raw, {\n headers: {\n Accept:\n 'application/json;as=PartialObjectMetadataList;v=v1beta1;g=meta.k8s.io,application/json',\n },\n });\n};\n\n/**\n * Use k8sWatch to wait for a resource to get into an expected condition.\n * Watches for resource by kind, namespace and optional name.\n * Promise resolves to a new resource version or rejects with a timeout.\n */\nexport const k8sWaitForUpdate = <R extends K8sResourceCommon>(\n kind: K8sKind,\n resource: R,\n checkCondition: (kind: R) => boolean,\n timeoutInMs: number,\n) => {\n if (!resource || !resource.metadata) {\n return Promise.reject(new Error('Provided resource is undefined'));\n }\n const { namespace, name, resourceVersion } = resource.metadata;\n try {\n if (checkCondition(resource)) {\n return Promise.resolve(resource);\n }\n } catch (error) {\n return Promise.reject(error);\n }\n\n const watcher = k8sWatch(kind, {\n ns: namespace,\n resourceVersion,\n });\n const closeConnection = () => watcher.destroy();\n\n const waitForCondition = new Promise((resolve, reject) => {\n watcher.onbulkmessage((messages) => {\n for (const message of messages) {\n const { object } = message;\n if (!name || name === object?.metadata?.name) {\n try {\n if (checkCondition(object)) {\n resolve(object);\n }\n } catch (err) {\n reject(err);\n }\n }\n }\n });\n watcher.onclose(() => reject(new Error('Connection closed')));\n watcher.ondestroy(() => reject(new Error('Connection destroyed')));\n });\n\n const waitForTimeout = new Promise((resolve, reject) => {\n setTimeout(() => reject(new Error('Timed out waiting for resource to finish')), timeoutInMs);\n });\n\n return Promise.race([waitForCondition, waitForTimeout]).finally(closeConnection);\n};\n","import * as React from 'react';\nimport * as hoistStatics from 'hoist-non-react-statics';\nimport { Extension, ExtensionTypeGuard, LoadedExtension } from '../typings';\nimport { useExtensions } from './useExtensions';\n\n/**\n * React higher-order component (HOC) for consuming Console extensions.\n *\n * This is semantically equivalent to `useExtensions` hook with one difference:\n * this HOC supports retrieving different extension types and providing them to\n * your component as props.\n *\n * Example usage:\n *\n * ```ts\n * const Example = withExtensions<ExampleExtensionProps>({\n * navItemExtensions: isNavItem,\n * perspectiveExtensions: isPerspective,\n * })(\n * class Example extends React.Component<ExampleOwnProps & ExampleExtensionProps> {\n * render() {\n * const { navItemExtensions, perspectiveExtensions } = this.props;\n * // process extensions and render your component\n * }\n * },\n * );\n *\n * type ExampleExtensionProps = {\n * navItemExtensions: NavItem[];\n * perspectiveExtensions: Perspective[];\n * };\n * ```\n *\n * @param typeGuardMapper Object that maps prop names to extension type guards.\n * It's basically an object-based analogy to Redux `mapStateToProps` function.\n *\n * @returns `withExtensions` higher-order component creator function.\n */\nexport const withExtensions = <\n TExtensionProps extends ExtensionProps<E>,\n E extends Extension = Extension,\n TCombinedProps extends TExtensionProps = TExtensionProps\n>(\n typeGuardMapper: ExtensionTypeGuardMapper<E, TExtensionProps>,\n): ((C: React.ComponentType<TCombinedProps>) => ExtensionHOC<TCombinedProps, TExtensionProps>) => (\n WrappedComponent,\n) => {\n const typeGuards = Object.values(typeGuardMapper);\n\n if (typeGuards.length === 0) {\n throw new Error('The object passed to withExtensions must contain at least one type guard');\n }\n\n const HOC: ExtensionHOC<TCombinedProps, TExtensionProps> = (props) => {\n const extensionsInUse = useExtensions(...typeGuards);\n\n const extensionProps = React.useMemo(\n () =>\n Object.keys(typeGuardMapper).reduce((acc, propName) => {\n acc[propName] = extensionsInUse.filter(typeGuardMapper[propName]);\n return acc;\n }, {} as ExtensionProps<E>),\n [extensionsInUse],\n );\n\n const combinedProps = {\n ...props,\n ...extensionProps,\n } as TCombinedProps;\n\n return <WrappedComponent {...combinedProps} />;\n };\n\n HOC.displayName = `withExtensions(${WrappedComponent.displayName || WrappedComponent.name})`;\n HOC.WrappedComponent = WrappedComponent;\n\n return hoistStatics(HOC, WrappedComponent);\n};\n\ntype ExtensionHOC<TCombinedProps, TExtensionProps> = React.ComponentType<\n Omit<TCombinedProps, keyof TExtensionProps>\n> & {\n WrappedComponent: React.ComponentType<TCombinedProps>;\n};\n\ntype ExtensionProps<E extends Extension> = {\n [propName: string]: E[] | LoadedExtension<E>[];\n};\n\ntype ExtensionTypeGuardMapper<E extends Extension, P extends ExtensionProps<E>> = {\n [K in keyof P]: ExtensionTypeGuard<E>;\n};\n","import * as _ from 'lodash-es';\nimport { ClusterOperator, OperandVersion } from '.';\n\nexport enum OperatorStatus {\n Available = 'Available',\n Progressing = 'Progressing',\n Degraded = 'Degraded',\n CannotUpdate = 'Cannot update',\n Unavailable = 'Unavailable',\n Unknown = 'Unknown',\n}\n\nexport const getStatusAndMessage = (operator: ClusterOperator) => {\n const conditions = _.get(operator, 'status.conditions');\n const cannotUpdate: any = _.find(conditions, { type: 'Upgradeable', status: 'False' });\n if (cannotUpdate) {\n return { status: OperatorStatus.CannotUpdate, message: cannotUpdate.message };\n }\n\n const unavailable: any = _.find(conditions, { type: 'Available', status: 'False' });\n if (unavailable) {\n return { status: OperatorStatus.Unavailable, message: unavailable.message };\n }\n\n const degraded: any = _.find(conditions, { type: 'Degraded', status: 'True' });\n if (degraded) {\n return { status: OperatorStatus.Degraded, message: degraded.message };\n }\n\n const progressing: any = _.find(conditions, { type: 'Progressing', status: 'True' });\n if (progressing) {\n return { status: OperatorStatus.Progressing, message: progressing.message };\n }\n\n const available: any = _.find(conditions, { type: 'Available', status: 'True' });\n if (available) {\n return { status: OperatorStatus.Available, message: '' };\n }\n\n return { status: OperatorStatus.Unknown, message: '' };\n};\n\nexport const getClusterOperatorStatus = (operator: ClusterOperator) => {\n const { status } = getStatusAndMessage(operator);\n return status;\n};\n\nexport const getClusterOperatorVersion = (operator: ClusterOperator) => {\n const versions: OperandVersion[] = _.get(operator, 'status.versions', []);\n const operatorVersion = _.find(versions, (v) => v.name === 'operator');\n return operatorVersion ? operatorVersion.version : '';\n};\n","import * as _ from 'lodash-es';\n\nimport { TemplateInstanceKind } from '../../module/k8s';\n\nexport const getTemplateInstanceStatus = (instance: TemplateInstanceKind) => {\n const conditions = _.get(instance, 'status.conditions');\n const failed = _.some(conditions, { type: 'InstantiateFailure', status: 'True' });\n if (failed) {\n return 'Failed';\n }\n const ready = _.some(conditions, { type: 'Ready', status: 'True' });\n return ready ? 'Ready' : 'Not Ready';\n};\n","import { JSONSchema7 } from 'json-schema';\nimport {\n NodeAddress,\n ObjectReference,\n ObjectMetadata,\n K8sResourceCommon,\n K8sVerb,\n K8sResourceCondition,\n NodeCondition,\n TaintEffect,\n} from '@console/dynamic-plugin-sdk/src/extensions/console-types';\nimport { EventInvolvedObject } from './event';\nimport { Selector, MatchLabels, K8sModel } from '@console/dynamic-plugin-sdk/src/api/common-types';\n\nexport * from '@console/dynamic-plugin-sdk/src/extensions/console-types';\nexport * from '@console/dynamic-plugin-sdk/src/api/common-types';\n\nexport type PartialObjectMetadata = {\n apiVersion: string;\n kind: string;\n metadata: ObjectMetadata;\n};\n\nexport type ClusterServiceVersionCondition = {\n phase: string;\n lastTransitionTime?: string;\n reason?: string;\n message?: string;\n};\n\nexport type TolerationOperator = 'Exists' | 'Equal';\n\nexport type Toleration = {\n effect: TaintEffect;\n key?: string;\n operator: TolerationOperator;\n tolerationSeconds?: number;\n value?: string;\n};\n\n// Generic, unknown kind. Avoid when possible since it allows any key in spec\n// or status, weakening type checking.\nexport type K8sResourceKind = K8sResourceCommon & {\n spec?: {\n [key: string]: any;\n };\n status?: { [key: string]: any };\n data?: { [key: string]: any };\n};\n\nexport type VolumeMount = {\n mountPath: string;\n mountPropagation?: 'None' | 'HostToContainer' | 'Bidirectional';\n name: string;\n readOnly?: boolean;\n subPath?: string;\n subPathExpr?: string;\n};\n\nexport type VolumeDevice = {\n devicePath: string;\n name: string;\n};\n\ntype ProbePort = string | number;\n\nexport type ExecProbe = {\n command: string[];\n};\n\nexport type HTTPGetProbe = {\n path?: string;\n port: ProbePort;\n host?: string;\n scheme: 'HTTP' | 'HTTPS';\n httpHeaders?: any[];\n};\n\nexport type TCPSocketProbe = {\n port: ProbePort;\n host?: string;\n};\n\nexport type Handler = {\n exec?: ExecProbe;\n httpGet?: HTTPGetProbe;\n tcpSocket?: TCPSocketProbe;\n};\n\nexport type ContainerProbe = {\n initialDelaySeconds?: number;\n timeoutSeconds?: number;\n periodSeconds?: number;\n successThreshold?: number;\n failureThreshold?: number;\n} & Handler;\n\nexport type ContainerLifecycleStage = 'postStart' | 'preStop';\n\nexport type ContainerLifecycle = {\n postStart?: Handler;\n preStop?: Handler;\n};\n\nexport type ResourceList = {\n [resourceName: string]: string;\n};\n\nexport type EnvVarSource = {\n fieldRef?: {\n apiVersion?: string;\n fieldPath: string;\n };\n resourceFieldRef?: {\n resource: string;\n containerName?: string;\n divisor?: string;\n };\n configMapKeyRef?: {\n key: string;\n name: string;\n };\n secretKeyRef?: {\n key: string;\n name: string;\n };\n configMapRef?: {\n key?: string;\n name: string;\n };\n secretRef?: {\n key?: string;\n name: string;\n };\n configMapSecretRef?: {\n key?: string;\n name: string;\n };\n serviceAccountRef?: {\n key?: string;\n name: string;\n };\n};\n\nexport type EnvVar = {\n name: string;\n value?: string;\n valueFrom?: EnvVarSource;\n};\n\nexport type ContainerPort = {\n name?: string;\n containerPort: number;\n protocol: string;\n};\n\nexport enum ImagePullPolicy {\n Always = 'Always',\n Never = 'Never',\n IfNotPresent = 'IfNotPresent',\n}\n\nexport type NodeAffinity = {\n preferredDuringSchedulingIgnoredDuringExecution?: {\n preference: Selector;\n weight: number;\n }[];\n requiredDuringSchedulingIgnoredDuringExecution?: {\n nodeSelectorTerms: Selector[];\n };\n};\n\nexport type PodAffinityTerm = {\n labelSelector?: Selector;\n namespaces?: string[];\n topologyKey: string;\n};\n\nexport type PodAffinity = {\n preferredDuringSchedulingIgnoredDuringExecution: {\n podAffinityTerm: PodAffinityTerm;\n weight?: number;\n }[];\n requiredDuringSchedulingIgnoredDuringExecution: PodAffinityTerm[];\n};\n\nexport type ContainerSpec = {\n name: string;\n volumeMounts?: VolumeMount[];\n volumeDevices?: VolumeDevice[];\n env?: EnvVar[];\n livenessProbe?: ContainerProbe;\n readinessProbe?: ContainerProbe;\n lifecycle?: ContainerLifecycle;\n resources?: {\n limits?: ResourceList;\n requested?: ResourceList;\n };\n ports?: ContainerPort[];\n imagePullPolicy?: ImagePullPolicy;\n [key: string]: any;\n};\n\nexport type Volume = {\n name: string;\n [key: string]: any;\n};\n\nexport type PodSpec = {\n volumes?: Volume[];\n initContainers?: ContainerSpec[];\n containers: ContainerSpec[];\n restartPolicy?: 'Always' | 'OnFailure' | 'Never';\n terminationGracePeriodSeconds?: number;\n activeDeadlineSeconds?: number;\n nodeSelector?: any;\n serviceAccountName?: string;\n priorityClassName?: string;\n tolerations?: Toleration[];\n nodeName?: string;\n hostname?: string;\n [key: string]: any;\n};\n\n// https://github.com/kubernetes/api/blob/release-1.16/core/v1/types.go#L2411-L2432\ntype PodPhase = 'Pending' | 'Running' | 'Succeeded' | 'Failed' | 'Unknown';\n\ntype ContainerStateValue = {\n reason?: string;\n [key: string]: any;\n};\n\nexport type ContainerState = {\n waiting?: ContainerStateValue;\n running?: ContainerStateValue;\n terminated?: ContainerStateValue;\n};\n\nexport type ContainerStatus = {\n name: string;\n state?: ContainerState;\n lastState?: ContainerState;\n ready: boolean;\n restartCount: number;\n image: string;\n imageID: string;\n containerID?: string;\n started?: boolean;\n};\n\nexport type PodCondition = {\n lastProbeTime?: string;\n} & K8sResourceCondition;\n\nexport type PodStatus = {\n phase: PodPhase;\n conditions?: PodCondition[];\n message?: string;\n reason?: string;\n startTime?: string;\n initContainerStatuses?: ContainerStatus[];\n containerStatuses?: ContainerStatus[];\n [key: string]: any;\n};\n\nexport type PodTemplate = {\n metadata: ObjectMetadata;\n spec: PodSpec;\n};\n\nexport type PodKind = {\n status?: PodStatus;\n} & K8sResourceCommon &\n PodTemplate;\n\nexport type DeploymentCondition = {\n lastUpdateTime?: string;\n} & K8sResourceCondition;\n\nexport type DeploymentKind = {\n spec: {\n minReadySeconds?: number;\n paused?: boolean;\n progressDeadlineSeconds?: number;\n replicas?: number;\n revisionHistoryLimit?: number;\n selector: Selector;\n strategy?: {\n rollingUpdate?: {\n maxSurge: number | string;\n maxUnavailable: number | string;\n };\n type?: string;\n };\n template: PodTemplate;\n };\n status?: {\n availableReplicas?: number;\n collisionCount?: number;\n conditions?: DeploymentCondition[];\n observedGeneration?: number;\n readyReplicas?: number;\n replicas?: number;\n unavailableReplicas?: number;\n updatedReplicas?: number;\n };\n} & K8sResourceCommon;\n\nexport type DeploymentConfigKind = {\n spec: {\n paused?: boolean;\n replicas?: number;\n selector: Selector;\n strategy?: {\n rollingUpdate?: {\n maxSurge: number | string;\n maxUnavailable: number | string;\n };\n type?: string;\n };\n template: PodTemplate;\n };\n status?: {\n latestVersion?: number;\n };\n} & K8sResourceCommon;\n\nexport type ResourceQuotaKind = {\n spec?: {\n hard?: { [key: string]: string };\n scopes?: string[];\n scopeSelector?: {\n matchExpressions?: { scopeName: string; operator: string; values?: string[] }[];\n };\n };\n status?: {\n hard?: { [key: string]: string };\n used?: { [key: string]: string };\n };\n} & K8sResourceCommon;\n\nexport type ClusterResourceQuotaKind = {\n spec?: {\n selector?: {\n labels?: Selector;\n annotations?: MatchLabels;\n };\n quota?: {\n hard?: { [key: string]: string };\n scopes?: string[];\n scopeSelector?: {\n matchExpressions?: { scopeName: string; operator: string; values?: string[] }[];\n };\n };\n };\n status?: {\n namespaces?: {\n namespace: string;\n status: { used?: { [key: string]: string }; hard?: { [key: string]: string } };\n }[];\n total?: { hard?: { [key: string]: string }; used?: { [key: string]: string } };\n };\n} & K8sResourceCommon;\n\nexport type AppliedClusterResourceQuotaKind = ClusterResourceQuotaKind;\n\ntype CurrentObject = {\n averageUtilization?: number;\n averageValue?: string;\n value?: string;\n};\n\ntype MetricObject = {\n name: string;\n selector?: Selector;\n};\n\ntype TargetObjcet = {\n averageUtilization?: number;\n type: string;\n averageValue?: string;\n value?: string;\n};\n\ntype DescribedObject = {\n apiVersion?: string;\n kind: string;\n name: string;\n};\nexport type HPAMetric = {\n type: 'Object' | 'Pods' | 'Resource' | 'External';\n resource?: {\n name: string;\n target: TargetObjcet;\n };\n external?: {\n metric: MetricObject;\n target: TargetObjcet;\n };\n object?: {\n describedObjec: DescribedObject;\n metric: MetricObject;\n target: TargetObjcet;\n };\n pods?: {\n metric: MetricObject;\n target: TargetObjcet;\n };\n};\n\ntype HPAScalingPolicy = {\n hpaScalingPolicyType: 'Pods' | 'Percent';\n value: number;\n periodSeconds: number;\n};\n\ntype HPAScalingRules = {\n stabilizationWindowSeconds?: number;\n selectPolicy?: 'Max' | 'Min' | 'Disabled';\n policies?: HPAScalingPolicy[];\n};\n\ntype HPACurrentMetrics = {\n type: 'Object' | 'Pods' | 'Resource' | 'External';\n external?: {\n current: CurrentObject;\n metric: MetricObject;\n };\n object?: {\n current: CurrentObject;\n describedObject: DescribedObject;\n metric: MetricObject;\n };\n pods?: {\n current: CurrentObject;\n metric: MetricObject;\n };\n resource?: {\n name: string;\n current: CurrentObject;\n };\n};\n\nexport type HorizontalPodAutoscalerKind = K8sResourceCommon & {\n spec: {\n scaleTargetRef: {\n apiVersion: string;\n kind: string;\n name: string;\n };\n minReplicas?: number;\n maxReplicas: number;\n metrics?: HPAMetric[];\n behavior?: {\n scaleUp?: HPAScalingRules;\n scaleDown?: HPAScalingRules;\n };\n };\n status?: {\n currentReplicas: number;\n desiredReplicas: number;\n currentMetrics?: HPACurrentMetrics[];\n conditions: NodeCondition[];\n lastScaleTime?: string;\n };\n};\n\nexport type StorageClassResourceKind = {\n provisioner: string;\n reclaimPolicy: string;\n parameters?: {\n [key: string]: string;\n };\n} & K8sResourceCommon;\n\nexport type ConfigMapKind = {\n data?: { [key: string]: string };\n binaryData?: { [key: string]: string };\n} & K8sResourceCommon;\n\nexport type JobTemplate = {\n metadata: ObjectMetadata;\n spec: {\n activeDeadlineSeconds?: number;\n backoffLimit?: number;\n completions?: number;\n manualSelector?: boolean;\n parallelism?: boolean;\n selector?: Selector;\n template: PodTemplate;\n ttlSecondsAfterFinished?: number;\n };\n};\n\nexport type JobKind = {\n apiVersion: string;\n kind: string;\n status: {\n active?: number;\n completionTime?: string;\n conditions?: K8sResourceCondition[];\n failed?: number;\n startTime?: string;\n succeeded?: number;\n };\n} & JobTemplate;\n\nexport type CronJobKind = {\n apiVersion: string;\n kind: string;\n metadata: ObjectMetadata;\n spec: {\n concurrencyPolicy?: string;\n failedJobsHistoryLimit?: number;\n jobTemplate: JobTemplate;\n schedule: string;\n startingDeadlineSeconds?: number;\n successfulJobsHistoryLimit?: number;\n suspend?: boolean;\n };\n status: {\n active?: {\n apiVersion?: string;\n fieldPath?: string;\n kind?: string;\n name?: string;\n namespace?: string;\n resourceVersion?: string;\n uid?: string;\n }[];\n lastScheduleTime?: string;\n };\n};\n\nexport type CRDVersion = {\n name: string;\n served: boolean;\n storage: boolean;\n schema: {\n // NOTE: Actually a subset of JSONSchema, but using this type for convenience\n openAPIV3Schema: JSONSchema7;\n };\n};\n\nexport type CustomResourceDefinitionKind = {\n spec: {\n group: string;\n versions: CRDVersion[];\n names: {\n kind: string;\n singular: string;\n plural: string;\n listKind: string;\n shortNames?: string[];\n };\n scope: 'Cluster' | 'Namespaced';\n };\n status?: {\n conditions?: K8sResourceCondition[];\n };\n} & K8sResourceCommon;\n\nexport type RouteTarget = {\n kind: 'Service';\n name: string;\n weight: number;\n};\n\nexport type RouteTLS = {\n caCertificate?: string;\n certificate?: string;\n destinationCACertificate?: string;\n insecureEdgeTerminationPolicy?: string;\n key?: string;\n termination: string;\n};\n\nexport type RouteIngress = {\n conditions: K8sResourceCondition[];\n host?: string;\n routerCanonicalHostname?: string;\n routerName?: string;\n wildcardPolicy?: string;\n};\n\nexport type RouteKind = {\n spec: {\n alternateBackends?: RouteTarget[];\n host?: string;\n path?: string;\n port?: {\n targetPort: number | string;\n };\n subdomain?: string;\n tls?: RouteTLS;\n to: RouteTarget;\n wildcardPolicy?: string;\n };\n status?: {\n ingress: RouteIngress[];\n url?: string;\n conditions?: K8sResourceCondition[];\n };\n} & K8sResourceCommon;\n\nexport type CloudCredentialKind = {\n spec: {\n credentialsMode: string;\n };\n} & K8sResourceCommon;\n\nexport type InfrastructureKind = {\n status: {\n platform: string;\n };\n} & K8sResourceCommon;\n\nexport type AuthenticationKind = {\n spec: {\n serviceAccountIssuer: string;\n };\n} & K8sResourceCommon;\n\nexport type TemplateParameter = {\n name: string;\n value?: string;\n displayName?: string;\n description?: string;\n generate?: string;\n required?: boolean;\n};\n\nexport type TemplateKind = {\n message?: string;\n objects: any[];\n parameters: TemplateParameter[];\n labels?: any[];\n} & K8sResourceCommon;\n\ntype TemplateInstanceObject = {\n ref: ObjectReference;\n};\n\nexport type TemplateInstanceKind = {\n spec: {\n template: TemplateKind;\n secret: {\n name: string;\n };\n requester?: {\n username?: string;\n uid?: string;\n groups?: string[];\n extra?: any;\n };\n };\n status?: {\n conditions: K8sResourceCondition[];\n objects: TemplateInstanceObject[];\n };\n} & K8sResourceCommon;\n\nexport type MachineAWSPlacement = {\n availabilityZone?: string;\n region?: string;\n};\n\nexport type MachineSpec = {\n providerSpec: {\n value?: {\n placement?: MachineAWSPlacement;\n instanceType?: string;\n vmSize?: string;\n machineType?: string;\n flavor?: string;\n };\n };\n versions: {\n kubelet: string;\n };\n [key: string]: any;\n};\n\nexport type MachineKind = {\n spec: MachineSpec;\n status?: {\n phase?: string;\n addresses: NodeAddress[];\n lastUpdated: string;\n nodeRef: {\n kind: string;\n name: string;\n uid: string;\n };\n providerStatus: {\n kind: string;\n conditions?: K8sResourceCondition[];\n [key: string]: any;\n };\n };\n} & K8sResourceCommon;\n\nexport type MachineSetKind = {\n spec: {\n replicas: number;\n selector: any;\n template: {\n spec: MachineSpec;\n };\n };\n status?: {\n availableReplicas: number;\n fullyLabeledReplicas: number;\n readyReplicas: number;\n replicas: number;\n };\n} & K8sResourceCommon;\n\nexport type Patch = {\n op: string;\n path: string;\n value?: any;\n};\n\nexport type RollingUpdate = { maxUnavailable?: number | string; maxSurge?: number | string };\nexport type DeploymentUpdateStrategy =\n | {\n type: 'Recreate';\n }\n | {\n type: 'RollingUpdate';\n rollingUpdate: RollingUpdate;\n };\n\nexport type MachineDeploymentKind = {\n spec: {\n replicas: number;\n selector: Selector;\n template: {\n spec: MachineSpec;\n };\n paused?: boolean;\n minReadySeconds?: number;\n progressDeadlineSeconds?: number;\n strategy: DeploymentUpdateStrategy;\n };\n status?: {\n availableReplicas: number;\n unavailableReplicas: number;\n readyReplicas: number;\n replicas: number;\n };\n} & K8sResourceCommon;\n\nexport type MachineConfigKind = {\n spec: {\n osImageURL: string;\n config: any;\n };\n} & K8sResourceCommon;\n\nexport enum MachineConfigPoolConditionType {\n Degraded = 'Degraded',\n NodeDegraded = 'NodeDegraded',\n RenderDegraded = 'RenderDegraded',\n Updated = 'Updated',\n Updating = 'Updating',\n}\n\nexport type MachineConfigPoolCondition = {\n type: keyof typeof MachineConfigPoolConditionType;\n} & K8sResourceCondition;\n\nexport type MachineConfigPoolStatus = {\n observedGeneration?: number;\n configuration: {\n name: string;\n source: ObjectReference[];\n };\n machineCount: number;\n updatedMachineCount: number;\n readyMachineCount: number;\n unavailableMachineCount: number;\n conditions?: MachineConfigPoolCondition[];\n};\n\nexport type MachineConfigPoolSpec = {\n machineConfigSelector?: Selector;\n maxUnavailable?: number | string;\n nodeSelector?: Selector;\n paused?: boolean;\n};\n\nexport type MachineConfigPoolKind = {\n /*\n * spec is required per\n * https://github.com/openshift/machine-config-operator/blob/master/pkg/apis/machineconfiguration.openshift.io/v1/types.go#L228-L229\n * but the API doesn't enforce it\n */\n spec?: MachineConfigPoolSpec;\n status?: MachineConfigPoolStatus;\n} & K8sResourceKind;\n\nexport type Release = {\n version: string;\n image: string;\n url?: string;\n channels?: string[];\n};\n\nexport type VersionUpdate = { version?: string; image?: string };\n\nexport type ConditionalUpdate = {\n release: VersionUpdate;\n conditions: K8sResourceCondition[];\n};\n\nexport type UpdateHistory = {\n state: 'Completed' | 'Partial';\n startedTime: string;\n completionTime: string;\n version: string;\n image: string;\n verified: boolean;\n};\n\nexport enum ClusterVersionConditionType {\n Available = 'Available',\n Failing = 'Failing',\n Progressing = 'Progressing',\n RetrievedUpdates = 'RetrievedUpdates',\n Invalid = 'Invalid',\n Upgradeable = 'Upgradeable',\n ReleaseAccepted = 'ReleaseAccepted',\n}\n\nexport type ClusterVersionCondition = {\n type: keyof typeof ClusterVersionConditionType;\n} & K8sResourceCondition;\n\ntype ClusterVersionStatus = {\n desired: Release;\n history: UpdateHistory[];\n observedGeneration: number;\n versionHash: string;\n conditions?: ClusterVersionCondition[];\n availableUpdates?: VersionUpdate[];\n conditionalUpdates?: ConditionalUpdate[];\n};\n\ntype ClusterVersionSpec = {\n channel: string;\n clusterID: string;\n desiredUpdate?: Release;\n upstream?: string;\n};\n\nexport type ClusterVersionKind = {\n spec: ClusterVersionSpec;\n status: ClusterVersionStatus;\n} & K8sResourceCommon;\n\nexport type OperandVersion = {\n name: string;\n version: string;\n};\n\nexport type ClusterOperatorObjectReference = {\n group: string;\n resource: string;\n namespace?: string;\n name: string;\n};\n\nexport type ClusterOperator = {\n spec: {};\n status: {\n conditions?: K8sResourceCondition[];\n versions?: OperandVersion[];\n relatedObjects?: ClusterOperatorObjectReference[];\n };\n} & K8sResourceCommon;\n\nexport type MappingMethodType = 'claim' | 'lookup' | 'add';\n\ntype IdentityProviderType =\n | 'BasicAuth'\n | 'GitHub'\n | 'GitLab'\n | 'Google'\n | 'HTPasswd'\n | 'Keystone'\n | 'LDAP'\n | 'OpenID'\n | 'RequestHeader';\n\ntype IdentityProviderConfig = {\n [key: string]: any;\n};\n\nexport type IdentityProvider = {\n name: string;\n mappingMethod: MappingMethodType;\n type: IdentityProviderType;\n basicAuth?: IdentityProviderConfig;\n github?: IdentityProviderConfig;\n gitlab?: IdentityProviderConfig;\n google?: IdentityProviderConfig;\n htpasswd?: IdentityProviderConfig;\n keystone?: IdentityProviderConfig;\n ldap?: IdentityProviderConfig;\n openID?: IdentityProviderConfig;\n requestHeader?: IdentityProviderConfig;\n};\n\nexport type OAuthKind = {\n spec: {\n identityProviders?: IdentityProvider[];\n tokenConfig?: {\n accessTokenMaxAgeSeconds: number;\n };\n templates?: {\n login: string;\n providerSelection: string;\n error: string;\n };\n };\n} & K8sResourceCommon;\n\nexport type ResourceAccessReviewRequest = {\n apiVersion: string;\n kind: string;\n namespace?: string;\n resourceAPIVersion: string;\n resourceAPIGroup: string;\n resource: string;\n verb: K8sVerb;\n};\n\nexport type ResourceAccessReviewResponse = {\n namespace?: string;\n users: string[];\n groups: string[];\n} & K8sResourceCommon;\n\nexport type UserInfo = {\n uid?: string;\n username?: string;\n groups?: string[];\n extra?: object;\n};\n\nexport type UserKind = {\n fullName?: string;\n identities: string[];\n} & K8sResourceCommon;\n\nexport type GroupKind = {\n users: string[];\n} & K8sResourceCommon;\n\n/**\n * @deprecated migrated to new type K8sModel, use K8sModel from dynamic-plugin-sdk over K8sKind\n */\nexport type K8sKind = K8sModel;\n\nexport type Cause = {\n field: string;\n message: string;\n reason: string;\n};\n\nexport type Status = {\n apiVersion: 'v1';\n kind: 'Status';\n details: {\n causes: Cause[];\n group: string;\n kind: string;\n };\n message: string;\n metadata: any;\n reason: string;\n status: string;\n};\n\nexport type SecretKind = {\n data?: { [key: string]: string };\n stringData?: { [key: string]: string };\n type?: string;\n} & K8sResourceCommon;\n\nexport type ServiceAccountKind = {\n automountServiceAccountToken?: boolean;\n imagePullSecrets?: { [key: string]: string };\n secrets?: SecretKind[] | { [key: string]: string };\n} & K8sResourceCommon;\n\nexport type ListKind<R extends K8sResourceCommon> = K8sResourceCommon & {\n items: R[];\n};\n\nexport type EventKind = {\n action?: string;\n count?: number;\n type?: string;\n involvedObject: EventInvolvedObject;\n message?: string;\n eventTime?: string;\n lastTimestamp?: string;\n firstTimestamp?: string;\n reason?: string;\n source: {\n component: string;\n host?: string;\n };\n series?: {\n count?: number;\n lastObservedTime?: string;\n state?: string;\n };\n} & K8sResourceCommon;\n\nexport type MachineHealthCondition = {\n type: string;\n status: string;\n timeout: string;\n};\n\nexport type MachineHealthCheckKind = K8sResourceCommon & {\n spec: {\n selector: Selector;\n unhealthyConditions: MachineHealthCondition[];\n };\n};\n\nexport type VolumeSnapshotKind = K8sResourceCommon & {\n status?: VolumeSnapshotStatus & {\n boundVolumeSnapshotContentName?: string;\n };\n spec: {\n source: {\n persistentVolumeClaimName?: string;\n volumeSnapshotContentName?: string;\n };\n volumeSnapshotClassName: string;\n };\n};\n\nexport type VolumeSnapshotContentKind = K8sResourceCommon & {\n status: VolumeSnapshotStatus & {\n snapshotHandle?: string;\n };\n spec: {\n volumeSnapshotRef: {\n name: string;\n namespace: string;\n };\n source: {\n volumeHandle?: string;\n snapshotHandle?: string;\n };\n volumeSnapshotClassName: string;\n driver: string;\n deletionPolicy: 'Delete' | 'Retain';\n };\n};\n\nexport type VolumeSnapshotStatus = {\n readyToUse: boolean;\n restoreSize?: number;\n error?: {\n message: string;\n time: string;\n };\n};\n\nexport type VolumeSnapshotClassKind = K8sResourceCommon & {\n deletionPolicy: string;\n driver: string;\n};\n\nexport type PersistentVolumeClaimKind = K8sResourceCommon & {\n spec: {\n accessModes: string[];\n resources: {\n requests: {\n storage: string;\n };\n };\n storageClassName: string;\n volumeMode?: string;\n /* Parameters in a cloned PVC */\n dataSource?: {\n name: string;\n kind: string;\n apiGroup: string;\n };\n /**/\n };\n status?: {\n phase: string;\n };\n};\n\nexport type NetworkPolicyKind = K8sResourceCommon & {\n spec: {\n podSelector?: Selector;\n ingress?: {\n from?: NetworkPolicyPeer[];\n ports?: NetworkPolicyPort[];\n }[];\n egress?: {\n to?: NetworkPolicyPeer[];\n ports?: NetworkPolicyPort[];\n }[];\n policyTypes?: string[];\n };\n};\n\nexport type NetworkPolicyPeer = {\n podSelector?: Selector;\n namespaceSelector?: Selector;\n ipBlock?: {\n cidr: string;\n except?: string[];\n };\n};\n\nexport type NetworkPolicyPort = {\n port?: string | number;\n protocol?: string;\n};\n\nexport type ConsolePluginKind = K8sResourceCommon & {\n spec: {\n displayName: string;\n backend: {\n service: {\n basePath?: string;\n name: string;\n namespace: string;\n port: number;\n };\n type: 'Service';\n };\n i18n?: {\n loadType: 'Preload' | 'Lazy' | '';\n };\n proxy?: ConsolePluginProxy[];\n };\n};\n\nexport type ConsolePluginProxy = {\n alias: string;\n authorization?: 'UserToken' | 'None';\n caCertificate?: string;\n endpoint: {\n service: {\n name: string;\n namespace: string;\n port: string;\n };\n type: 'Service';\n };\n};\n\nexport type K8sPodControllerKind = {\n spec?: {\n replicas?: number;\n template?: PodTemplate;\n jobTemplate?: {\n spec?: {\n template: PodTemplate;\n };\n };\n };\n} & K8sResourceCommon;\n\nexport type DaemonSetKind = {\n spec: {\n minReadySeconds?: number;\n revisionHistoryLimit?: number;\n selector: Selector;\n template: PodTemplate;\n updateStrategy?: DeploymentUpdateStrategy;\n };\n status?: {\n collisionCount?: number;\n conditions?: DeploymentCondition[];\n currentNumberScheduled: number;\n desiredNumberScheduled: number;\n numberAvailable?: number;\n numberMisscheduled: number;\n numberReady: number;\n numberUnavailable: number;\n observedGeneration: number;\n updatedNumberScheduled: number;\n };\n} & K8sResourceCommon;\n\n/**\n * Not a real resource kind. A shared resource kind between resources that control pods.\n * eg. Deployment, Statefulset, ReplicaSet, etc..\n */\nexport type ReplicationControllerKind = {\n spec?: {\n minReadySeconds?: number;\n replicas?: number;\n selector: Selector;\n template: PodTemplate;\n };\n status?: {\n availableReplicas?: number;\n conditions?: DeploymentCondition[];\n fullyLabeledReplicas?: number;\n observedGeneration?: number;\n readyReplicas?: number;\n replicas: number;\n };\n} & K8sResourceCommon;\n\nexport type ReplicaSetKind = {} & ReplicationControllerKind;\n\ntype EndpointSlice = {\n kind?: string;\n name?: string;\n namespace?: string;\n uid?: string;\n};\n\nexport type EndpointSliceKind = {\n endpoints?: EndpointSlice[];\n} & K8sResourceCommon;\n","import * as React from 'react';\nimport ErrorBoundary from '../error-boundary';\nimport ErrorBoundaryFallbackPage from './ErrorBoundaryFallbackPage';\n\n/**\n * Mount an error boundary that will render a full page error stack trace.\n * @see ErrorBoundaryInline for a more inline option.\n */\nconst ErrorBoundaryPage: React.FC = (props) => {\n return <ErrorBoundary {...props} FallbackComponent={ErrorBoundaryFallbackPage} />;\n};\n\nexport default ErrorBoundaryPage;\n","import * as React from 'react';\nimport ErrorBoundary from '../error-boundary';\nimport ErrorBoundaryFallbackInline from './ErrorBoundaryFallbackInline';\n\ntype ErrorBoundaryInlineProps = {\n wrapper?: React.ComponentType<{ children: React.ReactNode }>;\n};\n\n/**\n * Mount an error boundary that will render an inline error with modal stack trace.\n * @see ErrorBoundaryPage if you do not need an inline fallback.\n */\nconst ErrorBoundaryInline: React.FC<ErrorBoundaryInlineProps> = ({\n wrapper: Wrapper,\n ...props\n}) => {\n let fallback = ErrorBoundaryFallbackInline;\n if (Wrapper) {\n fallback = (innerProps) => (\n <Wrapper>\n <ErrorBoundaryFallbackInline {...innerProps} />\n </Wrapper>\n );\n }\n\n return <ErrorBoundary {...props} FallbackComponent={fallback} />;\n};\n\nexport default ErrorBoundaryInline;\n","import * as React from 'react';\nimport { ModelBadge } from '@console/dynamic-plugin-sdk/src/extensions/resource-metadata';\nimport DevPreviewBadge from './DevPreviewBadge';\nimport { InlineDevPreviewBadge, InlineTechPreviewBadge } from './InlineBadge';\nimport TechPreviewBadge from './TechPreviewBadge';\n\nexport enum BadgeType {\n DEV = 'Dev Preview',\n TECH = 'Tech Preview',\n}\n\nexport const getBadgeFromType = (badge: ModelBadge | BadgeType): React.ReactElement => {\n switch (badge) {\n case ModelBadge.DEV:\n case BadgeType.DEV:\n return <DevPreviewBadge />;\n case ModelBadge.TECH:\n case BadgeType.TECH:\n return <TechPreviewBadge />;\n default:\n return null;\n }\n};\n\nexport const getInlineBadgeFromType = (badge: ModelBadge | BadgeType): React.ReactElement => {\n switch (badge) {\n case ModelBadge.DEV:\n case BadgeType.DEV:\n return <InlineDevPreviewBadge />;\n case ModelBadge.TECH:\n case BadgeType.TECH:\n return <InlineTechPreviewBadge />;\n default:\n return null;\n }\n};\n","import * as React from 'react';\nimport { Badge } from '@patternfly/react-core';\nimport { K8sKind, kindToAbbr } from '@console/internal/module/k8s';\nimport './EmptyStateResourceBadge.scss';\n\ntype EmptyStateResourceBadgeProps = {\n model: K8sKind;\n};\n\nconst EmptyStateResourceBadge: React.FC<EmptyStateResourceBadgeProps> = ({ model }) => (\n <div className=\"ocs-empty-state-resource-badge\">\n <Badge className=\"ocs-empty-state-resource-badge--badge\" isRead>\n {model.abbr || kindToAbbr(model.kind)}\n </Badge>\n </div>\n);\n\nexport default EmptyStateResourceBadge;\n","export { default as ClampedText } from './ClampedText';\n","import * as React from 'react';\nimport { Popover } from '@patternfly/react-core';\nimport Measure from 'react-measure';\nimport { useDebounceCallback } from '../../hooks';\nimport './ClampedText.scss';\n\ntype ClampedTextProps = {\n children: React.ReactNode;\n lineClamp?: number;\n};\n\nconst ClampedText: React.FC<ClampedTextProps> = ({ children, lineClamp = 1 }) => {\n const [isContentClamped, setContentClamped] = React.useState<boolean>(false);\n const debouncedSetContentClamped = useDebounceCallback(\n ({ scroll: { height: scrollHeight }, offset: { height: offsetHeight } }) =>\n setContentClamped(scrollHeight > offsetHeight),\n );\n const style = { '--ocs-clamped-text--line-clamp': lineClamp } as React.CSSProperties;\n\n return (\n <Measure offset scroll onResize={debouncedSetContentClamped}>\n {({ measureRef }) => (\n <div ref={measureRef} className=\"ocs-clamped-text\" style={style}>\n {isContentClamped ? (\n <Popover bodyContent={children}>\n <div tabIndex={0} role=\"button\">\n {children}\n </div>\n </Popover>\n ) : (\n <>{children}</>\n )}\n </div>\n )}\n </Measure>\n );\n};\n\nexport default ClampedText;\n","import * as React from 'react';\nimport { isModalOpen } from '@console/internal/components/modals';\nimport { KEYBOARD_SHORTCUTS } from '../constants/common';\n\n/**\n * Use this hook for components that require visibility only\n * when the user is actively interacting with the document.\n */\n\nexport enum KeyEventModes {\n HIDE = 'HIDE',\n FOCUS = 'FOCUS',\n}\n\nconst textInputKeyHandler = {\n [KEYBOARD_SHORTCUTS.blurFilterInput]: KeyEventModes.HIDE,\n [KEYBOARD_SHORTCUTS.focusFilterInput]: KeyEventModes.FOCUS,\n};\n\nexport const useDocumentListener = <T extends HTMLElement>(\n keyEventMap: KeyEventMap = textInputKeyHandler,\n) => {\n const [visible, setVisible] = React.useState(true);\n const ref = React.useRef<T>(null);\n\n const handleEvent = (e) => {\n if (!ref?.current?.contains(e.target)) {\n setVisible(false);\n }\n };\n\n const handleKeyEvents = (e) => {\n // Don't steal focus from a modal open on top of the page.\n if (isModalOpen()) {\n return;\n }\n const { nodeName } = e.target;\n switch (keyEventMap[e.key]) {\n case KeyEventModes.HIDE:\n setVisible(false);\n ref.current.blur();\n break;\n case KeyEventModes.FOCUS:\n if (\n document.activeElement !== ref.current &&\n // Don't steal focus if the user types the focus shortcut in another text input.\n nodeName !== 'INPUT' &&\n nodeName !== 'TEXTAREA'\n ) {\n ref.current.focus();\n e.preventDefault();\n }\n break;\n default:\n break;\n }\n };\n\n React.useEffect(() => {\n document.addEventListener('click', handleEvent, true);\n document.addEventListener('keydown', handleKeyEvents, true);\n return () => {\n document.removeEventListener('click', handleEvent, true);\n document.removeEventListener('keydown', handleKeyEvents, true);\n };\n });\n\n return { visible, setVisible, ref };\n};\n\nexport type KeyEventMap = {\n [key: string]: KeyEventModes;\n};\n","import * as React from 'react';\n\ntype FullScreenAPI = {\n requestFullscreen: string;\n exitFullscreen: string;\n fullscreenElement: string;\n fullscreenEnabled: string;\n fullscreenchange: string;\n fullscreenerror: string;\n};\n\nconst spec: FullScreenAPI = {\n requestFullscreen: 'requestFullscreen',\n exitFullscreen: 'exitFullscreen',\n fullscreenElement: 'fullscreenElement',\n fullscreenEnabled: 'fullscreenEnabled',\n fullscreenchange: 'fullscreenchange',\n fullscreenerror: 'fullscreenerror',\n};\n\nconst moz: FullScreenAPI = {\n requestFullscreen: 'mozRequestFullscreen',\n exitFullscreen: 'mozExitFullscreen',\n fullscreenElement: 'mozFullscreenElement',\n fullscreenEnabled: 'mozFullscreenEnabled',\n fullscreenchange: 'mozfullscreenchange',\n fullscreenerror: 'mozfullscreenerror',\n};\n\nconst webkit: FullScreenAPI = {\n requestFullscreen: 'webkitRequestFullscreen',\n exitFullscreen: 'webkitExitFullscreen',\n fullscreenElement: 'webkitFullscreenElement',\n fullscreenEnabled: 'webkitFullscreenEnabled',\n fullscreenchange: 'webkitfullscreenchange',\n fullscreenerror: 'webkitfullscreenerror',\n};\n\nconst ms: FullScreenAPI = {\n requestFullscreen: 'msRequestFullscreen',\n exitFullscreen: 'msExitFullscreen',\n fullscreenElement: 'msFullscreenElement',\n fullscreenEnabled: 'msFullscreenEnabled',\n fullscreenchange: 'msfullscreenchange',\n fullscreenerror: 'msfullscreenerror',\n};\n\nconst allPrefixes: FullScreenAPI[] = [spec, moz, webkit, ms];\n\nconst nativeAPI: FullScreenAPI =\n (function (doc) {\n return allPrefixes.find((x: FullScreenAPI) => !!doc[x.fullscreenEnabled]);\n })(document) ?? spec;\n\nexport const useFullscreen = <T extends HTMLElement>(): [\n boolean,\n (node: T) => void,\n () => void,\n boolean,\n] => {\n const [isFullscreen, setIsFullscreen] = React.useState<boolean>(false);\n const fullscreenRef = React.useRef<boolean>(isFullscreen);\n fullscreenRef.current = isFullscreen;\n const elementRef = React.useRef<any>();\n\n const listener = React.useCallback((event) => {\n setIsFullscreen(document[nativeAPI.fullscreenElement] === event.target);\n }, []);\n\n const targetCallbackRef = React.useCallback(\n (node: T) => {\n if (document[nativeAPI.fullscreenEnabled]) {\n if (elementRef.current && elementRef.current !== node) {\n elementRef.current.removeEventListener(nativeAPI.fullscreenchange, listener);\n elementRef.current.removeEventListener(nativeAPI.fullscreenerror, listener);\n }\n if (node != null) {\n elementRef.current = node;\n node.addEventListener(nativeAPI.fullscreenchange, listener);\n node.addEventListener(nativeAPI.fullscreenerror, listener);\n }\n }\n },\n [listener],\n );\n\n const fullscreenToggleCallback = React.useCallback(() => {\n if (elementRef.current && document[nativeAPI.fullscreenEnabled]) {\n fullscreenRef.current\n ? document[nativeAPI.exitFullscreen]()\n : elementRef.current[nativeAPI.requestFullscreen]();\n }\n }, []);\n\n return [\n isFullscreen,\n targetCallbackRef,\n fullscreenToggleCallback,\n document[nativeAPI.fullscreenEnabled],\n ];\n};\n","import * as React from 'react';\n\nexport enum ScrollDirection {\n scrollingUp = 'scrolling-up',\n scrollingDown = 'scrolling-down',\n scrolledToBottom = 'scrolled-to-bottom',\n scrolledToTop = 'scrolled-to-top',\n}\n\nexport const getScrollDirection = (\n prevScrollTop: number,\n currentScrollTop: number,\n scrollHeight: number,\n clientHeight: number,\n) => {\n let direction;\n if (scrollHeight - currentScrollTop === clientHeight) {\n direction = ScrollDirection.scrolledToBottom;\n } else if (currentScrollTop === 0) {\n direction = ScrollDirection.scrolledToTop;\n } else if (prevScrollTop > currentScrollTop) {\n direction = ScrollDirection.scrollingUp;\n } else if (prevScrollTop < currentScrollTop) {\n direction = ScrollDirection.scrollingDown;\n }\n return direction;\n};\n\nexport const useScrollDirection = (): [ScrollDirection, (event) => void] => {\n const scrollPosition = React.useRef<number>(null);\n const [scrollDirection, setScrollDirection] = React.useState<ScrollDirection>(null);\n const handleScroll = React.useCallback(\n (event) => {\n const { scrollHeight, scrollTop, clientHeight } = event.target;\n if (scrollPosition.current !== null) {\n const direction = getScrollDirection(\n scrollPosition.current,\n scrollTop,\n scrollHeight,\n clientHeight,\n );\n if (direction && direction !== scrollDirection) setScrollDirection(direction);\n }\n scrollPosition.current = scrollTop;\n },\n [scrollDirection],\n );\n\n return [scrollDirection, handleScroll];\n};\n","import * as React from 'react';\nimport { useResizeObserver } from './useResizeObserver';\n\nexport enum Shadows {\n none = 'none',\n both = 'both',\n top = 'top',\n bottom = 'bottom',\n}\n\nexport const useScrollShadows = (node: HTMLElement): Shadows => {\n const [shadows, setShadows] = React.useState(Shadows.none);\n const computeShadows = React.useCallback(() => {\n if (node) {\n const { scrollTop, clientHeight, scrollHeight } = node;\n const top = scrollTop !== 0;\n const bottom = scrollTop + clientHeight < scrollHeight;\n if (top && bottom) {\n setShadows(Shadows.both);\n } else if (top) {\n setShadows(Shadows.top);\n } else if (bottom) {\n setShadows(Shadows.bottom);\n } else {\n setShadows(Shadows.none);\n }\n }\n }, [node]);\n // recompute when the scroll container changes in size\n useResizeObserver(computeShadows, node);\n React.useEffect(() => {\n if (node) {\n // compute initial shadows\n computeShadows();\n // listen for scroll events\n node.addEventListener('scroll', computeShadows);\n }\n return () => {\n if (node) {\n node.removeEventListener('scroll', computeShadows);\n }\n };\n }, [node, computeShadows]);\n return shadows;\n};\n","import * as React from 'react';\nimport { AsyncComponent, AsyncComponentProps } from '@console/internal/components/utils';\nimport { OverviewTabSection, isOverviewTabSection, useExtensions } from '@console/plugin-sdk';\nimport { OverviewItem } from '../types';\n\nexport const getResourceTabSectionComp = (t: OverviewTabSection): React.FC<AsyncComponentProps> => (\n props: AsyncComponentProps,\n) => React.createElement(AsyncComponent, { ...props, loader: t.properties.loader });\n\nexport const usePluginsOverviewTabSection = (\n item: OverviewItem,\n): { Component: React.FC<AsyncComponentProps>; key: string }[] => {\n const tabSections = useExtensions<OverviewTabSection>(isOverviewTabSection);\n return React.useMemo(\n () =>\n tabSections\n .filter((section) => item[section.properties.key])\n .map((section: OverviewTabSection) => ({\n Component: getResourceTabSectionComp(section),\n key: section.properties.key,\n })),\n // `item` is complex object but we only use the presence of keys as a dependency\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(Object.keys(item).sort())],\n );\n};\n","import { K8sKind, K8sModel } from '@console/internal/module/k8s';\n\nexport const HelmChartRepositoryModel: K8sKind = {\n apiGroup: 'helm.openshift.io',\n apiVersion: 'v1beta1',\n kind: 'HelmChartRepository',\n id: 'helmchartrepository',\n plural: 'helmchartrepositories',\n label: 'Helm Chart Repository',\n labelPlural: 'Helm Chart Repositories',\n abbr: 'HCR',\n namespaced: false,\n crd: true,\n};\n\nexport const ProjectHelmChartRepositoryModel: K8sModel = {\n apiGroup: 'helm.openshift.io',\n apiVersion: 'v1beta1',\n kind: 'ProjectHelmChartRepository',\n id: 'projecthelmchartrepository',\n plural: 'projecthelmchartrepositories',\n label: 'Project Helm Chart Repository',\n labelPlural: 'Project Helm Chart Repositories',\n abbr: 'PHCR',\n namespaced: true,\n crd: true,\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport * as classNames from 'classnames';\nimport * as TagsInput from 'react-tagsinput';\nimport { Label as PfLabel } from '@patternfly/react-core';\n\nimport { split, selectorFromString } from '../../module/k8s/selector';\nimport * as k8sSelectorRequirement from '../../module/k8s/selector-requirement';\nimport { selectorToString } from '@console/dynamic-plugin-sdk/src/utils/k8s';\n\n// Helpers for cleaning up tags by running them through the selector parser\nconst cleanSelectorStr = (tag) => selectorToString(selectorFromString(tag));\nconst cleanTags = (tags) => split(cleanSelectorStr(tags.join(',')));\n\nexport class SelectorInput extends React.Component {\n constructor(props) {\n super(props);\n this.isBasic = !!_.get(this.props.options, 'basic');\n this.setRef = (ref) => (this.ref_ = ref);\n this.state = {\n inputValue: '',\n isInputValid: true,\n tags: this.props.tags,\n };\n }\n\n componentDidUpdate(prevProps) {\n if (!_.isEqual(prevProps.tags, this.props.tags)) {\n this.setState({ tags: this.props.tags });\n }\n }\n static arrayify(obj) {\n return _.map(obj, (v, k) => (v ? `${k}=${v}` : k));\n }\n\n static objectify(arr) {\n const result = {};\n _.each(arr, (item) => {\n const [key, value = null] = item.split('=');\n result[key] = value;\n });\n return result;\n }\n\n static arrayObjectsToArrayStrings(obj) {\n return _.map(obj, (v) => `${v.key} ${v.operator.toLowerCase()} (${v.values.join(',')})`);\n }\n\n static arrayToArrayOfObjects(arr) {\n const result = [];\n for (const item of arr) {\n if (item.includes('(')) {\n const [key, operator, values] = item.split(' ');\n result.push({\n key,\n operator: _.capitalize(operator),\n // eslint-disable-next-line no-useless-escape\n values: values.replace(/[\\(\\)]/g, '').split(','),\n });\n }\n }\n return result;\n }\n focus() {\n this.ref_ && this.ref_.focus();\n }\n\n isTagValid(tag) {\n const requirement = k8sSelectorRequirement.requirementFromString(tag);\n return !!(requirement && (!this.isBasic || requirement.operator === 'Equals'));\n }\n\n handleInputChange(e) {\n // We track the input field value in state so we can retain the input value when an invalid tag is entered.\n // Otherwise, the default behaviour of TagsInput is to clear the input field.\n const inputValue = e.target.value;\n\n // If the user deletes an existing inputValue, set isInputValid back to true\n if (inputValue === '') {\n this.setState({ inputValue, isInputValid: true });\n return;\n }\n\n this.setState({ inputValue, isInputValid: this.isTagValid(inputValue) });\n }\n\n handleChange(tags, changed) {\n // The way we use TagsInput, there should only ever be one new tag in changed\n const newTag = changed[0];\n\n if (!this.isTagValid(newTag)) {\n this.setState({ isInputValid: false });\n return;\n }\n\n // Clean up the new tag by running it through the selector parser\n const cleanNewTag = cleanSelectorStr(newTag);\n\n // Is the new tag a duplicate of an already existing tag?\n // Note that TagsInput accepts an onlyUnique property, but we handle this logic ourselves so that we can set a\n // custom error class\n if (_.filter(tags, (tag) => tag === cleanNewTag).length > 1) {\n this.setState({ isInputValid: false });\n return;\n }\n\n const newTags = cleanTags(tags);\n this.setState({ inputValue: '', isInputValid: true, tags: newTags });\n this.props.onChange(newTags);\n }\n\n render() {\n const { inputValue, isInputValid, tags } = this.state;\n\n // Keys that add tags: Enter\n const addKeys = [13];\n\n // Backspace deletes tags, but not if there is text being edited in the input field\n const removeKeys = inputValue.length ? [] : [8];\n\n const inputProps = {\n autoFocus: this.props.autoFocus,\n className: classNames('input', { 'invalid-tag': !isInputValid }),\n onChange: this.handleInputChange.bind(this),\n placeholder: _.isEmpty(tags) ? this.props.placeholder || 'app=frontend' : '',\n spellCheck: 'false',\n value: inputValue,\n id: 'tags-input',\n ['data-test']: 'tags-input',\n ...(this.props.inputProps || {}),\n };\n\n const renderTag = ({ tag, key, onRemove, getTagDisplayValue }) => {\n return (\n <PfLabel\n className={classNames('co-label tag-item-content', this.props.labelClassName)}\n key={key}\n onClose={() => onRemove(key)}\n isTruncated\n data-test={`label=${key}`}\n >\n {getTagDisplayValue(tag)}\n </PfLabel>\n );\n };\n\n return (\n <div className=\"pf-v5-c-form-control\">\n <tags-input>\n <TagsInput\n ref={this.setRef}\n className=\"tags\"\n value={tags}\n addKeys={addKeys}\n removeKeys={removeKeys}\n inputProps={inputProps}\n renderTag={renderTag}\n onChange={this.handleChange.bind(this)}\n addOnBlur\n />\n </tags-input>\n </div>\n );\n }\n}\n","import * as React from 'react';\n// FIXME upgrading redux types is causing many errors at this time\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useSelector } from 'react-redux';\nimport { Base64 } from 'js-base64';\nimport * as _ from 'lodash-es';\nimport { Trans, useTranslation } from 'react-i18next';\nimport {\n Alert,\n AlertActionLink,\n Button,\n Checkbox,\n Divider,\n Dropdown,\n DropdownItem,\n DropdownGroup,\n Tooltip,\n MenuToggleElement,\n MenuToggle,\n DropdownList,\n} from '@patternfly/react-core';\nimport {\n Select as SelectDeprecated,\n SelectOption as SelectOptionDeprecated,\n SelectVariant as SelectVariantDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { LogViewer, LogViewerSearch } from '@patternfly/react-log-viewer';\nimport {\n CompressIcon,\n EllipsisVIcon,\n ExpandIcon,\n DownloadIcon,\n OutlinedWindowRestoreIcon,\n OutlinedPlayCircleIcon,\n} from '@patternfly/react-icons';\nimport * as classNames from 'classnames';\nimport {\n FLAGS,\n LOG_WRAP_LINES_USERSETTINGS_KEY,\n SHOW_FULL_LOG_USERSETTINGS_KEY,\n} from '@console/shared/src/constants';\nimport { useUserSettings } from '@console/shared';\nimport { LoadingInline, TogglePlay, ExternalLink } from './';\nimport { modelFor, resourceURL } from '../../module/k8s';\nimport { WSFactory } from '../../module/ws-factory';\nimport * as screenfull from 'screenfull';\nimport { RootState } from '@console/internal/redux';\nimport { k8sGet, k8sList, K8sResourceKind, PodKind } from '@console/internal/module/k8s';\nimport { ConsoleExternalLogLinkModel, ProjectModel } from '@console/internal/models';\nimport { useFlag, useIsMobile } from '@console/shared/src/hooks';\nimport { usePrevious } from '@console/shared/src/hooks/previous';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { resourcePath } from './resource-link';\nimport { isWindowsPod } from '../../module/k8s/pods';\nimport { getImpersonate } from '@console/dynamic-plugin-sdk';\nimport useToggleLineBuffer from './useToggleLineBuffer';\n\nexport const STREAM_EOF = 'eof';\nexport const STREAM_LOADING = 'loading';\nexport const STREAM_PAUSED = 'paused';\nexport const STREAM_ACTIVE = 'streaming';\n\nexport const LOG_SOURCE_RESTARTING = 'restarting';\nexport const LOG_SOURCE_RUNNING = 'running';\nexport const LOG_SOURCE_TERMINATED = 'terminated';\nexport const LOG_SOURCE_WAITING = 'waiting';\n\nconst LOG_TYPE_CURRENT = 'current';\nconst LOG_TYPE_PREVIOUS = 'previous';\n\nconst DEFAULT_BUFFER_SIZE = 1000;\n\n// Messages to display for corresponding log status\nconst streamStatusMessages = {\n // t('public~Log stream ended.')\n [STREAM_EOF]: 'public~Log stream ended.',\n // t('public~Loading log...')\n [STREAM_LOADING]: 'public~Loading log...',\n // t('public~Log stream paused.')\n [STREAM_PAUSED]: 'public~Log stream paused.',\n // t('public~Log streaming...')\n [STREAM_ACTIVE]: 'public~Log streaming...',\n};\n\nconst replaceVariables = (template: string, values: any): string => {\n return _.reduce(\n values,\n (result, value, name) => {\n // Replace all occurrences of template expressions like \"${name}\" with the URL-encoded value.\n // eslint-disable-next-line prefer-template\n const pattern = _.escapeRegExp('${' + name + '}');\n return result.replace(new RegExp(pattern, 'g'), encodeURIComponent(value));\n },\n template,\n );\n};\n\n// Build a log API url for a given resource\nconst getResourceLogURL = (\n resource: K8sResourceKind,\n containerName?: string,\n tailLines?: number,\n follow?: boolean,\n logType?: LogTypeStatus,\n): string => {\n const previous = logType === LOG_TYPE_PREVIOUS;\n return resourceURL(modelFor(resource.kind), {\n name: resource.metadata.name,\n ns: resource.metadata.namespace,\n path: 'log',\n queryParams: {\n container: containerName || '',\n ...(tailLines && { tailLines: `${tailLines}` }),\n ...(follow && { follow: `${follow}` }),\n ...(previous && { previous: `${previous}` }),\n },\n });\n};\n\nconst HeaderBanner = ({ lines }) => {\n const { t } = useTranslation();\n const count = lines[lines.length - 1] || lines.length === 0 ? lines.length : lines.length - 1;\n const headerText = t('public~{{count}} line', { count });\n return <>{headerText}</>;\n};\n\nconst FooterButton = ({ setStatus, linesBehind, className }) => {\n const { t } = useTranslation();\n const resumeText =\n linesBehind > 0\n ? t('public~Resume stream and show {{count}} new line', { count: linesBehind })\n : t('public~Resume stream');\n const handleClick = () => {\n setStatus(STREAM_ACTIVE);\n };\n return (\n <Button className={className} onClick={handleClick} isBlock>\n <OutlinedPlayCircleIcon />\n {resumeText}\n </Button>\n );\n};\nconst showDebugAction = (pod: PodKind, containerName: string) => {\n if (!containerName) {\n return false;\n }\n const containerStatus = pod?.status?.containerStatuses?.find((c) => c.name === containerName);\n if (pod?.metadata?.annotations?.['openshift.io/build.name']) {\n return false;\n }\n if (pod?.metadata?.annotations?.['debug.openshift.io/source-container']) {\n return false;\n }\n\n const waitingReason = containerStatus?.state?.waiting?.reason;\n if (waitingReason === 'ImagePullBackOff' || waitingReason === 'ErrImagePull') {\n return false;\n }\n\n return !containerStatus?.state?.running || !containerStatus?.ready;\n};\n\n// Component for log stream controls\nexport const LogControls: React.FC<LogControlsProps> = ({\n dropdown,\n toggleFullscreen,\n currentLogURL,\n isFullscreen,\n status,\n toggleStreaming,\n resource,\n containerName,\n podLogLinks,\n namespaceUID,\n toggleWrapLines,\n isWrapLines,\n changeLogType,\n hasPreviousLog,\n logType,\n showLogTypeSelect,\n isShowFullLog,\n toggleShowFullLog,\n}) => {\n const { t } = useTranslation();\n const [isLogTypeOpen, setLogTypeOpen] = React.useState(false);\n const isMobile = useIsMobile();\n const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);\n\n const onDropdownToggleClick = () => {\n setIsDropdownOpen(!isDropdownOpen);\n };\n\n const onDropdownSelect = () => {\n setIsDropdownOpen(false);\n };\n\n const logTypes: Array<LogType> = [\n { type: LOG_TYPE_CURRENT, text: t('public~Current log') },\n { type: LOG_TYPE_PREVIOUS, text: t('public~Previous log') },\n ];\n\n const logOption = (log: LogType) => {\n return (\n <SelectOptionDeprecated key={log.type} value={log.type}>\n {log.text}\n </SelectOptionDeprecated>\n );\n };\n\n const showStatus = () => {\n if (logType !== LOG_TYPE_PREVIOUS) {\n return (\n <>\n {status === STREAM_LOADING && (\n <>\n <LoadingInline />\n \n </>\n )}\n {[STREAM_ACTIVE, STREAM_PAUSED].includes(status) && (\n <TogglePlay active={status === STREAM_ACTIVE} onClick={toggleStreaming} />\n )}\n {t(streamStatusMessages[status])}\n </>\n );\n }\n return <>{t(streamStatusMessages[STREAM_EOF])} </>;\n };\n\n const logTypeSelect = (isDisabled: boolean) => {\n if (!showLogTypeSelect) {\n return null;\n }\n\n const select = (\n <span>\n <span id=\"logTypeSelect\" hidden>\n Log type\n </span>\n <SelectDeprecated\n variant={SelectVariantDeprecated.single}\n onToggle={(_event, isOpen: boolean) => {\n setLogTypeOpen(isOpen);\n }}\n onSelect={(event: React.MouseEvent | React.ChangeEvent, value: LogTypeStatus) => {\n changeLogType(value);\n setLogTypeOpen(false);\n }}\n selections={logType}\n isOpen={isLogTypeOpen}\n isDisabled={isDisabled}\n aria-labelledby=\"logTypeSelect\"\n >\n {logTypes.map((log) => logOption(log))}\n </SelectDeprecated>\n </span>\n );\n return hasPreviousLog ? (\n select\n ) : (\n <Tooltip content={t('public~Only the current log is available for this container.')}>\n {select}\n </Tooltip>\n );\n };\n\n const renderPodLogLinks = () =>\n _.map(_.sortBy(podLogLinks, 'metadata.name'), (link) => {\n const namespace = resource.metadata.namespace;\n const namespaceFilter = link.spec.namespaceFilter;\n if (namespaceFilter) {\n try {\n const namespaceRegExp = new RegExp(namespaceFilter, 'g');\n if (namespace.search(namespaceRegExp)) {\n return null;\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('invalid log link regex', namespaceFilter, e);\n return null;\n }\n }\n const url = replaceVariables(link.spec.hrefTemplate, {\n resourceName: resource.metadata.name,\n resourceUID: resource.metadata.uid,\n containerName,\n resourceNamespace: namespace,\n resourceNamespaceUID: namespaceUID,\n podLabels: JSON.stringify(resource.metadata.labels),\n });\n\n return isMobile ? (\n <DropdownItem to={url} isExternalLink key={link.metadata.uid}>\n {link.spec.text}\n </DropdownItem>\n ) : (\n <React.Fragment key={link.metadata.uid}>\n <ExternalLink href={url} text={link.spec.text} dataTestID={link.metadata.name} />\n <Divider\n orientation={{\n default: 'vertical',\n }}\n />\n </React.Fragment>\n );\n });\n\n const label = t('public~Debug container');\n\n const fullLog = (\n <div>\n <Tooltip\n content={t('public~Select to view the entire log. Default view is the last 1,000 lines.')}\n >\n <Checkbox\n label={t('public~Show full log')}\n id=\"showFullLog\"\n data-test=\"show-full-log\"\n isChecked={isShowFullLog}\n data-checked-state={isShowFullLog}\n onChange={(_event, checked: boolean) => {\n toggleShowFullLog(checked);\n }}\n />\n </Tooltip>\n </div>\n );\n\n const wrapLines = (\n <Checkbox\n label={t('public~Wrap lines')}\n id=\"wrapLogLines\"\n isChecked={isWrapLines}\n data-checked-state={isWrapLines}\n onChange={(_event, checked: boolean) => {\n toggleWrapLines(checked);\n }}\n />\n );\n\n const raw = (\n <>\n <OutlinedWindowRestoreIcon className=\"co-icon-space-r\" />\n {t('public~Raw')}\n </>\n );\n\n const download = (\n <>\n <DownloadIcon className=\"co-icon-space-r\" />\n {t('public~Download')}\n </>\n );\n\n const fullscreen = isFullscreen ? (\n <>\n <CompressIcon className=\"co-icon-space-r\" />\n {t('public~Collapse')}\n </>\n ) : (\n <>\n <ExpandIcon className=\"co-icon-space-r\" />\n {t('public~Expand')}\n </>\n );\n\n return (\n <div className=\"co-toolbar\">\n <div\n className={classNames('co-toolbar__group co-toolbar__group--left', {\n 'co-toolbar__group--alongside-kebab': isMobile,\n })}\n >\n <div className=\"co-toolbar__item\">{showStatus()}</div>\n {dropdown && <div className=\"co-toolbar__item\">{dropdown}</div>}\n <div className=\"co-toolbar__item\">{logTypeSelect(!hasPreviousLog)}</div>\n <div className=\"co-toolbar__item\">\n <LogViewerSearch\n onFocus={() => {\n if (status === STREAM_ACTIVE) {\n toggleStreaming();\n }\n }}\n placeholder=\"Search\"\n minSearchChars={0}\n />\n </div>\n {showDebugAction(resource, containerName) && !isWindowsPod(resource) && (\n <Link\n to={`${resourcePath(\n 'Pod',\n resource.metadata.name,\n resource.metadata.namespace,\n )}/containers/${containerName}/debug`}\n data-test=\"debug-container-link\"\n >\n {label}\n </Link>\n )}\n {showDebugAction(resource, containerName) && isWindowsPod(resource) && (\n <Tooltip\n content={t(\n 'public~Debug in terminal is not currently available for windows containers.',\n )}\n >\n <span className=\"text-muted\">{label}</span>\n </Tooltip>\n )}\n </div>\n <div\n className={classNames(\n 'co-toolbar__group',\n isMobile ? 'co-toolbar__group--kebab' : 'co-toolbar__group--right',\n )}\n data-test=\"log-links\"\n >\n {isMobile ? (\n <Dropdown\n isOpen={isDropdownOpen}\n onSelect={onDropdownSelect}\n onOpenChange={(isOpen: boolean) => setIsDropdownOpen(isOpen)}\n toggle={(toggleRef: React.Ref<MenuToggleElement>) => (\n <MenuToggle\n ref={toggleRef}\n onClick={onDropdownToggleClick}\n isExpanded={isDropdownOpen}\n variant=\"plain\"\n className=\"pf-v5-u-mt-xs\"\n aria-label={t('public~Dropdown toggle')}\n >\n <EllipsisVIcon />\n </MenuToggle>\n )}\n shouldFocusToggleOnSelect\n popperProps={{\n position: 'right',\n }}\n >\n <DropdownGroup label={t('public~Log actions')}>\n <DropdownList>\n {!_.isEmpty(podLogLinks) && renderPodLogLinks()}\n <DropdownItem\n onClick={(e) => {\n e.preventDefault();\n toggleShowFullLog(!isShowFullLog);\n }}\n >\n {fullLog}\n </DropdownItem>\n <DropdownItem\n onClick={(e) => {\n e.preventDefault();\n toggleWrapLines(!isWrapLines);\n }}\n >\n {wrapLines}\n </DropdownItem>\n <DropdownItem to={currentLogURL} isExternalLink>\n {raw}\n </DropdownItem>\n <DropdownItem\n to={currentLogURL}\n isExternalLink\n download={`${resource.metadata.name}-${containerName}.log`}\n >\n {download}\n </DropdownItem>\n {screenfull.enabled && (\n <DropdownItem onClick={toggleFullscreen}>{fullscreen}</DropdownItem>\n )}\n </DropdownList>\n </DropdownGroup>\n </Dropdown>\n ) : (\n <div className=\"pf-v5-l-flex\">\n {!_.isEmpty(podLogLinks) && renderPodLogLinks()}\n <div>{fullLog}</div>\n <Divider\n orientation={{\n default: 'vertical',\n }}\n />\n {wrapLines}\n <Divider\n orientation={{\n default: 'vertical',\n }}\n />\n <a href={currentLogURL} target=\"_blank\" rel=\"noopener noreferrer\">\n {raw}\n </a>\n <Divider\n orientation={{\n default: 'vertical',\n }}\n />\n <a href={currentLogURL} download={`${resource.metadata.name}-${containerName}.log`}>\n {download}\n </a>\n {screenfull.enabled && (\n <>\n <Divider\n orientation={{\n default: 'vertical',\n }}\n />\n <Button variant=\"link\" isInline onClick={toggleFullscreen}>\n {fullscreen}\n </Button>\n </>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\n// Resource agnostic log component\nexport const ResourceLog: React.FC<ResourceLogProps> = ({\n bufferSize = DEFAULT_BUFFER_SIZE,\n containerName,\n dropdown,\n resource,\n resourceStatus,\n}) => {\n const { t } = useTranslation();\n const [showFullLog, setShowFullLog] = useUserSettings<boolean>(\n SHOW_FULL_LOG_USERSETTINGS_KEY,\n false,\n true,\n );\n const [showFullLogCheckbox, setShowFullLogCheckbox] = React.useState(showFullLog);\n const buffer = useToggleLineBuffer(showFullLogCheckbox ? null : bufferSize);\n const ws = React.useRef<any>(); // TODO Make this a hook\n const resourceLogRef = React.useRef();\n const logViewerRef = React.useRef(null);\n const externalLogLinkFlag = useFlag(FLAGS.CONSOLE_EXTERNAL_LOG_LINK);\n const [error, setError] = React.useState(false);\n const [hasTruncated, setHasTruncated] = React.useState(false);\n const [lines, setLines] = React.useState([]);\n const [linesBehind, setLinesBehind] = React.useState(0);\n const [totalLineCount, setTotalLineCount] = React.useState(0);\n const [stale, setStale] = React.useState(false);\n const [status, setStatus] = React.useState(STREAM_LOADING);\n const [isFullscreen, setIsFullscreen] = React.useState(false);\n const [namespaceUID, setNamespaceUID] = React.useState('');\n const [podLogLinks, setPodLogLinks] = React.useState();\n const [content, setContent] = React.useState('');\n\n const [logType, setLogType] = React.useState<LogTypeStatus>(LOG_TYPE_CURRENT);\n const [hasPreviousLogs, setPreviousLogs] = React.useState(false);\n\n const previousResourceStatus = usePrevious(resourceStatus);\n const previousTotalLineCount = usePrevious(totalLineCount);\n const linkURL = getResourceLogURL(resource, containerName, null, false, logType);\n const watchURL = getResourceLogURL(resource, containerName, null, true, logType);\n const imp = useSelector((state: RootState) => getImpersonate(state));\n const subprotocols = React.useMemo(() => ['base64.binary.k8s.io', ...(imp?.subprotocols ?? [])], [\n imp,\n ]);\n const [wrapLines, setWrapLines] = useUserSettings<boolean>(\n LOG_WRAP_LINES_USERSETTINGS_KEY,\n false,\n true,\n );\n const hasWrapAnnotation =\n resource?.metadata?.annotations?.['console.openshift.io/wrap-log-lines'] === 'true';\n\n const [wrapLinesCheckbox, setWrapLinesCheckbox] = React.useState(wrapLines || hasWrapAnnotation);\n const firstRender = React.useRef(true);\n const handleShowFullLogCheckbox = () => setShowFullLogCheckbox(!showFullLogCheckbox);\n\n React.useEffect(() => {\n if (firstRender.current) {\n firstRender.current = false;\n return;\n }\n\n setWrapLines(wrapLinesCheckbox);\n setShowFullLog(showFullLogCheckbox);\n }, [wrapLinesCheckbox, showFullLogCheckbox, setWrapLines, setShowFullLog]);\n\n const timeoutIdRef = React.useRef(null);\n const countRef = React.useRef(0);\n\n React.useEffect(() => {\n if ((status === STREAM_ACTIVE || status === STREAM_EOF) && lines.length > 0) {\n setContent(lines.join('\\n'));\n // setTimeout here to wait until the content is updated in the log viewer\n // so that make sure scroll to the real bottom\n setTimeout(() => {\n if (logViewerRef && logViewerRef.current) {\n logViewerRef.current.scrollToBottom();\n }\n }, 1);\n }\n }, [status, lines]);\n\n // Update lines behind while stream is paused, reset when unpaused\n React.useEffect(() => {\n if (status === STREAM_ACTIVE) {\n setLinesBehind(0);\n }\n\n if (status === STREAM_PAUSED) {\n setLinesBehind(\n (currentLinesBehind) => currentLinesBehind + (totalLineCount - previousTotalLineCount),\n );\n }\n }, [status, totalLineCount, previousTotalLineCount]);\n\n // Set back to viewing current log when switching containers\n React.useEffect(() => {\n if (resource.kind === 'Pod') {\n setLogType(LOG_TYPE_CURRENT);\n }\n }, [resource.kind, containerName]);\n\n //Check to see if previous log exists\n React.useEffect(() => {\n if (resource.kind === 'Pod') {\n const container = resource.status?.containerStatuses?.find(\n (pod) => pod.name === containerName,\n );\n setPreviousLogs(container?.restartCount > 0); // Assuming previous log is available if the container has been restarted at least once\n }\n }, [containerName, resource.kind, resource.status]);\n\n const startWebSocket = React.useCallback(() => {\n // Handler for websocket onopen event\n const onOpen = () => {\n buffer.current.clear();\n setStatus(STREAM_ACTIVE);\n };\n // Handler for websocket onclose event\n const onClose = () => {\n setStatus(STREAM_EOF);\n };\n // Handler for websocket onerror event\n const onError = () => {\n setError(true);\n };\n // Handler for websocket onmessage event\n const onMessage = (msg) => {\n if (msg) {\n clearTimeout(timeoutIdRef.current);\n const text = Base64.decode(msg);\n countRef.current += buffer.current.ingest(text);\n // Set a timeout here to render more logs together when initializing\n timeoutIdRef.current = setTimeout(() => {\n setTotalLineCount((currentLineCount) => currentLineCount + countRef.current);\n countRef.current = 0;\n setLines(\n buffer.current.getTail() === ''\n ? [...buffer.current.getLines()]\n : [...buffer.current.getLines(), buffer.current.getTail()],\n );\n setHasTruncated(buffer.current.getHasTruncated());\n }, 10);\n }\n };\n setError(false);\n setHasTruncated(false);\n setLines([]);\n setTotalLineCount(0);\n setLinesBehind(0);\n setContent('');\n setStale(false);\n setStatus(STREAM_LOADING);\n ws.current?.destroy();\n ws.current = new WSFactory(watchURL, {\n host: 'auto',\n path: watchURL,\n subprotocols,\n })\n .onclose(onClose)\n .onerror(onError)\n .onmessage(onMessage)\n .onopen(onOpen);\n }, [watchURL, subprotocols, buffer]);\n // Restart websocket if startWebSocket function changes\n React.useEffect(() => {\n if (\n !error &&\n !stale &&\n [LOG_SOURCE_RUNNING, LOG_SOURCE_TERMINATED, LOG_SOURCE_RESTARTING].includes(resourceStatus)\n ) {\n startWebSocket();\n }\n return () => ws.current?.destroy();\n }, [error, resourceStatus, stale, startWebSocket, showFullLogCheckbox]);\n\n // Toggle currently displayed log content to/from fullscreen\n const toggleFullscreen = () => {\n resourceLogRef.current && screenfull.enabled && screenfull.toggle(resourceLogRef.current);\n };\n\n // Toggle streaming/paused status\n const toggleStreaming = () => {\n setStatus((currentStatus) => (currentStatus === STREAM_ACTIVE ? STREAM_PAUSED : STREAM_ACTIVE));\n };\n\n React.useEffect(() => {\n if (externalLogLinkFlag && resource.kind === 'Pod') {\n Promise.all([\n k8sList(ConsoleExternalLogLinkModel),\n k8sGet(ProjectModel, resource.metadata.namespace),\n ])\n .then(([podLogLinks_, project]) => {\n // Project UID and namespace UID are the same value. Use the projects\n // API since normal OpenShift users can list projects.\n setPodLogLinks(podLogLinks_);\n setNamespaceUID(project.metadata.uid);\n })\n .catch((e) => setError(e));\n }\n }, [externalLogLinkFlag, resource.kind, resource.metadata.namespace]);\n\n // Only run once, initialize screenfull\n React.useEffect(() => {\n if (screenfull.enabled) {\n screenfull.on('change', () => {\n setIsFullscreen(screenfull.isFullscreen);\n });\n screenfull.on('error', () => {\n setIsFullscreen(false);\n });\n }\n\n return () => {\n if (screenfull.enabled) {\n screenfull.off('change');\n screenfull.off('error');\n }\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // If container comes out of restarting state, currently displayed logs might be stale\n React.useEffect(() => {\n if (\n previousResourceStatus === LOG_SOURCE_RESTARTING &&\n resourceStatus !== LOG_SOURCE_RESTARTING\n ) {\n setStale(true);\n }\n }, [previousResourceStatus, resourceStatus]);\n\n const onScroll = ({ scrollOffsetToBottom, scrollDirection, scrollUpdateWasRequested }) => {\n if (!scrollUpdateWasRequested && status !== STREAM_EOF) {\n if (scrollOffsetToBottom < 1) {\n setStatus(STREAM_ACTIVE);\n } else if (scrollDirection === 'backward') {\n setStatus(STREAM_PAUSED);\n }\n }\n };\n\n const logControls = (\n <LogControls\n currentLogURL={linkURL}\n dropdown={dropdown}\n isFullscreen={isFullscreen}\n status={status}\n toggleFullscreen={toggleFullscreen}\n toggleStreaming={toggleStreaming}\n resource={resource}\n containerName={containerName}\n podLogLinks={podLogLinks}\n namespaceUID={namespaceUID}\n toggleWrapLines={setWrapLinesCheckbox}\n isWrapLines={wrapLinesCheckbox}\n isShowFullLog={showFullLogCheckbox}\n hasPreviousLog={hasPreviousLogs}\n changeLogType={setLogType}\n logType={logType}\n showLogTypeSelect={resource.kind === 'Pod'}\n toggleShowFullLog={handleShowFullLogCheckbox}\n />\n );\n\n return (\n <>\n <div\n ref={resourceLogRef}\n className={classNames('resource-log', { 'resource-log--fullscreen': isFullscreen })}\n >\n <div className={classNames('resource-log__alert-wrapper')}>\n {error && (\n <Alert\n isInline\n className=\"co-alert co-alert--margin-bottom-sm\"\n variant=\"danger\"\n title={t('public~An error occurred while retrieving the requested logs.')}\n actionLinks={\n <AlertActionLink onClick={() => setError(false)}>\n {t('public~Retry')}\n </AlertActionLink>\n }\n />\n )}\n {stale && (\n <Alert\n isInline\n className=\"co-alert co-alert--margin-bottom-sm\"\n variant=\"info\"\n title={t('public~The logs for this {{resourceKind}} may be stale.', {\n resourceKind: resource.kind,\n })}\n actionLinks={\n <AlertActionLink onClick={() => setStale(false)}>\n {t('public~Refresh')}\n </AlertActionLink>\n }\n />\n )}\n {hasTruncated && (\n <Alert\n isInline\n className=\"co-alert co-alert--margin-bottom-sm\"\n variant=\"warning\"\n title={t('public~Some lines have been abridged because they are exceptionally long.')}\n >\n <Trans ns=\"public\" t={t}>\n To view unabridged log content, you can either{' '}\n <ExternalLink href={linkURL}>open the raw file in another window</ExternalLink> or{' '}\n <a href={linkURL} download={`${resource.metadata.name}-${containerName}.log`}>\n download it\n </a>\n .\n </Trans>\n </Alert>\n )}\n </div>\n <div className={classNames('resource-log__log-viewer-wrapper')}>\n <LogViewer\n header={\n <div className=\"log-window__header\" data-test=\"no-log-lines\">\n <HeaderBanner lines={lines} />\n </div>\n }\n theme=\"dark\"\n data={content}\n ref={logViewerRef}\n height=\"100%\"\n isTextWrapped={wrapLinesCheckbox}\n toolbar={logControls}\n footer={\n <FooterButton\n className={classNames('log-window__footer', {\n 'log-window__footer--hidden': status !== STREAM_PAUSED,\n })}\n setStatus={setStatus}\n linesBehind={linesBehind}\n />\n }\n onScroll={onScroll}\n initialIndexWidth={7}\n />\n </div>\n </div>\n </>\n );\n};\n\ntype LogControlsProps = {\n currentLogURL: string;\n isFullscreen: boolean;\n dropdown?: React.ReactNode;\n status?: string;\n resource?: any;\n containerName?: string;\n podLogLinks?: K8sResourceKind[];\n namespaceUID?: string;\n toggleStreaming?: () => void;\n toggleFullscreen: () => void;\n toggleWrapLines: (wrapLinesCheckbox: boolean) => void;\n isWrapLines: boolean;\n changeLogType: (type: LogTypeStatus) => void;\n hasPreviousLog?: boolean;\n logType: LogTypeStatus;\n showLogTypeSelect: boolean;\n toggleShowFullLog: (showFullLogCheckbox: boolean) => void;\n isShowFullLog: boolean;\n};\n\ntype ResourceLogProps = {\n containerName?: string;\n dropdown?: React.ReactNode;\n resource: any;\n resourceStatus: string;\n bufferSize?: number;\n};\n\ntype LogTypeStatus = typeof LOG_TYPE_CURRENT | typeof LOG_TYPE_PREVIOUS;\ntype LogType = { type: LogTypeStatus; text: string };\n","import * as React from 'react';\nimport { useLocation, useParams, Location } from 'react-router-dom-v5-compat';\nimport * as _ from 'lodash-es';\n\nimport { getBadgeFromType, getTitleForNodeKind } from '@console/shared';\nimport { PageTitleContext } from '@console/shared/src/components/pagetitle/PageTitleContext';\nimport { ErrorBoundaryFallbackPage, withFallback } from '@console/shared/src/components/error';\nimport {\n useExtensions,\n ResourceTabPage,\n isResourceTabPage,\n isDetailPageBreadCrumbs,\n DetailPageBreadCrumbs,\n} from '@console/plugin-sdk';\nimport {\n ResolvedExtension,\n useResolvedExtensions,\n ResourceTabPage as DynamicResourceTabPage,\n isResourceTabPage as isDynamicResourceTabPage,\n K8sModel,\n isDetailPageBreadCrumbs as isDynamicDetailPageBreadCrumbs,\n DetailPageBreadCrumbs as DynamicDetailPageBreadCrumbs,\n FirehoseResult,\n} from '@console/dynamic-plugin-sdk';\nimport {\n Firehose,\n HorizontalNav,\n PageHeading,\n FirehoseResource,\n KebabOptionsCreator,\n Page,\n AsyncComponent,\n PageComponentProps,\n KebabAction,\n} from '../utils';\nimport {\n K8sResourceKindReference,\n K8sResourceKind,\n K8sKind,\n referenceForModel,\n referenceForExtensionModel,\n} from '../../module/k8s';\nimport { breadcrumbsForDetailsPage } from '../utils/breadcrumbs';\nimport DetailsBreadcrumbResolver from './details-breadcrumb-resolver';\nimport { useK8sModel } from '@console/shared/src/hooks/useK8sModel';\n\nconst useBreadCrumbsForDetailPage = (\n kindObj: K8sKind,\n): ResolvedExtension<DetailPageBreadCrumbs | DynamicDetailPageBreadCrumbs> => {\n const [breadCrumbsExtension, breadCrumbsResolved] = useResolvedExtensions<DetailPageBreadCrumbs>(\n isDetailPageBreadCrumbs,\n );\n const [dynamicBreadCrumbsExtension, dynamicBreadCrumbsResolved] = useResolvedExtensions<\n DynamicDetailPageBreadCrumbs\n >(isDynamicDetailPageBreadCrumbs);\n return React.useMemo(\n () =>\n breadCrumbsResolved && dynamicBreadCrumbsResolved\n ? [...breadCrumbsExtension, ...dynamicBreadCrumbsExtension].find(\n ({ properties: { getModels } }) => {\n const models = getModels();\n return Array.isArray(models)\n ? models.findIndex((model: K8sKind) => model.kind === kindObj?.kind) !== -1\n : models.kind === kindObj?.kind;\n },\n )\n : undefined,\n [\n breadCrumbsResolved,\n breadCrumbsExtension,\n kindObj,\n dynamicBreadCrumbsResolved,\n dynamicBreadCrumbsExtension,\n ],\n );\n};\n\nexport const DetailsPage = withFallback<DetailsPageProps>(({ pages = [], ...props }) => {\n const resourceKeys = _.map(props.resources, 'prop');\n const [pluginBreadcrumbs, setPluginBreadcrumbs] = React.useState(undefined);\n const [model] = useK8sModel(props.kind);\n const kindObj: K8sModel = props.kindObj ?? model;\n const renderAsyncComponent = (page: ResourceTabPage, cProps: PageComponentProps) => (\n <AsyncComponent loader={page.properties.loader} {...cProps} />\n );\n\n const params = useParams();\n const location = useLocation();\n\n const resourcePageExtensions = useExtensions<ResourceTabPage>(isResourceTabPage);\n const [dynamicResourcePageExtensions] = useResolvedExtensions<DynamicResourceTabPage>(\n isDynamicResourceTabPage,\n );\n\n const pluginPages = React.useMemo(\n () => [\n ...resourcePageExtensions\n .filter(\n (p) =>\n referenceForModel(p.properties.model) ===\n (kindObj ? referenceForModel(kindObj) : props.kind),\n )\n .map((p) => ({\n href: p.properties.href,\n name: p.properties.name,\n component: (cProps) => renderAsyncComponent(p, cProps),\n })),\n /** @deprecated -- if there is a bug here, encourage `console.tab/horizontalNav` usage instead */\n ...dynamicResourcePageExtensions\n .filter((p) => {\n if (p.properties.model.version) {\n return (\n referenceForExtensionModel(p.properties.model) ===\n (kindObj ? referenceForModel(kindObj) : props.kind)\n );\n }\n return (\n p.properties.model.group === kindObj.apiGroup &&\n p.properties.model.kind === kindObj.kind\n );\n })\n .map(({ properties: { href, name, component: Component } }) => ({\n href,\n name,\n component: (cProps) => <Component {...cProps} />,\n })),\n ],\n [resourcePageExtensions, dynamicResourcePageExtensions, kindObj, props.kind],\n );\n const resolvedBreadcrumbExtension = useBreadCrumbsForDetailPage(kindObj);\n const onBreadcrumbsResolved = React.useCallback((breadcrumbs) => {\n setPluginBreadcrumbs(breadcrumbs || undefined);\n }, []);\n let allPages = [...pages, ...pluginPages];\n allPages = allPages.length ? allPages : null;\n const objResource: FirehoseResource = {\n kind: props.kind,\n name: props.name,\n namespace: props.namespace,\n isList: false,\n prop: 'obj',\n };\n const titleProviderValues = {\n telemetryPrefix: props?.kindObj?.kind,\n titlePrefix: `${props.name} · ${getTitleForNodeKind(props?.kindObj?.kind)}`,\n };\n\n return (\n <PageTitleContext.Provider value={titleProviderValues}>\n {resolvedBreadcrumbExtension && (\n <DetailsBreadcrumbResolver\n useBreadcrumbs={resolvedBreadcrumbExtension.properties.breadcrumbsProvider}\n onBreadcrumbsResolved={onBreadcrumbsResolved}\n urlMatch={location}\n kind={kindObj}\n />\n )}\n\n <Firehose\n resources={[...(_.isNil(props.obj) ? [objResource] : []), ...(props.resources ?? [])]}\n >\n <PageHeading\n obj={props.obj}\n detail={true}\n title={props.title || props.name}\n titleFunc={props.titleFunc}\n menuActions={props.menuActions}\n buttonActions={props.buttonActions}\n customActionMenu={props.customActionMenu}\n kind={props.customKind || props.kind}\n breadcrumbs={pluginBreadcrumbs}\n breadcrumbsFor={\n props.breadcrumbsFor ??\n (!pluginBreadcrumbs ? breadcrumbsForDetailsPage(kindObj, params, location) : undefined)\n }\n resourceKeys={resourceKeys}\n getResourceStatus={props.getResourceStatus}\n customData={props.customData}\n badge={props.badge || getBadgeFromType(kindObj?.badge)}\n icon={props.icon}\n >\n {props.children}\n </PageHeading>\n <HorizontalNav\n obj={props.obj}\n pages={allPages}\n pagesFor={props.pagesFor}\n className={`co-m-${_.get(props.kind, 'kind', props.kind)}`}\n label={props.label || (props.kind as any).label}\n resourceKeys={resourceKeys}\n customData={props.customData}\n createRedirect={props.createRedirect}\n />\n </Firehose>\n </PageTitleContext.Provider>\n );\n}, ErrorBoundaryFallbackPage);\n\nexport type DetailsPageProps = {\n obj?: FirehoseResult<K8sResourceKind>;\n title?: string | JSX.Element;\n titleFunc?: (obj: K8sResourceKind) => string | JSX.Element;\n menuActions?: KebabAction[] | KebabOptionsCreator;\n buttonActions?: any[];\n createRedirect?: boolean;\n customActionMenu?:\n | React.ReactNode\n | ((kindObj: K8sKind, obj: K8sResourceKind) => React.ReactNode); // Renders a custom action menu.\n pages?: Page[];\n pagesFor?: (obj: K8sResourceKind) => Page[];\n kind: K8sResourceKindReference;\n kindObj?: K8sKind;\n label?: string;\n name?: string;\n namespace?: string;\n resources?: FirehoseResource[];\n breadcrumbsFor?: (\n obj: K8sResourceKind,\n ) => ({ name: string; path: string } | { name: string; path: Location })[];\n customData?: any;\n badge?: React.ReactNode;\n icon?: React.ComponentType<{ obj: K8sResourceKind }>;\n getResourceStatus?: (resource: K8sResourceKind) => string;\n children?: React.ReactNode;\n customKind?: string;\n};\n\nDetailsPage.displayName = 'DetailsPage';\n","/* eslint-disable @typescript-eslint/no-use-before-define */\n\n// Mostly just a copy-paste from patternfly.\nimport * as React from 'react';\nimport { defaults } from 'lodash';\n//@ts-ignore\nimport { Helpers } from 'victory-core';\nimport {\n ChartLegend,\n ChartLabel,\n getTheme,\n ChartLegendTooltipContentProps,\n ChartCursorTooltip,\n ChartTooltip,\n ChartLegendTooltipProps,\n ChartLegendTooltipLabelProps,\n} from '@patternfly/react-charts';\nimport {\n getLegendTooltipSize,\n getLegendTooltipDataProps,\n getLegendTooltipVisibleData,\n getLegendTooltipVisibleText,\n} from '@patternfly/react-charts/dist/js/components/ChartUtils/chart-tooltip';\nimport { ChartLegendTooltipStyles } from '@patternfly/react-charts/dist/js/components/ChartTheme/ChartStyles';\n\nimport { DataPoint } from '.';\n\nexport const ChartLegendTooltipContent: React.FunctionComponent<\n ChartLegendTooltipContentProps & {\n stack?: boolean;\n mainDataName?: string;\n }\n> = (props) => {\n const {\n activePoints,\n center,\n dx = 0,\n dy = 0,\n flyoutHeight,\n flyoutWidth,\n height,\n labelComponent = <ChartLegendTooltipLabel />,\n legendComponent = <ChartLegend />,\n legendData,\n text,\n themeColor,\n title,\n titleComponent = <ChartLabel />,\n width,\n stack,\n mainDataName,\n // destructure last\n theme = getTheme(themeColor),\n ...rest\n } = props;\n const pointerLength = theme?.tooltip\n ? Helpers.evaluateProp(theme.tooltip.pointerLength, props)\n : 10;\n const legendProps = getLegendTooltipDataProps(legendComponent.props);\n const visibleLegendData = getLegendTooltipVisibleData({\n activePoints,\n colorScale: legendProps.colorScale,\n legendData,\n text,\n theme,\n });\n\n const hasMainData = mainDataName ? activePoints[0].childName === mainDataName : false;\n\n if (stack) {\n visibleLegendData.reverse();\n } else if (hasMainData) {\n visibleLegendData.shift();\n }\n\n // Component offsets\n const legendOffsetX = 0;\n const legendOffsetY = title ? 9 : -10;\n const titleOffsetX = 10;\n const titleOffsetY = 0;\n\n // Returns x position of flyout\n const getX = () => {\n if (!(center || flyoutWidth || width)) {\n const x = (rest as any).x;\n return x ? x : undefined;\n }\n const _flyoutWidth = Helpers.evaluateProp(flyoutWidth, props);\n if (width > center.x + _flyoutWidth + pointerLength) {\n return center.x + ChartLegendTooltipStyles.flyout.padding / 2;\n } else if (center.x < _flyoutWidth + pointerLength) {\n return ChartLegendTooltipStyles.flyout.padding / 2 - pointerLength;\n }\n return center.x - _flyoutWidth;\n };\n\n // Returns y position\n const getY = () => {\n if (!(center || flyoutHeight || height)) {\n const y = (rest as any).y;\n return y ? y : undefined;\n }\n const _flyoutHeight = Helpers.evaluateProp(flyoutHeight, props);\n if (center.y < _flyoutHeight / 2) {\n return ChartLegendTooltipStyles.flyout.padding / 2;\n } else if (center.y > height - _flyoutHeight / 2) {\n return height - _flyoutHeight + ChartLegendTooltipStyles.flyout.padding / 2;\n }\n return center.y - _flyoutHeight / 2 + ChartLegendTooltipStyles.flyout.padding / 2;\n };\n\n // Min & max dimensions do not include flyout padding\n const maxLegendDimensions = getLegendTooltipSize({\n legendData: visibleLegendData,\n legendProps,\n text: getLegendTooltipVisibleText({ activePoints, legendData, text }),\n theme,\n });\n const minLegendDimensions = getLegendTooltipSize({\n legendData: [{ name: '' }],\n legendProps,\n theme,\n });\n\n // Returns the label component\n const getLabelComponent = () =>\n React.cloneElement(labelComponent, {\n dx: maxLegendDimensions.width - minLegendDimensions.width,\n legendData: visibleLegendData,\n ...labelComponent.props,\n });\n\n // Returns the title component\n const getTitleComponent = () => {\n const _title = title instanceof Function ? title(activePoints) : title;\n\n return React.cloneElement(titleComponent, {\n style: {\n fill: ChartLegendTooltipStyles.label.fill,\n },\n text: _title,\n textAnchor: 'start',\n x: getX() + titleOffsetX + Helpers.evaluateProp(dx, props),\n y: getY() + titleOffsetY + Helpers.evaluateProp(dy, props),\n ...titleComponent.props,\n });\n };\n\n const tooltipLegendData = getLegendTooltipVisibleData({\n activePoints,\n colorScale: legendProps.colorScale,\n legendData,\n text,\n textAsLegendData: true,\n theme,\n });\n\n if (stack) {\n tooltipLegendData.reverse();\n } else if (hasMainData) {\n tooltipLegendData.shift();\n }\n\n // Returns the legebd component\n const getLegendComponent = () =>\n React.cloneElement(legendComponent, {\n data: tooltipLegendData,\n labelComponent: getLabelComponent(),\n standalone: false,\n theme,\n x: getX() + legendOffsetX + Helpers.evaluateProp(dx, props),\n y: getY() + legendOffsetY + Helpers.evaluateProp(dy, props),\n ...legendProps,\n });\n\n return (\n <>\n {getTitleComponent()}\n {getLegendComponent()}\n </>\n );\n};\nChartLegendTooltipContent.displayName = 'ChartLegendTooltipContent';\n\nexport const ChartLegendTooltipLabel: React.FunctionComponent<ChartLegendTooltipLabelProps> = ({\n index = 0,\n legendData,\n style,\n text,\n textAnchor = 'start',\n x,\n y,\n\n // destructure last\n ...rest\n}: ChartLegendTooltipLabelProps) => {\n const getStyle = (styles: any) => {\n const applyDefaultStyle = (customStyle: React.CSSProperties) =>\n defaults(\n {\n ...customStyle,\n },\n {\n fill: ChartLegendTooltipStyles.label.fill,\n },\n );\n return Array.isArray(styles) ? styles.map(applyDefaultStyle) : applyDefaultStyle(styles);\n };\n\n const label = legendData && legendData.length ? legendData[index as any].name : undefined;\n return (\n <ChartLabel\n style={getStyle(style)}\n text={`${text} ${label}`}\n textAnchor={textAnchor}\n x={x}\n y={y}\n {...rest}\n dx={undefined}\n />\n );\n};\nChartLegendTooltipLabel.displayName = 'ChartLegendTooltipLabel';\n\nexport const ChartLegendTooltip: React.FunctionComponent<\n Omit<ChartLegendTooltipProps, 'title'> & {\n stack?: boolean;\n formatDate: (data: DataPoint<Date>[]) => string;\n getLabel?: (prop: { datum: DataPoint<Date> }) => string;\n mainDataName: string;\n }\n> = (props) => {\n const {\n activePoints,\n datum,\n center = { x: 0, y: 0 },\n flyoutHeight,\n flyoutWidth,\n height,\n isCursorTooltip = true,\n mainDataName,\n labelComponent = <ChartLegendTooltipContent mainDataName={mainDataName} />,\n legendData,\n text,\n themeColor,\n width,\n stack,\n formatDate,\n getLabel,\n\n // destructure last\n theme = getTheme(themeColor),\n ...rest\n } = props;\n const title = (d) => {\n if (stack) {\n return formatDate(d);\n }\n const mainDatum = mainDataName ? d.find((uDatum) => uDatum.childName === mainDataName) : d[0];\n return mainDatum ? getLabel({ datum: mainDatum }) : `No ${mainDataName || 'data'} available`;\n };\n const pointerLength = theme?.tooltip\n ? Helpers.evaluateProp(theme.tooltip.pointerLength, props)\n : 10;\n const legendTooltipProps = {\n legendData: getLegendTooltipVisibleData({ activePoints, legendData, text, theme }),\n legendProps: getLegendTooltipDataProps(labelComponent.props.legendComponent),\n text: getLegendTooltipVisibleText({ activePoints, legendData, text }),\n theme,\n };\n\n // Returns flyout height based on legend size\n const getFlyoutHeight = () => {\n const sizeProps = stack\n ? legendTooltipProps\n : {\n ...legendTooltipProps,\n // For non-stack graphs, remove the text for \"mainDataName\"\n text: legendTooltipProps.text.filter(\n (t, i) => legendTooltipProps.legendData[i].name !== mainDataName,\n ),\n };\n const _flyoutHeight =\n getLegendTooltipSize(sizeProps).height + ChartLegendTooltipStyles.flyout.padding;\n return title ? _flyoutHeight + 4 : _flyoutHeight - 10;\n };\n\n // Returns flyout width based on legend size\n const getFlyoutWidth = () =>\n getLegendTooltipSize(legendTooltipProps).width +\n ChartLegendTooltipStyles.flyout.padding +\n (stack ? 20 : 0);\n\n // Returns the tooltip content component\n const getTooltipContentComponent = () =>\n React.cloneElement(labelComponent, {\n center,\n flyoutHeight: flyoutHeight || getFlyoutHeight(),\n flyoutWidth: flyoutWidth || getFlyoutWidth(),\n height,\n legendData,\n title,\n width,\n stack,\n ...labelComponent.props,\n });\n\n // Returns the tooltip component\n const getTooltipComponent = () => {\n const _flyoutWidth = getFlyoutWidth();\n const tooltipComponent = isCursorTooltip ? <ChartCursorTooltip /> : <ChartTooltip />;\n return React.cloneElement(tooltipComponent, {\n activePoints,\n center,\n datum,\n flyoutHeight: flyoutHeight || getFlyoutHeight(),\n flyoutWidth: flyoutWidth || getFlyoutWidth(),\n height,\n labelComponent: getTooltipContentComponent(),\n ...(flyoutWidth === undefined && {\n showPointer:\n width > _flyoutWidth + center.x + pointerLength ||\n center.x > _flyoutWidth + pointerLength,\n }),\n text,\n theme,\n width,\n ...rest,\n });\n };\n\n return getTooltipComponent();\n};\nChartLegendTooltip.displayName = 'ChartLegendTooltip';\n","import * as _ from 'lodash-es';\nimport { WebHookSecretKey } from '../../secret';\nimport { SecretTypeAbstraction, SecretType } from '.';\nimport { useTranslation } from 'react-i18next';\n\nexport const toDefaultSecretType = (typeAbstraction: SecretTypeAbstraction): SecretType => {\n switch (typeAbstraction) {\n case SecretTypeAbstraction.source:\n return SecretType.basicAuth;\n case SecretTypeAbstraction.image:\n return SecretType.dockerconfigjson;\n default:\n return SecretType.opaque;\n }\n};\n\nexport const toTypeAbstraction = (secret): SecretTypeAbstraction => {\n const { data, type } = secret;\n switch (type) {\n case SecretType.basicAuth:\n case SecretType.sshAuth:\n return SecretTypeAbstraction.source;\n case SecretType.dockerconfigjson:\n case SecretType.dockercfg:\n return SecretTypeAbstraction.image;\n default:\n if (data?.[WebHookSecretKey] && _.size(data) === 1) {\n return SecretTypeAbstraction.webhook;\n }\n return SecretTypeAbstraction.generic;\n }\n};\n\nexport const generateSecret = (): string => {\n // http://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript\n const s4 = () =>\n Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n return s4() + s4() + s4() + s4();\n};\n\nexport const determineSecretType = (stringData): SecretType => {\n const dataKeys = _.keys(stringData).sort();\n if (_.isEqual(dataKeys, ['tls.crt', 'tls.key'])) {\n return SecretType.tls;\n } else if (_.isEqual(dataKeys, ['ca.crt', 'namespace', 'service-ca.crt', 'token'])) {\n return SecretType.serviceAccountToken;\n } else if (_.isEqual(dataKeys, ['.dockercfg'])) {\n return SecretType.dockercfg;\n } else if (_.isEqual(dataKeys, ['.dockerconfigjson'])) {\n return SecretType.dockerconfigjson;\n } else if (_.isEqual(dataKeys, ['password', 'username'])) {\n return SecretType.basicAuth;\n } else if (_.isEqual(dataKeys, ['ssh-privatekey'])) {\n return SecretType.sshAuth;\n }\n return SecretType.opaque;\n};\n\nexport const getImageSecretKey = (secretType: SecretType): string => {\n switch (secretType) {\n case SecretType.dockercfg:\n return '.dockercfg';\n case SecretType.dockerconfigjson:\n return '.dockerconfigjson';\n default:\n return secretType;\n }\n};\n\nexport const useSecretTitle = (\n isCreate: boolean,\n typeAbstraction: SecretTypeAbstraction,\n): string => {\n const { t } = useTranslation();\n switch (typeAbstraction) {\n case SecretTypeAbstraction.generic:\n return isCreate ? t('public~Create key/value secret') : t('public~Edit key/value secret');\n case SecretTypeAbstraction.image:\n return isCreate ? t('public~Create image pull secret') : t('public~Edit image pull secret');\n default:\n return isCreate\n ? t('public~Create {{secretType}} secret', { secretType: typeAbstraction })\n : t('public~Edit {{secretType}} secret', { secretType: typeAbstraction });\n }\n};\n\nexport const useSecretDescription = (typeAbstraction: SecretTypeAbstraction): string => {\n const { t } = useTranslation();\n switch (typeAbstraction) {\n case SecretTypeAbstraction.generic:\n return t(\n 'public~Key/value secrets let you inject sensitive data into your application as files or environment variables.',\n );\n case SecretTypeAbstraction.source:\n return t('public~Source secrets let you authenticate against a Git server.');\n case SecretTypeAbstraction.image:\n return t('public~Image pull secrets let you authenticate against a private image registry.');\n case SecretTypeAbstraction.webhook:\n return t('public~Webhook secrets let you authenticate a webhook trigger.');\n default:\n return null;\n }\n};\n","export enum SecretTypeAbstraction {\n generic = 'generic',\n source = 'source',\n image = 'image',\n webhook = 'webhook',\n}\n\nexport const AUTHS_KEY = 'auths';\n\nexport enum SecretType {\n basicAuth = 'kubernetes.io/basic-auth',\n dockercfg = 'kubernetes.io/dockercfg',\n dockerconfigjson = 'kubernetes.io/dockerconfigjson',\n opaque = 'Opaque',\n serviceAccountToken = 'kubernetes.io/service-account-token',\n sshAuth = 'kubernetes.io/ssh-auth',\n tls = 'kubernetes.io/tls',\n}\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { Helmet } from 'react-helmet';\nimport { useTranslation } from 'react-i18next';\nimport { Base64 } from 'js-base64';\nimport { ActionGroup, Button } from '@patternfly/react-core';\nimport { useParams, useNavigate } from 'react-router-dom-v5-compat';\nimport { k8sCreate, k8sUpdate, K8sResourceKind, referenceFor } from '../../../module/k8s';\nimport { ButtonBar, PageHeading, resourceObjPath } from '../../utils';\nimport { ModalBody, ModalTitle, ModalSubmitFooter } from '../../factory/modal';\nimport { SecretModel } from '../../../models';\nimport {\n SecretTypeAbstraction,\n toDefaultSecretType,\n determineSecretType,\n SecretSubForm,\n useSecretTitle,\n useSecretDescription,\n} from '.';\n\nexport const SecretFormWrapper: React.FC<BaseEditSecretProps_> = (props) => {\n const { isCreate, modal, onCancel } = props;\n const { t } = useTranslation();\n const navigate = useNavigate();\n const params = useParams();\n\n const existingSecret = _.pick(props.obj, ['metadata', 'type']);\n const defaultSecretType = toDefaultSecretType(props.secretTypeAbstraction);\n const initialSecret = _.defaultsDeep({}, props.fixed, existingSecret, {\n apiVersion: 'v1',\n data: {},\n kind: 'Secret',\n metadata: {\n name: '',\n },\n type: defaultSecretType,\n });\n\n const [secretTypeAbstraction] = React.useState(props.secretTypeAbstraction);\n const [secret, setSecret] = React.useState(initialSecret);\n const [inProgress, setInProgress] = React.useState(false);\n const [error, setError] = React.useState();\n const [stringData, setStringData] = React.useState(\n _.mapValues(_.get(props.obj, 'data'), (value) => {\n return value ? Base64.decode(value) : '';\n }),\n );\n const [base64StringData, setBase64StringData] = React.useState({});\n const [disableForm, setDisableForm] = React.useState(false);\n const title = useSecretTitle(isCreate, secretTypeAbstraction);\n const helptext = useSecretDescription(secretTypeAbstraction);\n const cancel = () => navigate(`/k8s/ns/${params.ns}/core~v1~Secret`);\n\n const onDataChanged = (secretsData) => {\n setStringData({ ...secretsData?.stringData });\n setBase64StringData({ ...secretsData?.base64StringData });\n };\n\n const onError = (err) => {\n setError(err);\n setInProgress(false);\n };\n\n const onNameChanged = (event) => {\n const name = event.target.value;\n const newSecret = _.cloneDeep(secret);\n newSecret.metadata.name = name;\n setSecret(newSecret);\n };\n\n const save = (e) => {\n e.preventDefault();\n const { metadata } = secret;\n setInProgress(true);\n const data = {\n ..._.mapValues(stringData, (value) => {\n return Base64.encode(value);\n }),\n ...base64StringData,\n };\n const newSecret = _.assign(\n {},\n secret,\n {\n data,\n },\n // When creating new Secret, determine it's type from the `stringData` keys.\n // When updating a Secret, use it's type.\n isCreate ? { type: determineSecretType(stringData) } : {},\n );\n (isCreate\n ? k8sCreate(SecretModel, newSecret)\n : k8sUpdate(SecretModel, newSecret, metadata.namespace, newSecret.metadata.name)\n ).then(\n (s) => {\n setInProgress(false);\n if (props.onSave) {\n props.onSave(s.metadata.name);\n }\n if (!props.modal) {\n navigate(resourceObjPath(s, referenceFor(s)));\n }\n },\n (err) => {\n setError(err.message);\n setInProgress(false);\n },\n );\n };\n\n const renderBody = () => {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n\n return (\n <>\n <fieldset disabled={!isCreate}>\n <div className=\"form-group\">\n <label className=\"control-label co-required\" htmlFor=\"secret-name\">\n {t('public~Secret name')}\n </label>\n <div>\n <input\n className=\"pf-v5-c-form-control\"\n type=\"text\"\n onChange={onNameChanged}\n value={secret?.metadata?.name}\n aria-describedby=\"secret-name-help\"\n id=\"secret-name\"\n data-test=\"secret-name\"\n required\n />\n <p className=\"help-block\" id=\"secret-name-help\">\n {t('public~Unique name of the new secret.')}\n </p>\n </div>\n </div>\n </fieldset>\n <SecretSubForm\n typeAbstraction={props.secretTypeAbstraction}\n onChange={onDataChanged}\n onError={onError}\n onFormDisable={(disable) => setDisableForm(disable)}\n stringData={stringData}\n secretType={secret.type}\n isCreate={isCreate}\n />\n </>\n );\n };\n\n return modal ? (\n <form className=\"co-create-secret-form modal-content\" onSubmit={save}>\n <ModalTitle>{title}</ModalTitle>\n <ModalBody>{renderBody()}</ModalBody>\n <ModalSubmitFooter\n errorMessage={error || ''}\n inProgress={inProgress}\n submitText={t('public~Create')}\n cancel={onCancel || cancel}\n />\n </form>\n ) : (\n <div className=\"co-m-pane__form\">\n <Helmet>\n <title>{title}</title>\n </Helmet>\n <PageHeading title={title} helpText={helptext} />\n <div className=\"co-m-pane__body\">\n <form className=\"co-m-pane__body-group co-create-secret-form\" onSubmit={save}>\n {renderBody()}\n <ButtonBar errorMessage={error} inProgress={inProgress}>\n <ActionGroup className=\"pf-v5-c-form\">\n <Button\n type=\"submit\"\n data-test=\"save-changes\"\n isDisabled={disableForm}\n variant=\"primary\"\n id=\"save-changes\"\n >\n {props.saveButtonText || t('public~Create')}\n </Button>\n <Button type=\"button\" variant=\"secondary\" id=\"cancel\" onClick={onCancel || cancel}>\n {t('public~Cancel')}\n </Button>\n </ActionGroup>\n </ButtonBar>\n </form>\n </div>\n </div>\n );\n};\n\ntype BaseEditSecretProps_ = {\n obj?: K8sResourceKind;\n fixed: any;\n kind?: string;\n isCreate?: boolean;\n modal?: boolean;\n secretTypeAbstraction?: SecretTypeAbstraction;\n saveButtonText?: string;\n onCancel?: () => void;\n onSave?: (name: string) => void;\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Dropdown } from '../../utils';\nimport {\n getImageSecretKey,\n AUTHS_KEY,\n CreateConfigSubform,\n UploadConfigSubform,\n SecretSubFormProps,\n} from '.';\n\nexport const PullSecretForm: React.FC<SecretSubFormProps> = ({\n onChange,\n onError,\n onFormDisable,\n stringData,\n secretType,\n isCreate,\n}) => {\n const [authType, setAuthType] = React.useState('credentials');\n const { t } = useTranslation();\n\n const pullSecretData = React.useMemo<PullSecretData>(() => {\n try {\n const key = getImageSecretKey(secretType);\n const jsonContent = stringData[key] ?? '{}';\n return JSON.parse(jsonContent);\n } catch (err) {\n onError(`Error parsing secret's data: ${err.message}`);\n return {};\n }\n }, [stringData, secretType]);\n\n const onDataChanged = React.useCallback(\n (secretData: PullSecretData) => {\n if (!_.isError(secretData)) {\n onFormDisable(false);\n }\n const newDataKey = secretData[AUTHS_KEY] ? '.dockerconfigjson' : '.dockercfg';\n onChange({\n stringData: {\n [newDataKey]: JSON.stringify(secretData),\n },\n base64StringData: {},\n });\n },\n [onFormDisable, onchange],\n );\n\n const authTypes = {\n credentials: t('public~Image registry credentials'),\n 'config-file': t('public~Upload configuration file'),\n };\n\n return (\n <>\n {isCreate && (\n <div className=\"form-group\">\n <label className=\"control-label\" htmlFor=\"secret-type\">\n {t('public~Authentication type')}\n </label>\n <div className=\"co-create-secret__dropdown\">\n <Dropdown\n items={authTypes}\n dropDownClassName=\"dropdown--full-width\"\n id=\"dropdown-selectbox\"\n selectedKey={authType}\n onChange={setAuthType}\n />\n </div>\n </div>\n )}\n {authType === 'credentials' ? (\n <CreateConfigSubform onChange={onDataChanged} stringData={pullSecretData} />\n ) : (\n <UploadConfigSubform\n onChange={onDataChanged}\n stringData={pullSecretData}\n onDisable={onFormDisable}\n />\n )}\n </>\n );\n};\n\ntype DockerConfigData = {\n [url: string]: {\n username: string;\n password: string;\n email: string;\n auth: string;\n };\n};\n\ntype DockerConfigJSONData = {\n auths: DockerConfigData;\n};\n\ntype PullSecretData = DockerConfigData | DockerConfigJSONData;\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Base64 } from 'js-base64';\n\nexport const PullSecretCredentialEntry: React.FC<PullSecretCredentialEntryProps> = ({\n id,\n address,\n email,\n password,\n username,\n onChange,\n}) => {\n const { t } = useTranslation();\n\n const updateEntry = (name: string, value: string): void => {\n const auth = username && password ? Base64.encode(`${username}:${password}`) : '';\n onChange(\n {\n address,\n username,\n password,\n email,\n [name]: value,\n ...(auth ? { auth } : {}),\n },\n id,\n );\n };\n\n const handleBlurEvent = (e: React.SyntheticEvent<HTMLInputElement>) =>\n updateEntry(e.currentTarget.name, e.currentTarget.value.trim());\n\n const handleChangeEvent = (e: React.SyntheticEvent<HTMLInputElement>) =>\n updateEntry(e.currentTarget.name, e.currentTarget.value);\n\n return (\n <div className=\"co-m-pane__body-group\" data-test-id=\"create-image-secret-form\">\n <div className=\"form-group\">\n <label className=\"control-label co-required\" htmlFor={`${id}-address`}>\n {t('public~Registry server address')}\n </label>\n <div>\n <input\n className=\"pf-v5-c-form-control\"\n id={`${id}-address`}\n aria-describedby={`${id}-address-help`}\n type=\"text\"\n name=\"address\"\n onChange={handleChangeEvent}\n value={address}\n onBlur={handleBlurEvent}\n data-test=\"image-secret-address\"\n required\n />\n </div>\n <p className=\"help-block\" id={`${id}-address-help`}>\n {t('public~For example quay.io or docker.io')}\n </p>\n </div>\n <div className=\"form-group\">\n <label className=\"control-label co-required\" htmlFor={`${id}-username`}>\n {t('public~Username')}\n </label>\n <div>\n <input\n className=\"pf-v5-c-form-control\"\n id={`${id}-username`}\n type=\"text\"\n name=\"username\"\n onChange={handleChangeEvent}\n value={username}\n onBlur={handleBlurEvent}\n data-test=\"image-secret-username\"\n required\n />\n </div>\n </div>\n <div className=\"form-group\">\n <label className=\"control-label co-required\" htmlFor={`${id}-password`}>\n {t('public~Password')}\n </label>\n <div>\n <input\n className=\"pf-v5-c-form-control\"\n id={`${id}-password`}\n type=\"password\"\n name=\"password\"\n onChange={handleChangeEvent}\n value={password}\n onBlur={handleBlurEvent}\n data-test=\"image-secret-password\"\n required\n />\n </div>\n </div>\n <div className=\"form-group\">\n <label className=\"control-label\" htmlFor={`${id}-email`}>\n {t('public~Email')}\n </label>\n <div>\n <input\n className=\"pf-v5-c-form-control\"\n id={`${id}-email`}\n type=\"text\"\n name=\"email\"\n onChange={handleChangeEvent}\n value={email}\n onBlur={handleBlurEvent}\n data-test=\"image-secret-email\"\n />\n </div>\n </div>\n </div>\n );\n};\n\ntype PullSecretCredentialEntryProps = {\n id: number;\n address: string;\n email: string;\n password: string;\n username: string;\n onChange: (updatedEntry, entryIndex: number) => void;\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { withTranslation } from 'react-i18next';\nimport { WithT } from 'i18next';\nimport { Base64 } from 'js-base64';\nimport { Button } from '@patternfly/react-core';\nimport { MinusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/minus-circle-icon';\nimport { PlusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon';\nimport { AUTHS_KEY, PullSecretCredentialEntry } from '.';\n\nclass CreateConfigSubformWithTranslation extends React.Component<\n CreateConfigSubformProps & WithT,\n CreateConfigSubformState\n> {\n constructor(props) {\n super(props);\n this.state = {\n // If user creates a new image secret by filling out the form a 'kubernetes.io/dockerconfigjson' secret will be created.\n isDockerconfigjson: _.isEmpty(this.props.stringData) || !!this.props.stringData[AUTHS_KEY],\n secretEntriesArray: this.imageSecretObjectToArray(\n this.props.stringData?.[AUTHS_KEY] || this.props.stringData,\n ),\n hasDuplicate: false,\n };\n this.onDataChanged = this.onDataChanged.bind(this);\n }\n newImageSecretEntry() {\n return {\n entry: {\n address: '',\n username: '',\n password: '',\n email: '',\n auth: '',\n },\n uid: _.uniqueId(),\n };\n }\n imageSecretObjectToArray(imageSecretObject) {\n const imageSecretArray = [];\n if (_.isEmpty(imageSecretObject)) {\n return _.concat(imageSecretArray, this.newImageSecretEntry());\n }\n _.each(imageSecretObject, (v, k) => {\n // Decode and parse 'auth' in case 'username' and 'password' are not part of the secret.\n const decodedAuth = Base64.decode(_.get(v, 'auth', ''));\n const parsedAuth = _.isEmpty(decodedAuth) ? _.fill(Array(2), '') : _.split(decodedAuth, ':');\n imageSecretArray.push({\n entry: {\n address: k,\n username: _.get(v, 'username', parsedAuth[0]),\n password: _.get(v, 'password', parsedAuth[1]),\n email: _.get(v, 'email', ''),\n auth: _.get(v, 'auth', ''),\n },\n uid: _.get(v, 'uid', _.uniqueId()),\n });\n });\n return imageSecretArray;\n }\n imageSecretArrayToObject(imageSecretArray) {\n const imageSecretsObject = {};\n _.each(imageSecretArray, (value) => {\n imageSecretsObject[value.entry.address] = _.pick(value.entry, [\n 'username',\n 'password',\n 'auth',\n 'email',\n ]);\n });\n return imageSecretsObject;\n }\n propagateEntryChange(secretEntriesArray) {\n const imageSecretObject = this.imageSecretArrayToObject(secretEntriesArray);\n this.props.onChange(\n this.state.isDockerconfigjson ? { [AUTHS_KEY]: imageSecretObject } : imageSecretObject,\n );\n }\n onDataChanged(updatedEntry, entryIndex: number) {\n this.setState(\n (state: CreateConfigSubformState) => {\n const secretEntriesArray = [...state.secretEntriesArray];\n const updatedEntryData = {\n uid: secretEntriesArray[entryIndex].uid,\n entry: updatedEntry,\n auth: Base64.encode(`${updatedEntry.username}:${updatedEntry.password}`),\n };\n secretEntriesArray[entryIndex] = updatedEntryData;\n return {\n secretEntriesArray,\n };\n },\n () => this.propagateEntryChange(this.state.secretEntriesArray),\n );\n }\n removeEntry(entryIndex: number) {\n this.setState(\n (state: CreateConfigSubformState) => {\n const secretEntriesArray = [...state.secretEntriesArray];\n secretEntriesArray.splice(entryIndex, 1);\n return { secretEntriesArray };\n },\n () => this.propagateEntryChange(this.state.secretEntriesArray),\n );\n }\n addEntry() {\n this.setState(\n {\n secretEntriesArray: _.concat(this.state.secretEntriesArray, this.newImageSecretEntry()),\n },\n () => {\n this.propagateEntryChange(this.state.secretEntriesArray);\n },\n );\n }\n render() {\n const { t } = this.props;\n const secretEntriesList = _.map(this.state.secretEntriesArray, (entryData, index) => {\n const { uid, entry } = entryData ?? {};\n const { address, email, password, username } = entry ?? {};\n return (\n <div className=\"co-add-remove-form__entry\" key={uid}>\n {_.size(this.state.secretEntriesArray) > 1 && (\n <div className=\"co-add-remove-form__link--remove-entry\">\n <Button\n onClick={() => this.removeEntry(index)}\n type=\"button\"\n variant=\"link\"\n data-test=\"remove-entry-button\"\n >\n <MinusCircleIcon className=\"co-icon-space-r\" />\n {t('public~Remove credentials')}\n </Button>\n </div>\n )}\n <PullSecretCredentialEntry\n id={index}\n address={address}\n email={email}\n password={password}\n username={username}\n onChange={this.onDataChanged}\n />\n </div>\n );\n });\n return (\n <>\n {secretEntriesList}\n <Button\n className=\"co-create-secret-form__link--add-entry pf-m-link--align-left\"\n onClick={() => this.addEntry()}\n type=\"button\"\n variant=\"link\"\n data-test=\"add-credentials-button\"\n >\n <PlusCircleIcon className=\"co-icon-space-r\" />\n {t('public~Add credentials')}\n </Button>\n </>\n );\n }\n}\n\nexport const CreateConfigSubform = withTranslation()(CreateConfigSubformWithTranslation);\n\ntype CreateConfigSubformState = {\n isDockerconfigjson: boolean;\n hasDuplicate: boolean;\n secretEntriesArray: {\n entry: {\n address: string;\n username: string;\n password: string;\n email: string;\n auth: string;\n };\n uid: string;\n }[];\n};\n\ntype CreateConfigSubformProps = {\n onChange: Function;\n stringData: {\n [key: string]: any;\n };\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { withTranslation } from 'react-i18next';\nimport { WithT } from 'i18next';\nimport { DroppableFileInput } from '.';\n\nclass UploadConfigSubformWithTranslation extends React.Component<\n UploadConfigSubformProps & WithT,\n UploadConfigSubformState\n> {\n constructor(props) {\n super(props);\n this.state = {\n configFile: _.isEmpty(this.props.stringData) ? '' : JSON.stringify(this.props.stringData),\n parseError: false,\n };\n this.changeData = this.changeData.bind(this);\n this.onFileChange = this.onFileChange.bind(this);\n }\n changeData(event) {\n this.updateState(_.attempt(JSON.parse, event.target.value), event.target.value);\n }\n onFileChange(fileData) {\n this.updateState(_.attempt(JSON.parse, fileData), fileData);\n }\n updateState(parsedData, stringData) {\n this.setState(\n {\n configFile: stringData,\n parseError: _.isError(parsedData),\n },\n () => {\n this.props.onChange(parsedData);\n this.props.onDisable(this.state.parseError);\n },\n );\n }\n render() {\n const { t } = this.props;\n return (\n <>\n <DroppableFileInput\n onChange={this.onFileChange}\n inputFileData={this.state.configFile}\n id=\"docker-config\"\n label={t('public~Configuration file')}\n inputFieldHelpText={t('public~Upload a .dockercfg or .docker/config.json file.')}\n textareaFieldHelpText={t(\n 'public~File with credentials and other configuration for connecting to a secured image registry.',\n )}\n isRequired={true}\n />\n {this.state.parseError && (\n <div className=\"co-create-secret-warning\">\n {t('public~Configuration file should be in JSON format.')}\n </div>\n )}\n </>\n );\n }\n}\n\nexport const UploadConfigSubform = withTranslation()(UploadConfigSubformWithTranslation);\n\ntype UploadConfigSubformState = {\n parseError: boolean;\n configFile: string;\n};\n\ntype UploadConfigSubformProps = {\n onChange: Function;\n onDisable: Function;\n stringData: {\n [key: string]: Object;\n };\n};\n","import * as React from 'react';\nimport { withTranslation } from 'react-i18next';\nimport { WithT } from 'i18next';\nimport { generateSecret } from '.';\n\nclass WebHookSecretFormWithTranslation extends React.Component<\n WebHookSecretFormProps & WithT,\n WebHookSecretFormState\n> {\n constructor(props) {\n super(props);\n this.state = {\n stringData: { WebHookSecretKey: this.props.stringData.WebHookSecretKey || '' },\n };\n this.changeWebHookSecretkey = this.changeWebHookSecretkey.bind(this);\n this.generateWebHookSecret = this.generateWebHookSecret.bind(this);\n }\n changeWebHookSecretkey(event) {\n this.setState(\n {\n stringData: { WebHookSecretKey: event.target.value },\n },\n () => this.props.onChange(this.state),\n );\n }\n generateWebHookSecret() {\n this.setState(\n {\n stringData: { WebHookSecretKey: generateSecret() },\n },\n () => this.props.onChange(this.state),\n );\n }\n render() {\n const { t } = this.props;\n return (\n <div className=\"form-group\">\n <label className=\"control-label co-required\" htmlFor=\"webhook-secret-key\">\n {t('public~Webhook secret key')}\n </label>\n <div className=\"pf-v5-c-input-group\">\n <input\n className=\"pf-v5-c-form-control\"\n id=\"webhook-secret-key\"\n data-test=\"secret-key\"\n type=\"text\"\n name=\"webhookSecretKey\"\n onChange={this.changeWebHookSecretkey}\n value={this.state.stringData.WebHookSecretKey}\n aria-describedby=\"webhook-secret-help\"\n required\n />\n <button\n type=\"button\"\n onClick={this.generateWebHookSecret}\n className=\"pf-v5-c-button pf-m-tertiary\"\n data-test=\"webhook-generate-button\"\n >\n {t('public~Generate')}\n </button>\n </div>\n <p className=\"help-block\" id=\"webhook-secret-help\">\n {t('public~Value of the secret will be supplied when invoking the webhook.')}\n </p>\n </div>\n );\n }\n}\n\nexport const WebHookSecretForm = withTranslation()(WebHookSecretFormWithTranslation);\n\ntype WebHookSecretFormState = {\n stringData: {\n [key: string]: string;\n };\n};\n\ntype WebHookSecretFormProps = {\n onChange: Function;\n onError: Function;\n onFormDisable: Function;\n secretType: string;\n stringData: {\n [key: string]: string;\n };\n};\n","import * as React from 'react';\nimport { withTranslation } from 'react-i18next';\nimport { WithT } from 'i18next';\nimport { Dropdown } from '../../utils';\nimport { SecretType, BasicAuthSubform, SSHAuthSubform } from '.';\n\nclass SourceSecretFormWithTranslation extends React.Component<\n SourceSecretFormProps & WithT,\n SourceSecretFormState\n> {\n constructor(props) {\n super(props);\n this.state = {\n type: this.props.secretType,\n stringData: this.props.stringData || {},\n authType: SecretType.basicAuth,\n };\n this.changeAuthenticationType = this.changeAuthenticationType.bind(this);\n this.onDataChanged = this.onDataChanged.bind(this);\n }\n changeAuthenticationType(type: SecretType) {\n this.setState(\n {\n type,\n },\n () => this.props.onChange(this.state),\n );\n }\n onDataChanged(secretsData) {\n this.setState(\n {\n stringData: { ...secretsData },\n },\n () => this.props.onChange(this.state),\n );\n }\n render() {\n const { t } = this.props;\n const authTypes = {\n [SecretType.basicAuth]: t('public~Basic authentication'),\n [SecretType.sshAuth]: t('public~SSH key'),\n };\n return (\n <>\n {this.props.isCreate ? (\n <div className=\"form-group\">\n <label className=\"control-label\" htmlFor=\"secret-type\">\n {t('public~Authentication type')}\n </label>\n <div className=\"co-create-secret__dropdown\">\n <Dropdown\n items={authTypes}\n dropDownClassName=\"dropdown--full-width\"\n id=\"dropdown-selectbox\"\n selectedKey={this.state.authType}\n onChange={this.changeAuthenticationType}\n />\n </div>\n </div>\n ) : null}\n {this.state.type === SecretType.basicAuth ? (\n <BasicAuthSubform onChange={this.onDataChanged} stringData={this.state.stringData} />\n ) : (\n <SSHAuthSubform onChange={this.onDataChanged} stringData={this.state.stringData} />\n )}\n </>\n );\n }\n}\n\nexport const SourceSecretForm = withTranslation()(SourceSecretFormWithTranslation);\n\ntype SourceSecretFormState = {\n type: SecretType;\n stringData: {\n [key: string]: string;\n };\n authType: SecretType.basicAuth | SecretType.sshAuth;\n};\n\ntype SourceSecretFormProps = {\n onChange: Function;\n stringData: {\n [key: string]: string;\n };\n secretType: SecretType;\n isCreate: boolean;\n};\n","import * as React from 'react';\nimport { withTranslation } from 'react-i18next';\nimport { WithT } from 'i18next';\n\nclass BasicAuthSubformWithTranslation extends React.Component<\n BasicAuthSubformProps & WithT,\n BasicAuthSubformState\n> {\n constructor(props) {\n super(props);\n this.state = {\n username: this.props.stringData.username || '',\n password: this.props.stringData.password || '',\n };\n this.changeData = this.changeData.bind(this);\n }\n changeData(event) {\n this.setState(\n {\n [event.target.name]: event.target.value,\n } as BasicAuthSubformState,\n () => this.props.onChange(this.state),\n );\n }\n\n render() {\n const { t } = this.props;\n return (\n <>\n <div className=\"form-group\">\n <label className=\"control-label\" htmlFor=\"username\">\n {t('public~Username')}\n </label>\n <div>\n <input\n className=\"pf-v5-c-form-control\"\n id=\"username\"\n data-test=\"secret-username\"\n aria-describedby=\"username-help\"\n type=\"text\"\n name=\"username\"\n onChange={this.changeData}\n value={this.state.username}\n />\n <p className=\"help-block\" id=\"username-help\">\n {t('public~Optional username for Git authentication.')}\n </p>\n </div>\n </div>\n <div className=\"form-group\">\n <label className=\"control-label co-required\" htmlFor=\"password\">\n {t('public~Password or token')}\n </label>\n <div>\n <input\n className=\"pf-v5-c-form-control\"\n id=\"password\"\n data-test=\"secret-password\"\n aria-describedby=\"password-help\"\n type=\"password\"\n name=\"password\"\n onChange={this.changeData}\n value={this.state.password}\n required\n />\n <p className=\"help-block\" id=\"password-help\">\n {t(\n 'public~Password or token for Git authentication. Required if a ca.crt or .gitconfig file is not specified.',\n )}\n </p>\n </div>\n </div>\n </>\n );\n }\n}\n\nexport const BasicAuthSubform = withTranslation()(BasicAuthSubformWithTranslation);\n\ntype BasicAuthSubformState = {\n username: string;\n password: string;\n};\n\ntype BasicAuthSubformProps = {\n onChange: Function;\n stringData: {\n [key: string]: string;\n };\n};\n","import * as React from 'react';\nimport { withTranslation } from 'react-i18next';\nimport { WithT } from 'i18next';\nimport { DroppableFileInput } from '.';\n\nclass SSHAuthSubformWithTranslation extends React.Component<\n SSHAuthSubformProps & WithT,\n SSHAuthSubformState\n> {\n constructor(props) {\n super(props);\n this.state = {\n 'ssh-privatekey': this.props.stringData['ssh-privatekey'] || '',\n };\n this.changeData = this.changeData.bind(this);\n this.onFileChange = this.onFileChange.bind(this);\n }\n changeData(event) {\n this.setState(\n {\n 'ssh-privatekey': event.target.value.endsWith('\\n')\n ? event.target.value\n : `${event.target.value}\\n`,\n },\n () => this.props.onChange(this.state),\n );\n }\n onFileChange(fileData) {\n this.setState(\n {\n 'ssh-privatekey': fileData.endsWith('\\n') ? fileData : `${fileData}\\n`,\n },\n () => this.props.onChange(this.state),\n );\n }\n render() {\n const { t } = this.props;\n return (\n <DroppableFileInput\n onChange={this.onFileChange}\n inputFileData={this.state['ssh-privatekey']}\n id=\"ssh-privatekey\"\n label={t('public~SSH private key')}\n inputFieldHelpText={t(\n 'public~Drag and drop file with your private SSH key here or browse to upload it.',\n )}\n textareaFieldHelpText={t('public~Private SSH key file for Git authentication.')}\n isRequired={true}\n />\n );\n }\n}\n\nexport const SSHAuthSubform = withTranslation()(SSHAuthSubformWithTranslation);\n\ntype SSHAuthSubformState = {\n 'ssh-privatekey': string;\n};\n\ntype SSHAuthSubformProps = {\n onChange: Function;\n stringData: {\n [key: string]: string;\n };\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { withTranslation } from 'react-i18next';\nimport { WithT } from 'i18next';\nimport { Base64 } from 'js-base64';\nimport { Button } from '@patternfly/react-core';\nimport { MinusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/minus-circle-icon';\nimport { PlusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon';\nimport { containsNonPrintableCharacters } from '../../utils/file-input';\nimport { KeyValueEntryFormState, KeyValueEntryForm } from '.';\n\nclass GenericSecretFormWithTranslation extends React.Component<\n GenericSecretFormProps & WithT,\n GenericSecretFormState\n> {\n constructor(props) {\n super(props);\n this.state = {\n secretEntriesArray: this.genericSecretObjectToArray(this.props.stringData),\n };\n this.onDataChanged = this.onDataChanged.bind(this);\n }\n newGenericSecretEntry() {\n return {\n entry: {\n key: '',\n value: '',\n },\n uid: _.uniqueId(),\n };\n }\n genericSecretObjectToArray(genericSecretObject) {\n if (_.isEmpty(genericSecretObject)) {\n return [this.newGenericSecretEntry()];\n }\n return _.map(genericSecretObject, (value, key) => {\n const isBinary = containsNonPrintableCharacters(value);\n return {\n uid: _.uniqueId(),\n entry: {\n key,\n value: isBinary ? Base64.encode(value) : value,\n isBase64: isBinary,\n isBinary,\n },\n };\n });\n }\n genericSecretArrayToObject(genericSecretArray) {\n return _.reduce(\n genericSecretArray,\n (acc, k) =>\n _.assign(acc, {\n [k.entry.key]:\n k.entry?.isBase64 || k.entry?.isBinary ? k.entry.value : Base64.encode(k.entry.value),\n }),\n {},\n );\n }\n onDataChanged(updatedEntry, entryID) {\n const updatedSecretEntriesArray = [...this.state.secretEntriesArray];\n const updatedEntryData = {\n uid: updatedSecretEntriesArray[entryID].uid,\n entry: updatedEntry,\n };\n updatedSecretEntriesArray[entryID] = updatedEntryData;\n this.setState(\n {\n secretEntriesArray: updatedSecretEntriesArray,\n },\n () =>\n this.props.onChange({\n base64StringData: this.genericSecretArrayToObject(this.state.secretEntriesArray),\n }),\n );\n }\n removeEntry(entryID) {\n const updatedSecretEntriesArray = [...this.state.secretEntriesArray];\n updatedSecretEntriesArray.splice(entryID, 1);\n this.setState(\n {\n secretEntriesArray: updatedSecretEntriesArray,\n },\n () =>\n this.props.onChange({\n base64StringData: this.genericSecretArrayToObject(this.state.secretEntriesArray),\n }),\n );\n }\n addEntry() {\n this.setState(\n {\n secretEntriesArray: _.concat(this.state.secretEntriesArray, this.newGenericSecretEntry()),\n },\n () =>\n this.props.onChange({\n base64StringData: this.genericSecretArrayToObject(this.state.secretEntriesArray),\n }),\n );\n }\n render() {\n const { t } = this.props;\n const secretEntriesList = _.map(this.state.secretEntriesArray, (entryData, index) => {\n return (\n <div className=\"co-add-remove-form__entry\" key={entryData.uid}>\n {_.size(this.state.secretEntriesArray) > 1 && (\n <div className=\"co-add-remove-form__link--remove-entry\">\n <Button\n type=\"button\"\n onClick={() => this.removeEntry(index)}\n variant=\"link\"\n data-test=\"remove-entry-button\"\n >\n <MinusCircleIcon className=\"co-icon-space-r\" />\n {t('public~Remove key/value')}\n </Button>\n </div>\n )}\n <KeyValueEntryForm id={index} entry={entryData.entry} onChange={this.onDataChanged} />\n </div>\n );\n });\n return (\n <>\n {secretEntriesList}\n <Button\n className=\"co-create-secret-form__link--add-entry pf-m-link--align-left\"\n onClick={() => this.addEntry()}\n type=\"button\"\n variant=\"link\"\n data-test=\"add-credentials-button\"\n >\n <PlusCircleIcon className=\"co-icon-space-r\" />\n {t('public~Add key/value')}\n </Button>\n </>\n );\n }\n}\n\nexport const GenericSecretForm = withTranslation()(GenericSecretFormWithTranslation);\n\ntype GenericSecretFormProps = {\n onChange: Function;\n stringData: {\n [key: string]: string;\n };\n isCreate: boolean;\n};\n\ntype GenericSecretFormState = {\n secretEntriesArray: {\n entry: KeyValueEntryFormState;\n uid: string;\n }[];\n};\n","import * as React from 'react';\nimport { withTranslation } from 'react-i18next';\nimport { WithT } from 'i18next';\nimport { DroppableFileInput } from '.';\n\nexport class KeyValueEntryFormWithTranslation extends React.Component<\n KeyValueEntryFormProps & WithT,\n KeyValueEntryFormState\n> {\n constructor(props) {\n super(props);\n this.state = {\n key: props.entry.key,\n value: props.entry.value,\n isBinary: props.entry.isBinary,\n };\n this.onValueChange = this.onValueChange.bind(this);\n this.onKeyChange = this.onKeyChange.bind(this);\n }\n onValueChange(fileData, isBinary) {\n this.setState(\n {\n value: fileData,\n isBase64: isBinary,\n },\n () => this.props.onChange(this.state, this.props.id),\n );\n }\n onKeyChange(event) {\n this.setState(\n {\n key: event.target.value,\n },\n () => this.props.onChange(this.state, this.props.id),\n );\n }\n render() {\n const { t } = this.props;\n return (\n <div className=\"co-create-generic-secret__form\">\n <div className=\"form-group\">\n <label className=\"control-label co-required\" htmlFor={`${this.props.id}-key`}>\n {t('public~Key')}\n </label>\n <div>\n <input\n className=\"pf-v5-c-form-control\"\n id={`${this.props.id}-key`}\n type=\"text\"\n name=\"key\"\n onChange={this.onKeyChange}\n value={this.state.key}\n data-test=\"secret-key\"\n required\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div>\n <DroppableFileInput\n onChange={this.onValueChange}\n inputFileData={this.state.value}\n id={`${this.props.id}-value`}\n label={t('public~Value')}\n inputFieldHelpText={t(\n 'public~Drag and drop file with your value here or browse to upload it.',\n )}\n inputFileIsBinary={this.state.isBinary}\n />\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport const KeyValueEntryForm = withTranslation()(KeyValueEntryFormWithTranslation);\n\nexport type KeyValueEntryFormState = {\n isBase64?: boolean;\n isBinary?: boolean;\n key: string;\n value: string;\n};\n\nexport type KeyValueEntryFormProps = {\n entry: KeyValueEntryFormState;\n id: number;\n onChange: Function;\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { useTranslation, withTranslation } from 'react-i18next';\nimport { WithT } from 'i18next';\nimport { useParams } from 'react-router-dom-v5-compat';\nimport { K8sResourceKind } from '../../../module/k8s';\nimport { Firehose, LoadingBox, StatusBox } from '../../utils';\nimport { SecretTypeAbstraction, toTypeAbstraction, SecretFormWrapper } from '.';\n\nexport const SecretLoadingWrapper = withTranslation()(\n class SecretLoadingWrapper extends React.Component<\n SecretLoadingWrapperProps & WithT,\n SecretLoadingWrapperState\n > {\n readonly state: SecretLoadingWrapperState = {\n secretTypeAbstraction: SecretTypeAbstraction.generic,\n };\n componentDidUpdate() {\n if (!_.isEmpty(this.props.obj.data)) {\n const secretTypeAbstraction = toTypeAbstraction(this.props.obj.data);\n if (this.state.secretTypeAbstraction !== secretTypeAbstraction) {\n this.setState({\n secretTypeAbstraction,\n });\n }\n }\n }\n render() {\n const { obj, fixedKeys } = this.props;\n const { secretTypeAbstraction } = this.state;\n if (!secretTypeAbstraction) {\n return <LoadingBox />;\n }\n const fixed = fixedKeys?.reduce((acc, k) => ({ ...acc, [k]: obj.data?.[k] || '' }), {});\n\n return (\n <StatusBox {...obj}>\n <SecretFormWrapper\n {...this.props}\n secretTypeAbstraction={secretTypeAbstraction}\n obj={obj.data}\n fixed={fixed}\n />\n </StatusBox>\n );\n }\n },\n);\n\nexport const EditSecret = ({ kind }: EditSecretProps) => {\n const params = useParams();\n const { t } = useTranslation();\n return (\n <Firehose\n resources={[{ kind, name: params.name, namespace: params.ns, isList: false, prop: 'obj' }]}\n >\n <SecretLoadingWrapper fixedKeys={['kind', 'metadata']} saveButtonText={t('public~Save')} />\n </Firehose>\n );\n};\n\ntype EditSecretProps = {\n kind: string;\n};\n\ntype SecretLoadingWrapperProps = {\n obj?: {\n data?: K8sResourceKind;\n [key: string]: any;\n };\n fixedKeys: string[];\n saveButtonText: string;\n};\n\ntype SecretLoadingWrapperState = {\n secretTypeAbstraction: SecretTypeAbstraction;\n};\n","import * as React from 'react';\nimport { useParams } from 'react-router-dom-v5-compat';\nimport { SecretTypeAbstraction, SecretFormWrapper } from '.';\n\nexport const CreateSecret = () => {\n const params = useParams();\n const secretTypeAbstraction = params.type as SecretTypeAbstraction;\n return (\n <SecretFormWrapper\n fixed={{ metadata: { namespace: params.ns } }}\n secretTypeAbstraction={secretTypeAbstraction}\n isCreate={true}\n />\n );\n};\n","import * as React from 'react';\nimport { AsyncComponent } from '../../utils/async';\n\n//TODO :Create a shared LazyDroppableFileInput component.\nexport const DroppableFileInput = (props) => (\n <AsyncComponent\n loader={() => import('../../utils/file-input').then((c) => c.DroppableFileInput)}\n {...props}\n />\n);\n","import * as React from 'react';\nimport {\n SourceSecretForm,\n SecretTypeAbstraction,\n PullSecretForm,\n WebHookSecretForm,\n GenericSecretForm,\n SecretType,\n} from '.';\n\nexport const SecretSubForm: React.FC<WithTypeAbstraction<SecretSubFormProps>> = ({\n typeAbstraction,\n ...props\n}) => {\n switch (typeAbstraction) {\n case SecretTypeAbstraction.source:\n return <SourceSecretForm {...props} />;\n case SecretTypeAbstraction.image:\n return <PullSecretForm {...props} />;\n case SecretTypeAbstraction.webhook:\n return <WebHookSecretForm {...props} />;\n default:\n return <GenericSecretForm {...props} />;\n }\n};\n\ntype WithTypeAbstraction<T> = T & {\n typeAbstraction: SecretTypeAbstraction;\n};\nexport type SecretSubFormProps = {\n onChange: (stringData: SecretChangeData) => void;\n onError: (error: any) => void;\n onFormDisable: (disable: boolean) => void;\n stringData: SecretStringData;\n secretType: SecretType;\n isCreate: boolean;\n};\n\ntype SecretChangeData = { stringData: SecretStringData; base64StringData: SecretStringData };\ntype SecretStringData = { [key: string]: string };\n","// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useSelector } from 'react-redux';\nimport { UseK8sModels } from '../../../extensions/console-types';\n\n/**\n * Hook that retrieves all current k8s models from redux.\n *\n * @returns An array with the first item as the list of k8s model and second item as inFlight status\n * @example\n * ```ts\n * const Component: React.FC = () => {\n * const [models, inFlight] = UseK8sModels();\n * return ...\n * }\n * ```\n */\nexport const useK8sModels: UseK8sModels = () => [\n useSelector(({ k8s }) => k8s.getIn(['RESOURCES', 'models']))?.toJS() ?? {},\n useSelector(({ k8s }) => k8s.getIn(['RESOURCES', 'inFlight'])) ?? false,\n];\n","import * as React from 'react';\nimport {\n Skeleton,\n EmptyState,\n EmptyStateIcon,\n EmptyStateBody,\n Divider,\n Menu,\n MenuItem,\n MenuContent,\n MenuList,\n EmptyStateHeader,\n} from '@patternfly/react-core';\nimport { ExclamationCircleIcon } from '@patternfly/react-icons/dist/esm/icons/exclamation-circle-icon';\nimport fuzzysearch from 'fuzzysearch';\nimport { useTranslation } from 'react-i18next';\nimport { useProjectOrNamespaceModel } from '@console/internal/components/utils';\nimport { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';\nimport { ProjectModel } from '@console/internal/models';\nimport { K8sKind, K8sResourceKind } from '@console/internal/module/k8s';\nimport { alphanumericCompare } from '@console/shared';\nimport {\n Filter,\n Footer,\n NamespaceGroup,\n NoResults,\n} from '@console/shared/src/components/namespace/NamespaceDropdown';\nimport NamespaceMenuToggle from '@console/shared/src/components/namespace/NamespaceMenuToggle';\nimport { useCreateNamespaceOrProjectModal } from '@console/shared/src/hooks/useCreateNamespaceOrProjectModal';\nimport { useTelemetry } from '@console/shared/src/hooks/useTelemetry';\nimport {\n PREFERRED_NAMESPACE_USER_SETTING_KEY,\n usePreferredNamespace,\n} from './usePreferredNamespace';\nimport './NamespaceDropdown.scss';\n\ntype OptionItem = {\n title: string;\n key: string;\n};\n\nconst NamespaceDropdown: React.FC = () => {\n const { t } = useTranslation();\n const fireTelemetryEvent = useTelemetry();\n const createNamespaceOrProjectModal = useCreateNamespaceOrProjectModal();\n const [model, canCreate] = useProjectOrNamespaceModel() as [K8sKind, boolean];\n const isProject: boolean = model?.kind === ProjectModel.kind;\n const [options, optionsLoaded, optionsLoadError] = useK8sWatchResource<K8sResourceKind[]>({\n kind: model?.kind,\n isList: true,\n optional: true,\n });\n const [\n preferredNamespace,\n setPreferredNamespace,\n preferredNamespaceLoaded,\n ] = usePreferredNamespace();\n\n const [dropdownOpen, setDropdownOpen] = React.useState(false);\n const [filterText, setFilterText] = React.useState('');\n const menuRef = React.useRef(null);\n const filterRef = React.useRef(null);\n\n const optionItems: OptionItem[] = React.useMemo(() => {\n if (!optionsLoaded) {\n return [];\n }\n const items: OptionItem[] = options.map((item) => {\n const { name } = item.metadata;\n return { title: name, key: name };\n });\n items.sort((a, b) => alphanumericCompare(a.title, b.title));\n return items;\n }, [options, optionsLoaded]);\n\n const loaded: boolean = model && preferredNamespaceLoaded && optionsLoaded;\n\n const filteredOptions: OptionItem[] = React.useMemo(() => {\n const lowerCaseFilterText = filterText.toLowerCase();\n return optionItems.filter((option: OptionItem) =>\n fuzzysearch(lowerCaseFilterText, option.title.toLowerCase()),\n );\n }, [optionItems, filterText]);\n\n const lastViewedOption: OptionItem = {\n title: t('console-app~Last viewed'),\n key: '##lastViewed##',\n };\n\n const onCreateNamespace = React.useCallback(() => {\n createNamespaceOrProjectModal({\n onSubmit: (newProject) => {\n setPreferredNamespace(newProject.metadata.name);\n fireTelemetryEvent('User Preference Changed', {\n property: PREFERRED_NAMESPACE_USER_SETTING_KEY,\n value: newProject.metadata.name,\n });\n },\n });\n }, [fireTelemetryEvent, setPreferredNamespace, createNamespaceOrProjectModal]);\n\n const loadErrorDescription: string = isProject\n ? t('console-app~Projects failed to load. Check your connection and reload the page.')\n : t('console-app~Namespaces failed to load. Check your connection and reload the page.');\n const loadErrorState: JSX.Element = optionsLoadError ? (\n <EmptyState data-test={'dropdown console.preferredNamespace error'}>\n <EmptyStateHeader\n titleText={<>{t('console-app~Unable to load')}</>}\n icon={<EmptyStateIcon icon={ExclamationCircleIcon} />}\n headingLevel=\"h4\"\n />\n <EmptyStateBody>{loadErrorDescription}</EmptyStateBody>\n </EmptyState>\n ) : null;\n\n const emptyState: JSX.Element =\n !optionsLoadError && filteredOptions.length === 0 ? (\n <NoResults\n isProjects={isProject}\n onClear={(event) => {\n event.preventDefault();\n event.stopPropagation();\n setFilterText('');\n filterRef.current?.focus();\n }}\n />\n ) : null;\n\n const getDropdownLabelForValue = (): string => preferredNamespace || lastViewedOption.title;\n const getDropdownValueForLabel = (selectedLabel: string): string =>\n selectedLabel === lastViewedOption.key ? null : selectedLabel;\n const onToggle = (isOpen: boolean) => setDropdownOpen(isOpen);\n const onSelect = (_, selection: string) => {\n const selectedValue = getDropdownValueForLabel(selection);\n selectedValue !== preferredNamespace && setPreferredNamespace(selectedValue);\n setDropdownOpen(false);\n fireTelemetryEvent('User Preference Changed', {\n property: PREFERRED_NAMESPACE_USER_SETTING_KEY,\n value: selectedValue,\n });\n };\n\n const selected = getDropdownLabelForValue();\n\n const lastNamespaceOption: JSX.Element = (\n <MenuList className=\"co-user-preference__namespace-menu__last-viewed\">\n <Divider component=\"li\" key={'divider'} />\n <MenuItem\n key={lastViewedOption.key}\n itemId={lastViewedOption.key}\n isSelected={selected === lastViewedOption.key}\n data-test=\"dropdown-menu-item-lastViewed\"\n >\n {lastViewedOption.title}\n </MenuItem>\n </MenuList>\n );\n\n const namespaceMenu: JSX.Element = (\n <Menu\n className=\"co-namespace-dropdown__menu\"\n ref={menuRef}\n onSelect={onSelect}\n activeItemId={selected}\n data-test=\"dropdown menu console.preferredNamespace\"\n onActionClick={() => {}}\n isScrollable\n >\n <MenuContent menuHeight=\"40vh\" maxMenuHeight=\"40vh\">\n <Filter\n filterRef={filterRef}\n onFilterChange={setFilterText}\n filterText={filterText}\n isProject={isProject}\n />\n {lastNamespaceOption}\n {loadErrorState || emptyState}\n <NamespaceGroup\n isProjects={isProject}\n options={filteredOptions}\n selectedKey={selected}\n canFavorite={false}\n />\n </MenuContent>\n <Footer\n canCreateNew={canCreate}\n isProject={isProject}\n onCreateNew={onCreateNamespace}\n setOpen={setDropdownOpen}\n />\n </Menu>\n );\n\n return loaded ? (\n <NamespaceMenuToggle\n disabled={false}\n menu={namespaceMenu}\n menuRef={menuRef}\n isOpen={dropdownOpen}\n title={selected}\n onToggle={onToggle}\n data-test={'dropdown console.preferredNamespace'}\n className=\"co-user-preference__namespace-menu-toggle\"\n />\n ) : (\n <Skeleton\n height=\"30px\"\n width=\"100%\"\n data-test={'dropdown skeleton console.preferredNamespace'}\n />\n );\n};\n\nexport default NamespaceDropdown;\n","import { useUserSettings } from '@console/shared';\n\nconst PREFERRED_EXACT_SEARCH_USER_SETTING_KEY: string = 'console.enableExactSearch';\n\nexport const useExactSearch = (): [boolean, boolean] => {\n const [exactSearch, , exactSearchLoaded] = useUserSettings<boolean>(\n PREFERRED_EXACT_SEARCH_USER_SETTING_KEY,\n );\n return [exactSearch, exactSearchLoaded];\n};\n","export const IDP_TYPES = Object.freeze({\n basicauth: 'Basic Authentication',\n github: 'GitHub',\n gitlab: 'GitLab',\n google: 'Google',\n htpasswd: 'HTPasswd',\n keystone: 'Keystone',\n ldap: 'LDAP',\n oidconnect: 'OpenID Connect',\n requestheader: 'Request Header',\n});\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport * as _ from 'lodash-es';\nimport * as classNames from 'classnames';\nimport * as React from 'react';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useDispatch } from 'react-redux';\nimport { Link, useParams, useNavigate } from 'react-router-dom-v5-compat';\n\nimport { Button, TextInput, TextInputProps } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\n\nimport { useDocumentListener, KEYBOARD_SHORTCUTS, useDeepCompareMemoize } from '@console/shared';\nimport { withFallback, ErrorBoundaryFallbackPage } from '@console/shared/src/components/error';\nimport { ColumnLayout } from '@console/dynamic-plugin-sdk';\n\nimport { filterList } from '@console/dynamic-plugin-sdk/src/app/k8s/actions/k8s';\nimport { storagePrefix } from '../row-filter';\nimport { ErrorPage404 } from '../error';\nimport { K8sKind, K8sResourceCommon, referenceForModel, Selector } from '../../module/k8s';\nimport {\n Dropdown,\n Firehose,\n FirehoseResource,\n FirehoseResourcesResult,\n FirehoseResultObject,\n FirehoseResult,\n inject,\n kindObj,\n makeQuery,\n makeReduxID,\n PageHeading,\n RequireCreatePermission,\n} from '../utils';\nimport { FilterToolbar, RowFilter } from '../filter-toolbar';\n\ntype CreateProps = {\n action?: string;\n createLink?: (item: string) => string;\n to?: string;\n items?: {\n [key: string]: string;\n };\n onClick?: () => void;\n isDisabled?: boolean;\n id?: string;\n};\n\ntype TextFilterProps = Omit<TextInputProps, 'type' | 'tabIndex'> & {\n label?: string;\n parentClassName?: string;\n};\n\nexport const TextFilter: React.FC<TextFilterProps> = (props) => {\n const {\n label,\n className,\n placeholder,\n autoFocus = false,\n parentClassName,\n ...otherInputProps\n } = props;\n const { ref } = useDocumentListener<HTMLInputElement>();\n const { t } = useTranslation();\n const placeholderText = placeholder ?? t('public~Filter {{label}}...', { label });\n\n return (\n <div className={classNames('has-feedback', parentClassName)}>\n <TextInput\n {...otherInputProps}\n className={classNames('co-text-filter', className)}\n data-test-id=\"item-filter\"\n aria-label={placeholderText}\n placeholder={placeholderText}\n ref={ref}\n autoFocus={autoFocus}\n tabIndex={0}\n type=\"text\"\n />\n <span className=\"co-text-filter-feedback\">\n <kbd className=\"co-kbd co-kbd__filter-input\">{KEYBOARD_SHORTCUTS.focusFilterInput}</kbd>\n </span>\n </div>\n );\n};\nTextFilter.displayName = 'TextFilter';\n\n// TODO (jon) make this into \"withListPageFilters\" HOC\n\ntype ListPageWrapperProps<L = any, C = any> = {\n ListComponent: React.ComponentType<L>;\n kinds: string[];\n filters?: any;\n flatten?: Flatten;\n rowFilters?: RowFilter[];\n hideNameLabelFilters?: boolean;\n hideLabelFilter?: boolean;\n columnLayout?: ColumnLayout;\n name?: string;\n resources?: FirehoseResourcesResult;\n reduxIDs?: string[];\n textFilter?: string;\n nameFilterPlaceholder?: string;\n namespace?: string;\n labelFilterPlaceholder?: string;\n label?: string;\n staticFilters?: { key: string; value: string }[];\n customData?: C;\n hideColumnManagement?: boolean;\n nameFilter?: string;\n};\n\nexport const ListPageWrapper: React.FC<ListPageWrapperProps> = (props) => {\n const {\n flatten,\n ListComponent,\n reduxIDs,\n rowFilters,\n textFilter,\n nameFilterPlaceholder,\n labelFilterPlaceholder,\n hideNameLabelFilters,\n hideLabelFilter,\n columnLayout,\n name,\n resources,\n nameFilter,\n } = props;\n const dispatch = useDispatch();\n const memoizedIds = useDeepCompareMemoize(reduxIDs);\n\n React.useEffect(() => {\n if (!_.isNil(nameFilter)) {\n memoizedIds.forEach((id) => dispatch(filterList(id, 'name', { selected: [nameFilter] })));\n }\n }, [dispatch, nameFilter, memoizedIds]);\n\n const data = flatten ? flatten(resources) : [];\n const Filter = (\n <FilterToolbar\n rowFilters={rowFilters}\n data={data}\n nameFilterPlaceholder={nameFilterPlaceholder}\n labelFilterPlaceholder={labelFilterPlaceholder}\n reduxIDs={reduxIDs}\n textFilter={textFilter}\n hideNameLabelFilters={hideNameLabelFilters}\n hideLabelFilter={hideLabelFilter}\n columnLayout={columnLayout}\n uniqueFilterName={name}\n {...props}\n />\n );\n\n return (\n <div>\n {!_.isEmpty(data) && Filter}\n <div className=\"row\">\n <div className=\"col-xs-12\">\n <ListComponent {...props} data={data} />\n </div>\n </div>\n </div>\n );\n};\n\nListPageWrapper.displayName = 'ListPageWrapper_';\n\nexport type FireManProps = {\n canCreate?: boolean;\n textFilter?: string;\n createAccessReview?: {\n model: K8sKind;\n namespace?: string;\n };\n createButtonText?: string;\n createProps?: CreateProps;\n fieldSelector?: string;\n filterLabel?: string;\n resources: FirehoseResource[];\n badge?: React.ReactNode;\n helpText?: React.ReactNode;\n title?: string;\n autoFocus?: boolean;\n};\n\nexport const FireMan: React.FC<FireManProps & { filterList?: typeof filterList }> = (props) => {\n const {\n resources,\n textFilter,\n canCreate,\n createAccessReview,\n createButtonText,\n createProps = {},\n helpText,\n badge,\n title,\n } = props;\n const navigate = useNavigate();\n\n const [reduxIDs, setReduxIDs] = React.useState([]);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [expand] = React.useState();\n\n React.useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n params.forEach((v, k) => applyFilter(k, v));\n\n const reduxId = resources.map((r) =>\n makeReduxID(kindObj(r.kind), makeQuery(r.namespace, r.selector, r.fieldSelector, r.name)),\n );\n setReduxIDs(reduxId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n const reduxId = resources.map((r) =>\n makeReduxID(kindObj(r.kind), makeQuery(r.namespace, r.selector, r.fieldSelector, r.name)),\n );\n\n if (_.isEqual(reduxId, reduxIDs)) {\n return;\n }\n\n // reapply filters to the new list...\n setReduxIDs(reduxId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resources]);\n\n const updateURL = (filterName: string, options: any) => {\n if (filterName !== textFilter) {\n // TODO (ggreer): support complex filters (objects, not just strings)\n return;\n }\n const params = new URLSearchParams(window.location.search);\n if (options) {\n params.set(filterName, options);\n } else {\n params.delete(filterName);\n }\n const url = new URL(window.location.href);\n navigate(`${url.pathname}?${params.toString()}${url.hash}`, { replace: true });\n };\n\n const applyFilter = (filterName: string, options: any) => {\n // TODO: (ggreer) lame blacklist of query args. Use a whitelist based on resource filters\n if (['q', 'kind', 'orderBy', 'sortBy'].includes(filterName)) {\n return;\n }\n if (filterName.indexOf(storagePrefix) === 0) {\n return;\n }\n reduxIDs.forEach((id) => props.filterList(id, filterName, options));\n updateURL(filterName, options);\n };\n\n const runOrNavigate = (itemName: string) => {\n const action = _.isFunction(createProps.action) && createProps.action(itemName);\n if (action) {\n action();\n } else if (_.isFunction(createProps.createLink)) {\n navigate(createProps.createLink(itemName), { replace: true });\n }\n };\n\n let createLink: any;\n\n if (canCreate) {\n if (createProps.to) {\n createLink = (\n <Link className=\"co-m-primary-action\" to={createProps.to}>\n <Button variant=\"primary\" id=\"yaml-create\" data-test=\"item-create\">\n {createButtonText}\n </Button>\n </Link>\n );\n } else if (createProps.items) {\n createLink = (\n <div className=\"co-m-primary-action\">\n <Dropdown\n buttonClassName=\"pf-m-primary\"\n id=\"item-create\"\n dataTest=\"item-create\"\n menuClassName={classNames({ 'pf-m-align-right-on-md': title })}\n title={createButtonText}\n noSelection\n items={createProps.items}\n onChange={runOrNavigate}\n />\n </div>\n );\n } else {\n createLink = (\n <div className=\"co-m-primary-action\">\n <Button variant=\"primary\" id=\"yaml-create\" data-test=\"item-create\" {...createProps}>\n {createButtonText}\n </Button>\n </div>\n );\n }\n if (!_.isEmpty(createAccessReview)) {\n createLink = (\n <RequireCreatePermission\n model={createAccessReview.model}\n namespace={createAccessReview.namespace}\n >\n {createLink}\n </RequireCreatePermission>\n );\n }\n }\n\n return (\n <>\n {/* Badge rendered from PageHeading only when title is present */}\n <PageHeading\n title={title}\n badge={title ? badge : null}\n className={classNames({ 'co-m-nav-title--row': createLink })}\n >\n {createLink && (\n <div className={classNames({ 'co-m-pane__createLink--no-title': !title })}>\n {createLink}\n </div>\n )}\n {!title && badge && <div>{badge}</div>}\n </PageHeading>\n {helpText && <p className=\"co-m-pane__help-text co-help-text\">{helpText}</p>}\n <div className=\"co-m-pane__body co-m-pane__body--no-top-margin\">\n {inject(props.children, {\n resources,\n expand,\n reduxIDs,\n applyFilter,\n })}\n </div>\n </>\n );\n};\nFireMan.displayName = 'FireMan';\n\nexport type Flatten<\n F extends FirehoseResultObject = { [key: string]: K8sResourceCommon | K8sResourceCommon[] },\n R = any\n> = (resources: FirehoseResourcesResult<F>) => R;\n\nexport type ListPageProps<L = any, C = any> = PageCommonProps<L, C> & {\n kind: string;\n helpText?: React.ReactNode;\n selector?: Selector;\n fieldSelector?: string;\n createHandler?: () => void;\n name?: string;\n filters?: any;\n limit?: number;\n nameFilter?: string;\n skipAccessReview?: boolean;\n};\n\nexport const ListPage = withFallback<ListPageProps>((props) => {\n const {\n autoFocus,\n canCreate,\n createButtonText,\n createHandler,\n customData,\n fieldSelector,\n filterLabel,\n labelFilterPlaceholder,\n nameFilterPlaceholder,\n filters,\n helpText,\n kind,\n limit,\n ListComponent,\n mock,\n name,\n nameFilter,\n namespace,\n selector,\n showTitle = true,\n skipAccessReview,\n textFilter,\n badge,\n hideLabelFilter,\n hideNameLabelFilters,\n hideColumnManagement,\n columnLayout,\n flatten = (_resources) => _.get(_resources, name || kind, {} as FirehoseResult).data,\n } = props;\n const { t } = useTranslation();\n const params = useParams();\n let { createProps } = props;\n const ko = kindObj(kind);\n const { label, labelKey, labelPlural, labelPluralKey, namespaced, plural } = ko;\n const title = props.title || t(labelPluralKey) || labelPlural;\n const usedNamespace = !namespace && namespaced ? params.ns : namespace;\n\n let href = usedNamespace\n ? `/k8s/ns/${usedNamespace || 'default'}/${plural}/~new`\n : `/k8s/cluster/${plural}/~new`;\n if (ko.crd) {\n try {\n const ref = referenceForModel(ko);\n href = usedNamespace\n ? `/k8s/ns/${usedNamespace || 'default'}/${ref}/~new`\n : `/k8s/cluster/${ref}/~new`;\n } catch (unused) {\n /**/\n }\n }\n\n createProps = createProps || (createHandler ? { onClick: createHandler } : { to: href });\n const createAccessReview = skipAccessReview ? null : { model: ko, namespace: usedNamespace };\n const resources = [\n {\n fieldSelector,\n filters,\n kind,\n limit,\n name,\n namespaced,\n selector,\n prop: kind,\n },\n ];\n\n // Don't show row filters if props.filters were passed. The content is already filtered and the row filters will have incorrect counts.\n const rowFilters = _.isEmpty(filters) ? props.rowFilters : undefined;\n\n if (!namespaced && usedNamespace) {\n return <ErrorPage404 />;\n }\n\n return (\n <MultiListPage\n autoFocus={autoFocus}\n canCreate={canCreate}\n createAccessReview={createAccessReview}\n createButtonText={\n createButtonText || t('public~Create {{label}}', { label: t(labelKey) || label })\n }\n createProps={createProps}\n customData={customData}\n filterLabel={filterLabel || t('public~by name')}\n nameFilterPlaceholder={nameFilterPlaceholder}\n labelFilterPlaceholder={labelFilterPlaceholder}\n flatten={flatten}\n helpText={helpText}\n label={t(labelPluralKey) || labelPlural}\n ListComponent={ListComponent}\n mock={mock}\n namespace={usedNamespace}\n resources={resources}\n rowFilters={rowFilters}\n showTitle={showTitle}\n textFilter={textFilter}\n title={title}\n badge={badge}\n hideLabelFilter={hideLabelFilter}\n hideNameLabelFilters={hideNameLabelFilters}\n hideColumnManagement={hideColumnManagement}\n columnLayout={columnLayout}\n nameFilter={nameFilter}\n />\n );\n}, ErrorBoundaryFallbackPage);\n\nListPage.displayName = 'ListPage';\n\ntype PageCommonProps<L = any, C = any> = {\n canCreate?: boolean;\n createButtonText?: string;\n createProps?: CreateProps;\n flatten?: Flatten;\n title?: string;\n showTitle?: boolean;\n filterLabel?: string;\n textFilter?: string;\n rowFilters?: RowFilter[];\n ListComponent: React.ComponentType<L>;\n namespace?: string;\n customData?: C;\n badge?: React.ReactNode;\n hideNameLabelFilters?: boolean;\n hideLabelFilter?: boolean;\n columnLayout?: ColumnLayout;\n hideColumnManagement?: boolean;\n labelFilterPlaceholder?: string;\n nameFilterPlaceholder?: string;\n autoFocus?: boolean;\n mock?: boolean;\n};\n\nexport type MultiListPageProps<L = any, C = any> = PageCommonProps<L, C> & {\n createAccessReview?: {\n model: K8sKind;\n namespace?: string;\n };\n label?: string;\n hideTextFilter?: boolean;\n helpText?: React.ReactNode;\n resources: (Omit<FirehoseResource, 'prop'> & { prop?: FirehoseResource['prop'] })[];\n staticFilters?: { key: string; value: string }[];\n nameFilter?: string;\n};\n\nexport const MultiListPage: React.FC<MultiListPageProps> = (props) => {\n const {\n autoFocus,\n canCreate,\n createAccessReview,\n createButtonText,\n createProps,\n filterLabel,\n nameFilterPlaceholder,\n labelFilterPlaceholder,\n flatten,\n helpText,\n label,\n ListComponent,\n mock,\n namespace,\n rowFilters,\n showTitle = true,\n staticFilters,\n textFilter,\n title,\n customData,\n badge,\n hideLabelFilter,\n hideNameLabelFilters,\n hideColumnManagement,\n columnLayout,\n nameFilter,\n } = props;\n\n const { t } = useTranslation();\n const resources = _.map(props.resources, (r) => ({\n ...r,\n isList: r.isList !== undefined ? r.isList : true,\n namespace: r.namespaced ? namespace : r.namespace,\n prop: r.prop || r.kind,\n }));\n\n return (\n <FireMan\n autoFocus={autoFocus}\n canCreate={canCreate}\n createAccessReview={createAccessReview}\n createButtonText={createButtonText || t('public~Create')}\n createProps={createProps}\n filterLabel={filterLabel || t('public~by name')}\n helpText={helpText}\n resources={mock ? [] : resources}\n textFilter={textFilter}\n title={showTitle ? title : undefined}\n badge={badge}\n >\n <Firehose resources={mock ? [] : resources}>\n <ListPageWrapper\n flatten={flatten}\n kinds={_.map(resources, 'kind')}\n label={label}\n ListComponent={ListComponent}\n textFilter={textFilter}\n rowFilters={rowFilters}\n staticFilters={staticFilters}\n customData={customData}\n hideLabelFilter={hideLabelFilter}\n hideNameLabelFilters={hideNameLabelFilters}\n hideColumnManagement={hideColumnManagement}\n columnLayout={columnLayout}\n nameFilterPlaceholder={nameFilterPlaceholder}\n labelFilterPlaceholder={labelFilterPlaceholder}\n nameFilter={nameFilter}\n namespace={namespace}\n />\n </Firehose>\n </FireMan>\n );\n};\n\nMultiListPage.displayName = 'MultiListPage';\n","import * as React from 'react';\nimport {\n formatPrometheusDuration,\n parsePrometheusDuration,\n} from '@openshift-console/plugin-shared/src/datetime/prometheus';\nimport {\n Chart,\n ChartArea,\n ChartAxis,\n ChartGroup,\n ChartLegend,\n ChartLine,\n ChartStack,\n ChartVoronoiContainer,\n} from '@patternfly/react-charts';\nimport {\n Alert,\n Button,\n Checkbox,\n EmptyState,\n EmptyStateBody,\n EmptyStateIcon,\n EmptyStateVariant,\n InputGroup,\n TextInput,\n EmptyStateHeader,\n InputGroupItem,\n} from '@patternfly/react-core';\nimport {\n DropdownItem as DropdownItemDeprecated,\n Dropdown as DropdownDeprecated,\n DropdownToggle as DropdownToggleDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { ChartLineIcon } from '@patternfly/react-icons/dist/esm/icons/chart-line-icon';\nimport classNames from 'classnames';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useDispatch, useSelector } from 'react-redux';\nimport { VictoryPortal } from 'victory-core';\nimport {\n FormatSeriesTitle,\n PrometheusEndpoint,\n PrometheusLabels,\n PrometheusResponse,\n PrometheusResult,\n PrometheusValue,\n QueryBrowserProps,\n} from '@console/dynamic-plugin-sdk';\nimport {\n queryBrowserDeleteAllSeries,\n queryBrowserPatchQuery,\n queryBrowserSetTimespan,\n} from '@console/internal/actions/observe';\nimport { GraphEmpty } from '@console/internal/components/graphs/graph-empty';\nimport { getPrometheusURL } from '@console/internal/components/graphs/helpers';\nimport { formatNumber } from '@console/internal/components/monitoring/format';\nimport { useBoolean } from '@console/internal/components/monitoring/hooks/useBoolean';\nimport { PrometheusAPIError } from '@console/internal/components/monitoring/types';\nimport {\n humanizeNumberSI,\n LoadingInline,\n usePoll,\n useRefWidth,\n useSafeFetch,\n} from '@console/internal/components/utils';\nimport {\n dateFormatterNoYear,\n dateTimeFormatterWithSeconds,\n timeFormatter,\n timeFormatterWithSeconds,\n} from '@console/internal/components/utils/datetime';\nimport { RootState } from '@console/internal/redux';\nimport withFallback from '../error/fallbacks/withFallback';\nimport { queryBrowserTheme } from './theme';\n\nconst spans = ['5m', '15m', '30m', '1h', '2h', '6h', '12h', '1d', '2d', '1w', '2w'];\n\n// Use exponential notation for small or very large numbers to avoid labels with too many characters\nconst formatPositiveValue = (v: number): string =>\n v === 0 || (v >= 0.001 && v < 1e23) ? humanizeNumberSI(v).string : v.toExponential(1);\n\nconst formatValue = (v: number): string => (v < 0 ? '-' : '') + formatPositiveValue(Math.abs(v));\n\nconst valueFormatter = (units: string): ((v: number) => string) =>\n ['ms', 's', 'bytes', 'Bps', 'pps'].includes(units)\n ? (v: number) => formatNumber(String(v), undefined, units)\n : formatValue;\n\nconst Error: React.FC<ErrorProps> = ({ error, title = 'An error occurred' }) => (\n <Alert isInline className=\"co-alert\" title={title} variant=\"danger\">\n {_.get(error, 'json.error', error.message)}\n </Alert>\n);\n\nconst GraphEmptyState: React.FC<GraphEmptyStateProps> = ({ children, title }) => (\n <div className=\"query-browser__wrapper graph-empty-state\">\n <EmptyState variant={EmptyStateVariant.full}>\n <EmptyStateHeader\n titleText={<>{title}</>}\n icon={<EmptyStateIcon icon={ChartLineIcon} />}\n headingLevel=\"h2\"\n />\n <EmptyStateBody>{children}</EmptyStateBody>\n </EmptyState>\n </div>\n);\n\nconst SpanControls: React.FC<SpanControlsProps> = React.memo(\n ({ defaultSpanText, onChange, span, hasReducedResolution }) => {\n const [isValid, setIsValid] = React.useState(true);\n const [text, setText] = React.useState(formatPrometheusDuration(span));\n\n const { t } = useTranslation();\n\n const [isOpen, setIsOpen, , setClosed] = useBoolean(false);\n\n React.useEffect(() => {\n setText(formatPrometheusDuration(span));\n }, [span]);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const debouncedOnChange = React.useCallback(_.debounce(onChange, 400), [onChange]);\n\n const setSpan = (newText: string, isDebounced = false) => {\n const newSpan = parsePrometheusDuration(newText);\n const newIsValid = newSpan > 0;\n setIsValid(newIsValid);\n setText(newText);\n if (newIsValid && newSpan !== span) {\n const fn = isDebounced ? debouncedOnChange : onChange;\n fn(newSpan);\n }\n };\n\n const dropdownItems = spans.map((s) => (\n <DropdownItemDeprecated\n className=\"query-browser__span-dropdown-item\"\n key={s}\n onClick={() => setSpan(s, true)}\n >\n {s}\n </DropdownItemDeprecated>\n ));\n\n return (\n <>\n <InputGroup className=\"query-browser__span\">\n <InputGroupItem isFill>\n <TextInput\n aria-label={t('public~graph timespan')}\n className=\"query-browser__span-text\"\n validated={isValid ? 'default' : 'error'}\n onChange={(_event, v) => setSpan(v, true)}\n type=\"text\"\n value={text}\n />\n </InputGroupItem>\n <InputGroupItem>\n <DropdownDeprecated\n dropdownItems={dropdownItems}\n isOpen={isOpen}\n onSelect={setClosed}\n position=\"right\"\n toggle={\n <DropdownToggleDeprecated\n aria-label={t('public~graph timespan')}\n onToggle={setIsOpen}\n />\n }\n />\n </InputGroupItem>\n </InputGroup>\n <Button\n className=\"query-browser__inline-control\"\n onClick={() => setSpan(defaultSpanText)}\n type=\"button\"\n variant=\"tertiary\"\n >\n {t('public~Reset zoom')}\n </Button>\n {hasReducedResolution && (\n <Alert\n isInline\n isPlain\n className=\"query-browser__reduced-resolution\"\n title={t('public~Displaying with reduced resolution due to large dataset.')}\n variant=\"info\"\n truncateTitle={1}\n />\n )}\n </>\n );\n },\n);\n\nconst TOOLTIP_MAX_ENTRIES = 20;\nconst TOOLTIP_MAX_WIDTH = 400;\nconst TOOLTIP_MAX_HEIGHT = 400;\nconst TOOLTIP_MAX_LEFT_JUT_OUT = 85;\nconst TOOLTIP_MAX_RIGHT_JUT_OUT = 45;\n\ntype TooltipSeries = {\n color: string;\n key: string;\n labels: PrometheusLabels;\n name: string;\n total: number;\n value: string;\n};\n\n// For performance, use this instead of PatternFly's ChartTooltip or Victory VictoryTooltip\nconst TooltipWrapped: React.FC<TooltipProps> = ({\n activePoints,\n center,\n height,\n style,\n width,\n x,\n}) => {\n const time = activePoints?.[0]?.x;\n\n if (!_.isDate(time) || !_.isFinite(x)) {\n return null;\n }\n\n // Don't show the tooltip if the cursor is too far from the active points (can happen when the\n // graph's timespan includes a range with no data)\n if (Math.abs(x - center.x) > width / 15) {\n return null;\n }\n\n // Pick tooltip width and location (left or right of the cursor) to maximize its available space\n const spaceOnLeft = x + TOOLTIP_MAX_LEFT_JUT_OUT;\n const spaceOnRight = width - x + TOOLTIP_MAX_RIGHT_JUT_OUT;\n const isOnLeft = spaceOnLeft > spaceOnRight;\n const tooltipMaxWidth = Math.min(isOnLeft ? spaceOnLeft : spaceOnRight, TOOLTIP_MAX_WIDTH);\n\n // Sort the entries in the tooltip from largest to smallest (to match the position of points in\n // the graph) and limit to the maximum number we can display. There could be a large number of\n // points, so we use a slightly less succinct approach to avoid sorting the whole list of points\n // and to avoid processing points that won't fit in the tooltip.\n const largestPoints: TooltipSeries[] = [];\n activePoints.forEach(({ _y1, y }, i) => {\n const total = _y1 ?? y;\n if (\n largestPoints.length < TOOLTIP_MAX_ENTRIES ||\n largestPoints[TOOLTIP_MAX_ENTRIES - 1].total < total\n ) {\n const point = {\n color: style[i]?.fill,\n key: String(i),\n labels: style[i]?.labels,\n name: style[i]?.name,\n total,\n value: valueFormatter(style[i]?.units)(y),\n };\n largestPoints.splice(\n _.sortedIndexBy(largestPoints, point, (p) => -p.total),\n 0,\n point,\n );\n }\n });\n const allSeries: TooltipSeries[] = largestPoints.slice(0, TOOLTIP_MAX_ENTRIES);\n\n // For each series we are displaying in the tooltip, create a name based on its labels. We have\n // limited space, so sort the labels to try to show the most useful first since later labels will\n // likely be cut off. Sort first by the number of unique values for the label (prefer to show\n // labels with more values because they are more helpful in identifying the series), then by the\n // length of the label (prefer to show sorter labels because space is limited).\n const allSeriesSorted: string[] = _.sortBy(\n _.without(\n _.uniq(_.flatMap(allSeries, (s) => (s.labels ? Object.keys(s.labels) : []))),\n '__name__',\n ),\n [(k) => -_.uniq(allSeries.map((s) => s.labels[k])).length, (k) => k.length],\n );\n const getSeriesName = (series: TooltipSeries): string => {\n if (_.isString(series.name)) {\n return series.name;\n }\n if (_.isEmpty(series.labels)) {\n return '{}';\n }\n // eslint-disable-next-line no-underscore-dangle\n const name = series.labels.__name__ ?? '';\n const otherLabels = _.intersection(allSeriesSorted, Object.keys(series.labels));\n return `${name}{${otherLabels.map((l) => `${l}=${series.labels[l]}`).join(',')}}`;\n };\n\n return (\n <>\n <VictoryPortal>\n <foreignObject\n height={TOOLTIP_MAX_HEIGHT}\n width={tooltipMaxWidth}\n x={isOnLeft ? x - tooltipMaxWidth : x}\n y={center.y - TOOLTIP_MAX_HEIGHT / 2}\n >\n <div\n className={classNames('query-browser__tooltip-wrap', {\n 'query-browser__tooltip-wrap--left': isOnLeft,\n })}\n >\n <div className=\"query-browser__tooltip-arrow\" />\n <div className=\"query-browser__tooltip\">\n <div className=\"query-browser__tooltip-time\">\n {dateTimeFormatterWithSeconds.format(time)}\n </div>\n {allSeries.map((s) => (\n <div className=\"query-browser__tooltip-series\" key={s.key}>\n <div className=\"query-browser__series-btn\" style={{ backgroundColor: s.color }} />\n <div className=\"co-nowrap co-truncate\">{getSeriesName(s)}</div>\n <div className=\"query-browser__tooltip-value\">{s.value}</div>\n </div>\n ))}\n </div>\n </div>\n </foreignObject>\n </VictoryPortal>\n <line className=\"query-browser__tooltip-line\" x1={x} x2={x} y1=\"0\" y2={height} />\n </>\n );\n};\nconst Tooltip = withFallback(TooltipWrapped);\n\nconst graphContainer = (\n // Set activateData to false to work around VictoryVoronoiContainer crash (see\n // https://github.com/FormidableLabs/victory/issues/1314)\n <ChartVoronoiContainer\n activateData={false}\n labelComponent={<Tooltip />}\n labels={() => ' '}\n mouseFollowTooltips\n voronoiDimension=\"x\"\n voronoiPadding={0}\n />\n);\n\nconst LegendContainer = ({ children }: { children?: React.ReactNode }) => {\n // The first child should be a <rect> with a `width` prop giving the legend's content width\n const width = children?.[0]?.[0]?.props?.width ?? '100%';\n return (\n <foreignObject height={75} width=\"100%\" y={245}>\n <div className=\"monitoring-dashboards__legend-wrap horizontal-scroll\">\n <svg width={width}>{children}</svg>\n </div>\n </foreignObject>\n );\n};\n\nconst Null = () => null;\nconst nullComponent = <Null />;\n\ntype GraphSeries = GraphDataPoint[] | null;\n\nconst getXDomain = (endTime: number, span: number): AxisDomain => [endTime - span, endTime];\n\nconst ONE_MINUTE = 60 * 1000;\n\nconst Graph: React.FC<GraphProps> = React.memo(\n ({\n allSeries,\n disabledSeries,\n fixedXDomain,\n formatSeriesTitle,\n isStack,\n showLegend,\n span,\n units,\n width,\n }) => {\n const data: GraphSeries[] = [];\n const tooltipSeriesNames: string[] = [];\n const tooltipSeriesLabels: PrometheusLabels[] = [];\n const legendData: { name: string }[] = [];\n const { t } = useTranslation();\n\n const [xDomain, setXDomain] = React.useState(fixedXDomain || getXDomain(Date.now(), span));\n\n // Only update X-axis if the time range (fixedXDomain or span) or graph data (allSeries) change\n React.useEffect(() => {\n setXDomain(fixedXDomain || getXDomain(Date.now(), span));\n }, [allSeries, span, fixedXDomain]);\n\n const domain = { x: xDomain, y: undefined };\n\n _.each(allSeries, (series, i) => {\n _.each(series, ([metric, values]) => {\n // Ignore any disabled series\n data.push(_.some(disabledSeries?.[i], (s) => _.isEqual(s, metric)) ? null : values);\n if (formatSeriesTitle) {\n const name = formatSeriesTitle(metric, i);\n legendData.push({ name });\n tooltipSeriesNames.push(name);\n } else {\n tooltipSeriesLabels.push(metric);\n }\n });\n });\n\n if (!data.some(Array.isArray)) {\n return <GraphEmpty />;\n }\n\n let yTickFormat = valueFormatter(units);\n\n if (isStack) {\n // Specify Y axis range if all values are zero, but otherwise let Chart set it automatically\n const isAllZero = _.every(allSeries, (series) =>\n _.every(series, ([, values]) => _.every(values, { y: 0 })),\n );\n if (isAllZero) {\n domain.y = [0, 1];\n }\n } else {\n // Set a reasonable Y-axis range based on the min and max values in the data\n const findMin = (series: GraphSeries): GraphDataPoint => _.minBy(series, 'y');\n const findMax = (series: GraphSeries): GraphDataPoint => _.maxBy(series, 'y');\n let minY: number = findMin(data.map(findMin))?.y ?? 0;\n let maxY: number = findMax(data.map(findMax))?.y ?? 0;\n if (minY === 0 && maxY === 0) {\n minY = 0;\n maxY = 1;\n } else if (minY > 0 && maxY > 0) {\n minY = 0;\n } else if (minY < 0 && maxY < 0) {\n maxY = 0;\n }\n\n domain.y = [minY, maxY];\n\n if (Math.abs(maxY - minY) < 0.005) {\n yTickFormat = (v: number) => (v === 0 ? '0' : v.toExponential(1));\n }\n }\n\n const xAxisTickCount = Math.round(width / 100);\n const xAxisTickShowSeconds = span < xAxisTickCount * ONE_MINUTE;\n const xAxisTickFormat = (d) => {\n if (span > parsePrometheusDuration('1d')) {\n // Add a newline between the date and time so tick labels don't overlap.\n return `${dateFormatterNoYear.format(d)}\\n${timeFormatter.format(d)}`;\n }\n if (xAxisTickShowSeconds) {\n return timeFormatterWithSeconds.format(d);\n }\n return timeFormatter.format(d);\n };\n\n const GroupComponent = isStack ? ChartStack : ChartGroup;\n const ChartComponent = isStack ? ChartArea : ChartLine;\n\n const colors = queryBrowserTheme.line.colorScale;\n\n return (\n <Chart\n containerComponent={graphContainer}\n ariaTitle={t('public~query browser chart')}\n domain={domain}\n domainPadding={{ y: 1 }}\n height={200}\n scale={{ x: 'time', y: 'linear' }}\n theme={queryBrowserTheme}\n width={width}\n >\n <ChartAxis tickCount={xAxisTickCount} tickFormat={xAxisTickFormat} />\n <ChartAxis\n crossAxis={false}\n dependentAxis\n tickComponent={nullComponent}\n tickCount={6}\n tickFormat={yTickFormat}\n />\n <GroupComponent>\n {data.map((values, i) => {\n if (values === null) {\n return null;\n }\n const color = colors[i % colors.length];\n const labels = tooltipSeriesLabels[i];\n const style = {\n data: { [isStack ? 'fill' : 'stroke']: color },\n labels: {\n fill: color,\n labels,\n name: tooltipSeriesNames[i],\n units,\n },\n };\n return (\n // We need to use the `name` prop to prevent an error in VictorySharedEvents when\n // dynamically removing and then adding back data series\n <ChartComponent\n data={values}\n groupComponent={<g />}\n key={_.map(labels, (v, k) => `${k}=${v}`).join(',')}\n name={`series-${i}`}\n style={style}\n />\n );\n })}\n </GroupComponent>\n {showLegend && !_.isEmpty(legendData) && (\n <ChartLegend\n data={legendData}\n groupComponent={<LegendContainer />}\n gutter={30}\n itemsPerRow={4}\n orientation=\"vertical\"\n style={{\n labels: { fontSize: 11, fill: 'var(--pf-v5-global--Color--100)' },\n }}\n symbolSpacer={4}\n />\n )}\n </Chart>\n );\n },\n);\n\nconst formatSeriesValues = (\n values: PrometheusValue[],\n samples: number,\n span: number,\n defaultEmptyValue: 0 | null,\n): GraphDataPoint[] => {\n const newValues = _.map(values, (v) => {\n const y = Number(v[1]);\n return {\n x: new Date(v[0] * 1000),\n y: Number.isNaN(y) ? defaultEmptyValue : y,\n };\n });\n\n // The data may have missing values, so we fill those gaps with nulls so that the graph correctly\n // shows the missing values as gaps in the line\n const start = Number(_.get(newValues, '[0].x'));\n const end = Number(_.get(_.last(newValues), 'x'));\n const step = span / samples;\n _.range(start, end, step).forEach((t, i) => {\n const x = new Date(t);\n if (_.get(newValues, [i, 'x']) > x) {\n newValues.splice(i, 0, { x, y: null });\n }\n });\n\n return newValues;\n};\n\n// Try to limit the graph to this number of data points\nconst maxDataPointsSoft = 6000;\n\n// If we have more than this number of data points, do not render the graph\nconst maxDataPointsHard = 10000;\n\n// Min and max number of data samples per data series\nconst minSamples = 10;\nconst maxSamples = 300;\n\n// Fall back to a line chart for performance if there are too many series\nconst maxStacks = 50;\n\n// We don't want to refresh all the graph data for just a small adjustment in the number of samples,\n// so don't update unless the number of samples would change by at least this proportion\nconst samplesLeeway = 0.2;\n\n// Minimum step (milliseconds between data samples) because tiny steps reduce performance for almost\n// no benefit\nconst minStep = 5 * 1000;\n\n// Don't allow zooming to less than this number of milliseconds\nconst minSpan = 30 * 1000;\n\n// Don't poll more often than this number of milliseconds\nconst minPollInterval = 10 * 1000;\n\nconst ZoomableGraph: React.FC<ZoomableGraphProps> = ({\n allSeries,\n disabledSeries,\n fixedXDomain,\n formatSeriesTitle,\n isStack,\n onZoom,\n showLegend,\n span,\n units,\n width,\n}) => {\n const [isZooming, setIsZooming] = React.useState(false);\n const [x1, setX1] = React.useState(0);\n const [x2, setX2] = React.useState(0);\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setIsZooming(false);\n }\n };\n\n const onMouseDown = (e: React.MouseEvent) => {\n setIsZooming(true);\n const x = e.clientX - e.currentTarget.getBoundingClientRect().left;\n setX1(x);\n setX2(x);\n };\n\n const onMouseMove = (e: React.MouseEvent) => {\n setX2(e.clientX - e.currentTarget.getBoundingClientRect().left);\n };\n\n const onMouseUp = (e: React.MouseEvent) => {\n setIsZooming(false);\n\n const xMin = Math.min(x1, x2);\n const xMax = Math.max(x1, x2);\n\n // Don't do anything if a range was not selected (don't zoom if you just click the graph)\n if (xMax === xMin) {\n return;\n }\n\n const zoomWidth = e.currentTarget.getBoundingClientRect().width;\n const oldFrom = _.get(fixedXDomain, '[0]', Date.now() - span);\n let from = oldFrom + (span * xMin) / zoomWidth;\n let to = oldFrom + (span * xMax) / zoomWidth;\n let newSpan = to - from;\n\n if (newSpan < minSpan) {\n newSpan = minSpan;\n const middle = (from + to) / 2;\n from = middle - newSpan / 2;\n to = middle + newSpan / 2;\n }\n onZoom(from, to);\n };\n\n // tabIndex is required to enable the onKeyDown handler\n const handlers = isZooming\n ? { onKeyDown, onMouseMove, onMouseUp, tabIndex: -1 }\n : { onMouseDown };\n\n return (\n <div className=\"query-browser__zoom\" {...handlers}>\n {isZooming && (\n <div\n className=\"query-browser__zoom-overlay\"\n style={{ left: Math.min(x1, x2), width: Math.abs(x1 - x2) }}\n />\n )}\n <Graph\n allSeries={allSeries}\n disabledSeries={disabledSeries}\n fixedXDomain={fixedXDomain}\n formatSeriesTitle={formatSeriesTitle}\n isStack={isStack}\n showLegend={showLegend}\n span={span}\n units={units}\n width={width}\n />\n </div>\n );\n};\n\nconst Loading = () => (\n <div className=\"query-browser__loading\">\n <LoadingInline />\n </div>\n);\n\nconst getMaxSamplesForSpan = (span: number) =>\n _.clamp(Math.round(span / minStep), minSamples, maxSamples);\n\nconst QueryBrowserWrapped: React.FC<QueryBrowserProps> = ({\n customDataSource,\n defaultSamples,\n defaultTimespan = parsePrometheusDuration('30m'),\n disabledSeries,\n disableZoom,\n filterLabels,\n fixedEndTime,\n formatSeriesTitle,\n GraphLink,\n hideControls,\n isStack = false,\n namespace,\n onZoom,\n pollInterval,\n queries,\n showLegend,\n showStackedControl = false,\n timespan,\n units,\n}) => {\n const { t } = useTranslation();\n const hideGraphs = useSelector(({ observe }: RootState) => !!observe.get('hideGraphs'));\n const tickInterval = useSelector(\n ({ observe }: RootState) => pollInterval ?? observe.getIn(['queryBrowser', 'pollInterval']),\n );\n const lastRequestTime = useSelector(({ observe }: RootState) =>\n observe.getIn(['queryBrowser', 'lastRequestTime']),\n );\n\n const dispatch = useDispatch();\n\n // For the default time span, use the first of the suggested span options that is at least as long\n // as defaultTimespan\n const defaultSpanText = spans.find((s) => parsePrometheusDuration(s) >= defaultTimespan);\n // If we have both `timespan` and `defaultTimespan`, `timespan` takes precedence\n const [span, setSpan] = React.useState(timespan || parsePrometheusDuration(defaultSpanText));\n\n // Limit the number of samples so that the step size doesn't fall below minStep\n const maxSamplesForSpan = defaultSamples || getMaxSamplesForSpan(span);\n\n const [xDomain, setXDomain] = React.useState<AxisDomain>();\n const [error, setError] = React.useState<PrometheusAPIError>();\n const [isDatasetTooBig, setIsDatasetTooBig] = React.useState(false);\n const [graphData, setGraphData] = React.useState<Series[][]>(null);\n const [samples, setSamples] = React.useState(maxSamplesForSpan);\n const [updating, setUpdating] = React.useState(true);\n\n const [containerRef, width] = useRefWidth();\n\n const endTime = xDomain?.[1];\n\n const safeFetch = useSafeFetch();\n\n const [isStacked, setIsStacked] = React.useState(isStack);\n\n const canStack = _.sumBy(graphData, 'length') <= maxStacks;\n\n // If provided, `timespan` overrides any existing span setting\n React.useEffect(() => {\n if (timespan) {\n setSpan(timespan);\n setSamples(defaultSamples || getMaxSamplesForSpan(timespan));\n }\n }, [defaultSamples, timespan]);\n\n React.useEffect(() => {\n setGraphData(null);\n if (fixedEndTime) {\n setXDomain(getXDomain(fixedEndTime, span));\n }\n }, [fixedEndTime, span]);\n\n React.useEffect(() => {\n if (!fixedEndTime) {\n setXDomain(undefined);\n }\n }, [fixedEndTime]);\n\n // Clear any existing series data when the namespace is changed\n React.useEffect(() => {\n dispatch(queryBrowserDeleteAllSeries());\n }, [dispatch, namespace]);\n\n const tick = () => {\n if (hideGraphs) {\n return undefined;\n }\n\n // Define this once for all queries so that they have exactly the same time range and X values\n const now = Date.now();\n\n const allPromises = _.map(queries, (query) =>\n _.isEmpty(query)\n ? Promise.resolve()\n : safeFetch(\n getPrometheusURL(\n {\n endpoint: PrometheusEndpoint.QUERY_RANGE,\n endTime: endTime || now,\n namespace,\n query,\n samples,\n timeout: '60s',\n timespan: span,\n },\n customDataSource?.basePath,\n ),\n ),\n );\n\n return Promise.all(allPromises)\n .then((responses: PrometheusResponse[]) => {\n const newResults = _.map(responses, 'data.result');\n const numDataPoints = _.sumBy(newResults, (r) => _.sumBy(r, 'values.length'));\n\n if (numDataPoints > maxDataPointsHard && samples === minSamples) {\n setIsDatasetTooBig(true);\n return;\n }\n setIsDatasetTooBig(false);\n\n const newSamples = _.clamp(\n Math.floor((samples * maxDataPointsSoft) / numDataPoints),\n minSamples,\n maxSamplesForSpan,\n );\n\n // Change `samples` if either\n // - It will change by a proportion greater than `samplesLeeway`\n // - It will change to the upper or lower limit of its allowed range\n if (\n Math.abs(newSamples - samples) / samples > samplesLeeway ||\n (newSamples !== samples &&\n (newSamples === maxSamplesForSpan || newSamples === minSamples))\n ) {\n setSamples(newSamples);\n } else {\n const newGraphData = _.map(\n newResults,\n (result: PrometheusResult[], queryIndex: number) => {\n return _.map(\n result,\n ({ metric, values }): Series => {\n // If filterLabels is specified, ignore all series that don't match\n if (_.some(filterLabels, (v, k) => _.has(metric, k) && metric[k] !== v)) {\n return [];\n }\n let defaultEmptyValue = null;\n if (isStack && _.some(values, (value) => Number.isNaN(Number(value[1])))) {\n // eslint-disable-next-line no-console\n console.warn(\n 'Invalid response values for stacked graph converted to 0 for query: ',\n queries[queryIndex],\n );\n defaultEmptyValue = 0;\n }\n return [metric, formatSeriesValues(values, samples, span, defaultEmptyValue)];\n },\n );\n },\n );\n setGraphData(newGraphData);\n\n _.each(newResults, (r, i) =>\n dispatch(queryBrowserPatchQuery(i, { series: r ? _.map(r, 'metric') : undefined })),\n );\n setUpdating(false);\n }\n setError(undefined);\n })\n .catch((err) => {\n if (err.name !== 'AbortError') {\n setError(err);\n setUpdating(false);\n }\n });\n };\n\n // Don't poll if an end time was set (because the latest data is not displayed) or if the graph is\n // hidden. Otherwise use a polling interval relative to the graph's timespan.\n let delay: number;\n if (endTime || hideGraphs || tickInterval === null) {\n delay = null;\n } else if (tickInterval > 0) {\n delay = tickInterval;\n } else {\n delay = Math.max(span / 120, minPollInterval);\n }\n\n const queriesKey = _.reject(queries, _.isEmpty).join();\n usePoll(\n tick,\n delay,\n endTime,\n filterLabels,\n namespace,\n queriesKey,\n samples,\n span,\n lastRequestTime,\n );\n\n React.useLayoutEffect(() => setUpdating(true), [endTime, namespace, queriesKey, samples, span]);\n\n const onSpanChange = React.useCallback(\n (newSpan: number) => {\n setGraphData(null);\n setXDomain(undefined);\n setSpan(newSpan);\n dispatch(queryBrowserSetTimespan(newSpan));\n setSamples(defaultSamples || getMaxSamplesForSpan(newSpan));\n },\n [defaultSamples, dispatch],\n );\n\n const isRangeVector = _.get(error, 'json.error', '').match(\n /invalid expression type \"range vector\"/,\n );\n\n if (hideGraphs) {\n // Still render the graph containers so that `width` continues to be tracked while the graph is\n // hidden. This ensures we can render at the correct width when the graph is shown again.\n return (\n <>\n {error && !isRangeVector && <Error error={error} />}\n <div className=\"query-browser__wrapper query-browser__wrapper--hidden\">\n <div className=\"graph-wrapper graph-wrapper--query-browser\">\n <div ref={containerRef} style={{ width: '100%' }} />\n </div>\n </div>\n </>\n );\n }\n\n if (isRangeVector) {\n return (\n <GraphEmptyState title={t('public~Ungraphable results')}>\n {t(\n 'public~Query results include range vectors, which cannot be graphed. Try adding a function to transform the data.',\n )}\n </GraphEmptyState>\n );\n }\n\n if (error?.json?.error?.match(/invalid expression type \"string\"/)) {\n return (\n <GraphEmptyState title={t('public~Ungraphable results')}>\n {t('public~Query result is a string, which cannot be graphed.')}\n </GraphEmptyState>\n );\n }\n\n if (isDatasetTooBig) {\n return (\n <GraphEmptyState title={t('public~Ungraphable results')}>\n {t('public~The resulting dataset is too large to graph.')}\n </GraphEmptyState>\n );\n }\n\n const zoomableGraphOnZoom = (from: number, to: number) => {\n setGraphData(null);\n setXDomain([from, to]);\n setSpan(to - from);\n setSamples(defaultSamples || getMaxSamplesForSpan(to - from));\n onZoom?.(from, to);\n };\n\n const isGraphDataEmpty = !graphData || graphData.every((d) => d.length === 0);\n const hasReducedResolution = !isGraphDataEmpty && samples < maxSamplesForSpan && !updating;\n\n return (\n <div\n className={classNames('query-browser__wrapper', {\n 'graph-empty-state': isGraphDataEmpty,\n 'graph-empty-state__loaded': isGraphDataEmpty && !updating,\n })}\n >\n {hideControls ? (\n <>{updating && <Loading />}</>\n ) : (\n <div className=\"query-browser__controls\">\n <div className=\"query-browser__controls--left\">\n <SpanControls\n defaultSpanText={defaultSpanText}\n onChange={onSpanChange}\n span={span}\n hasReducedResolution={hasReducedResolution}\n />\n {updating && <Loading />}\n </div>\n <div className=\"query-browser__controls--right\">\n {GraphLink && <GraphLink />}\n {canStack && showStackedControl && (\n <Checkbox\n id=\"stacked\"\n isChecked={isStacked}\n data-checked-state={isStacked}\n label={t('public~Stacked')}\n onChange={(_event, v) => setIsStacked(v)}\n />\n )}\n </div>\n </div>\n )}\n <div\n className={classNames('graph-wrapper graph-wrapper--query-browser', {\n 'graph-wrapper--query-browser--with-legend': showLegend && !!formatSeriesTitle,\n })}\n >\n <div ref={containerRef} style={{ width: '100%' }}>\n {error && <Error error={error} />}\n {isGraphDataEmpty && !updating && <GraphEmpty />}\n {!isGraphDataEmpty && width > 0 && (\n <>\n {disableZoom ? (\n <Graph\n allSeries={graphData}\n disabledSeries={disabledSeries}\n fixedXDomain={xDomain}\n formatSeriesTitle={formatSeriesTitle}\n isStack={canStack && isStacked}\n showLegend={showLegend}\n span={span}\n units={units}\n width={width}\n />\n ) : (\n <ZoomableGraph\n allSeries={graphData}\n disabledSeries={disabledSeries}\n fixedXDomain={xDomain}\n formatSeriesTitle={formatSeriesTitle}\n isStack={canStack && isStacked}\n onZoom={zoomableGraphOnZoom}\n showLegend={showLegend}\n span={span}\n units={units}\n width={width}\n />\n )}\n </>\n )}\n </div>\n </div>\n </div>\n );\n};\nexport const QueryBrowser = withFallback(QueryBrowserWrapped);\n\ntype AxisDomain = [number, number];\n\ntype GraphDataPoint = {\n x: Date;\n y: number;\n};\n\ntype Series = [PrometheusLabels, GraphDataPoint[]] | [];\n\ntype ErrorProps = {\n error: PrometheusAPIError;\n title?: string;\n};\n\ntype GraphEmptyStateProps = {\n children: React.ReactNode;\n title: string;\n};\n\ntype GraphProps = {\n allSeries: Series[][];\n disabledSeries?: PrometheusLabels[][];\n fixedXDomain?: AxisDomain;\n formatSeriesTitle?: FormatSeriesTitle;\n isStack?: boolean;\n showLegend?: boolean;\n span: number;\n units: string;\n width: number;\n};\n\ntype GraphOnZoom = (from: number, to: number) => void;\n\ntype ZoomableGraphProps = GraphProps & { onZoom: GraphOnZoom };\n\ntype SpanControlsProps = {\n defaultSpanText: string;\n onChange: (span: number) => void;\n span: number;\n hasReducedResolution: boolean;\n};\n\ntype TooltipProps = {\n activePoints?: { x: number; y: number; _y1?: number }[];\n center?: { x: number; y: number };\n height?: number;\n style?: { fill: string; labels: PrometheusLabels; name: string; units: string };\n width?: number;\n x?: number;\n};\n","import * as React from 'react';\n\nexport const Disabled = (props) => <div className=\"co-disabled\">{props.children}</div>;\n","import * as React from 'react';\nimport * as classNames from 'classnames';\nimport * as PropTypes from 'prop-types';\nimport { Button } from '@patternfly/react-core';\nimport { withTranslation } from 'react-i18next';\n\nclass TogglePlayWithTranslation extends React.Component {\n shouldComponentUpdate(nextProps) {\n return !!['className', 'active', 'onClick'].find(\n (prop) => nextProps[prop] !== this.props[prop],\n );\n }\n\n render() {\n const klass = classNames(\n 'co-toggle-play fa',\n this.props.className,\n this.props.active ? 'co-toggle-play--active' : 'co-toggle-play--inactive',\n );\n const { t } = this.props;\n return (\n <Button\n variant=\"plain\"\n className={klass}\n onClick={this.props.onClick}\n aria-label={\n this.props.active ? t('public~Pause event streaming') : t('public~Start streaming events')\n }\n />\n );\n }\n}\n\nexport const TogglePlay = withTranslation()(TogglePlayWithTranslation);\n\nTogglePlay.propTypes = {\n active: PropTypes.bool.isRequired,\n className: PropTypes.string,\n onClick: PropTypes.func.isRequired,\n};\n","export const cloudProviderID = (node) => {\n return node.spec.providerID ? node.spec.providerID.split('://')[0] : '';\n};\n\nexport const cloudProviderNames = (providerNames) => {\n if (providerNames.length) {\n const displayNames =\n providerNames.length === 1 ? providerNames[0] : `Hybrid (${providerNames.join(' , ')})`;\n return displayNames.replace(/aws/i, 'Amazon Web Services');\n }\n return '';\n};\n","import { useEffect } from 'react';\n\n/**\n * Hook which adds and remove a beforeunload listener depending on the lock flag.\n */\nexport const usePreventDataLossLock = (lock: boolean) => {\n useEffect(() => {\n const onBeforeUnload = (e: BeforeUnloadEvent) => {\n e.preventDefault();\n // Chrome requires returnValue to be set\n // from https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload\n e.returnValue = '';\n };\n if (lock) {\n window.addEventListener('beforeunload', onBeforeUnload);\n }\n return () => {\n window.removeEventListener('beforeunload', onBeforeUnload);\n };\n }, [lock]);\n};\n","import * as React from 'react';\nimport { saveAs } from 'file-saver';\nimport { Alert, Button } from '@patternfly/react-core';\nimport { DownloadIcon } from '@patternfly/react-icons/dist/esm/icons/download-icon';\n\nimport { coFetch } from '../../co-fetch';\n\nexport const DownloadButton: React.FC<DownloadButtonProps> = (props) => {\n const [inFlight, setInFlight] = React.useState(false);\n const [error, setError] = React.useState(null);\n\n const download = () => {\n setInFlight(true);\n setError(false);\n\n coFetch(props.url, {}, 30000)\n .then((response) => response.blob())\n .then((blob) => saveAs(blob, props.filename))\n .then(\n () => setError(null),\n (e) => setError(e),\n )\n .then(() => setInFlight(false));\n };\n\n return (\n <>\n <Button\n variant=\"primary\"\n style={{ marginBottom: 10 }}\n isDisabled={inFlight}\n type=\"button\"\n onClick={() => download()}\n >\n <DownloadIcon /> Download{inFlight && <>ing...</>}\n </Button>\n {error && (\n <Alert\n isInline\n className=\"co-alert co-break-word\"\n variant=\"danger\"\n title={error.toString()}\n />\n )}\n </>\n );\n};\n\nexport type DownloadButtonProps = {\n url: string;\n filename?: string;\n className?: string;\n};\n\nexport type DownloadButtonState = {\n inFlight: boolean;\n error: any;\n};\n\nDownloadButton.displayName = 'DownloadButton';\n","import { pluralize } from './details-page';\n\nexport const entitlementTitles = {\n nodes: {\n uppercase: 'Node',\n lowercase: 'node',\n inPairs: false,\n },\n vCPUs: {\n uppercase: 'vCPU',\n lowercase: 'vCPU',\n inPairs: true,\n },\n sockets: {\n uppercase: 'Socket',\n lowercase: 'socket',\n inPairs: true,\n },\n};\n\nexport const entitlementTitle = (name, count) => {\n const entitlement = entitlementTitles[name];\n if (!entitlement) {\n return 'Tectonic';\n }\n\n let title = entitlement.uppercase;\n if (entitlement.inPairs) {\n title = `${title} Pair`;\n count = Math.floor(count / 2);\n }\n\n return pluralize(count, title);\n};\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as _ from 'lodash-es';\nimport { CodeBlock, CodeBlockCode } from '@patternfly/react-core';\nimport { K8sResourceKind, K8sResourceKindReference } from '../../module/k8s';\nimport { DetailsItem } from './details-item';\nimport { ResourceLink } from './resource-link';\nimport { getStrategyType } from '../build';\n\nconst ImageStreamTagsReference: K8sResourceKindReference = 'ImageStreamTag';\n\nexport const BuildStrategy: React.SFC<BuildStrategyProps> = ({ resource, children }) => {\n const dockerfile = _.get(resource, 'spec.source.dockerfile');\n const devfile = _.get(resource, 'spec.source.devfile');\n const jenkinsfile = _.get(resource, 'spec.strategy.jenkinsPipelineStrategy.jenkinsfile');\n const strategyType = getStrategyType(resource.spec.strategy.type);\n const buildFromPath = ['spec', 'strategy', strategyType, 'from'];\n const buildFrom = _.get(resource, buildFromPath);\n const outputTo = _.get(resource, 'spec.output.to');\n const commitMessage = _.get(resource, 'spec.revision.git.message');\n const commitHash = _.get(resource, 'spec.revision.git.commit');\n const commitAuthorName = _.get(resource, 'spec.revision.git.author.name');\n const pushSecret = _.get(resource, 'spec.output.pushSecret');\n const resourceLimits = _.get(resource, 'spec.resources.limits');\n const triggers = _.map(resource.spec.triggers, 'type').join(', ');\n const { t } = useTranslation();\n\n return (\n <dl className=\"co-m-pane__details\">\n {children}\n <DetailsItem label={t('public~Type')} obj={resource} path=\"spec.strategy.type\" />\n <DetailsItem\n label={t('public~Git repository')}\n obj={resource}\n path=\"spec.source.git.uri\"\n hideEmpty\n />\n <DetailsItem\n label={t('public~Git ref')}\n obj={resource}\n path=\"spec.source.git.ref\"\n hideEmpty\n />\n {commitMessage && (\n <DetailsItem label={t('public~Git commit')} obj={resource} path=\"spec.revision.git.message\">\n {commitMessage}\n <br />\n {commitHash && <code className=\"co-code\">{commitHash.substring(0, 7)}</code>}{' '}\n {commitAuthorName && `by ${commitAuthorName}`}\n </DetailsItem>\n )}\n <DetailsItem\n label={t('public~Binary file')}\n obj={resource}\n path=\"spec.source.binary.asFile\"\n hideEmpty\n />\n <DetailsItem\n label={t('public~Context dir')}\n obj={resource}\n path=\"spec.source.contextDir\"\n hideEmpty\n />\n {dockerfile && (\n <DetailsItem label={t('public~Dockerfile')} obj={resource} path=\"spec.source.dockerfile\">\n <CodeBlock>\n <CodeBlockCode>{dockerfile}</CodeBlockCode>\n </CodeBlock>\n </DetailsItem>\n )}\n {devfile && (\n <DetailsItem label={t('public~Devfile')} obj={resource} path=\"spec.source.devfile\">\n <CodeBlock>\n <CodeBlockCode>{devfile}</CodeBlockCode>\n </CodeBlock>\n </DetailsItem>\n )}\n {jenkinsfile && (\n <DetailsItem\n label={t('public~Dockerfile')}\n obj={resource}\n path=\"spec.strategy.jenkinsPipelineStrategy.jenkinsfile\"\n >\n <CodeBlock>\n <CodeBlockCode>{jenkinsfile}</CodeBlockCode>\n </CodeBlock>\n </DetailsItem>\n )}\n <DetailsItem\n label={t('public~JenskinsFile path')}\n obj={resource}\n path=\"spec.strategy.jenkinsPipelineStrategy.jenkinsfilePath\"\n hideEmpty\n />\n {buildFrom && buildFrom.kind === 'ImageStreamTag' && (\n <DetailsItem label={t('public~Build from')} obj={resource} path={buildFromPath}>\n <ResourceLink\n kind={ImageStreamTagsReference}\n name={buildFrom.name}\n namespace={buildFrom.namespace || resource.metadata.namespace}\n title={buildFrom.name}\n />\n </DetailsItem>\n )}\n {buildFrom && buildFrom.kind === 'DockerImage' && (\n <DetailsItem label={t('public~Build from')} obj={resource} path={buildFromPath}>\n {buildFrom.name}\n </DetailsItem>\n )}\n {outputTo && outputTo.kind === 'ImageStreamTag' && (\n <DetailsItem label={t('public~Output to')} obj={resource} path=\"spec.output.to\">\n <ResourceLink\n kind={ImageStreamTagsReference}\n name={outputTo.name}\n namespace={outputTo.namespace || resource.metadata.namespace}\n title={outputTo.name}\n />\n </DetailsItem>\n )}\n {outputTo && outputTo.kind === 'DockerImage' && (\n <DetailsItem label={t('public~Output to')} obj={resource} path=\"spec.output.to\">\n {outputTo.name}\n </DetailsItem>\n )}\n {pushSecret && (\n <DetailsItem label={t('public~Push secret')} obj={resource} path=\"spec.output.pushSecret\">\n <ResourceLink\n kind=\"Secret\"\n name={pushSecret.name}\n namespace={resource.metadata.namespace}\n title={pushSecret.name}\n />\n </DetailsItem>\n )}\n <DetailsItem label={t('public~Run policy')} obj={resource} path=\"spec.runPolicy\" hideEmpty />\n {resourceLimits && (\n <DetailsItem\n label={t('public~Resource limits')}\n obj={resource}\n path=\"spec.resources.limits\"\n >\n {_.map(resourceLimits, (v, k) => `${k}: ${v}`).join(', ')}\n </DetailsItem>\n )}\n {triggers && (\n <DetailsItem label={t('public~Triggers')} obj={resource} path=\"spec.triggers\">\n {triggers}\n </DetailsItem>\n )}\n </dl>\n );\n};\n\nexport type BuildStrategyProps = {\n resource: K8sResourceKind;\n children?: JSX.Element[];\n};\n\nBuildStrategy.displayName = 'BuildStrategy';\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport { useTranslation } from 'react-i18next';\n\nimport { K8sResourceKind } from '../../module/k8s';\nimport { SectionHeading } from './headings';\n\nexport const BuildHooks: React.SFC<BuildHooksProps> = ({ resource }) => {\n const postCommitArgs = _.get(resource, 'spec.postCommit.args');\n const postCommitCommand = _.get(resource, 'spec.postCommit.command');\n const postCommitScript = _.get(resource, 'spec.postCommit.script');\n const { t } = useTranslation();\n\n return !_.isEmpty(postCommitCommand) || !_.isEmpty(postCommitArgs) || postCommitScript ? (\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Post-commit hooks')} />\n <dl className=\"co-m-pane__details\">\n {!_.isEmpty(postCommitCommand) && <dt>{t('public~Command')}</dt>}\n {!_.isEmpty(postCommitCommand) && (\n <dd>\n <code className=\"co-code\">{postCommitCommand.join(' ')}</code>\n </dd>\n )}\n {postCommitScript && <dt>{t('public~Script')}</dt>}\n {postCommitScript && (\n <dd>\n <code className=\"co-code\">{postCommitScript}</code>\n </dd>\n )}\n {!_.isEmpty(postCommitArgs) && <dt>{t('public~Args')}</dt>}\n {!_.isEmpty(postCommitArgs) && (\n <dd>\n <code className=\"co-code\">{postCommitArgs.join(' ')}</code>\n </dd>\n )}\n </dl>\n </div>\n ) : null;\n};\n\nexport type BuildHooksProps = {\n resource: K8sResourceKind;\n};\n\nBuildHooks.displayName = 'BuildHooks';\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport { Base64 } from 'js-base64';\nimport { PasteIcon } from '@patternfly/react-icons/dist/esm/icons/paste-icon';\nimport { Button, AlertVariant } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\n\nimport { K8sResourceKind, k8sGet } from '../../module/k8s';\nimport { ExpandableAlert } from './alerts';\nimport { SectionHeading } from './headings';\nimport { ResourceLink } from './resource-link';\nimport { useAccessReview } from './rbac';\nimport { SecretModel } from '../../models';\nimport { errorModal } from '../modals/error-modal';\n\nconst kubeAPIServerURL = window.SERVER_FLAGS.kubeAPIServerURL || 'https://<api-server>';\nenum TriggerTypes {\n Bitbucket = 'Bitbucket',\n ConfigChange = 'ConfigChange',\n Generic = 'Generic',\n GitHub = 'GitHub',\n GitLab = 'GitLab',\n ImageChange = 'ImageChange',\n}\nconst webhookTriggerTypes = new Set<TriggerTypes>([\n TriggerTypes.Bitbucket,\n TriggerTypes.Generic,\n TriggerTypes.GitHub,\n TriggerTypes.GitLab,\n]);\nconst getTriggerProperty = (trigger: WebhookTrigger) => trigger.type.toLowerCase();\n\nconst getTableColumnClasses = (canGetSecret: boolean) => {\n if (canGetSecret) {\n return [\n 'pf-v5-c-table__td',\n 'pf-v5-c-table__td pf-m-hidden pf-m-visible-on-xl pf-v5-u-w-50-on-xl pf-m-break-word',\n 'pf-v5-c-table__td pf-m-hidden pf-m-visible-on-md',\n 'pf-v5-c-table__td',\n ];\n }\n return [\n 'pf-v5-c-table__td pf-v5-u-w-16-on-md',\n 'pf-v5-c-table__td pf-v5-u-w-58-on-xl pf-m-break-word',\n 'pf-v5-c-table__td pf-m-hidden pf-m-visible-on-md pf-v5-u-w-25-on-md',\n 'pf-v5-c-table__td pf-m-hidden',\n ];\n};\n\nexport const WebhookTriggers: React.FC<WebhookTriggersProps> = (props) => {\n const { t } = useTranslation();\n const { resource } = props;\n const { name, namespace } = resource.metadata;\n const { triggers } = resource.spec;\n const canGetSecret = useAccessReview({\n group: SecretModel.apiGroup,\n resource: SecretModel.plural,\n verb: 'get',\n namespace,\n });\n const tableColumnClasses = getTableColumnClasses(canGetSecret);\n const [webhookSecrets, setWebhookSecrets] = React.useState<K8sResourceKind[]>([]);\n const [webhookTriggers, setWebhookTriggers] = React.useState<WebhookTrigger[]>([]);\n const [secretNames, setSecretNames] = React.useState<string[]>([]);\n const [secretErrors, setSecretErrors] = React.useState<string[]>([]);\n const [isLoaded, setLoaded] = React.useState(false);\n\n React.useEffect(() => {\n setWebhookTriggers((previousTriggers) => {\n const newTriggers = _.filter(triggers, ({ type }) => webhookTriggerTypes.has(type));\n return _.isEqual(previousTriggers, newTriggers) ? previousTriggers : newTriggers;\n });\n }, [triggers]);\n\n React.useEffect(() => {\n const newSecretNames: string[] = _.uniq(\n webhookTriggers.reduce((acc: string[], webhook: WebhookTrigger): string[] => {\n const triggerProperty = getTriggerProperty(webhook);\n const secretName = _.get(webhook, [triggerProperty, 'secretReference', 'name']);\n return secretName ? [...acc, secretName] : acc;\n }, []),\n );\n setSecretNames(newSecretNames);\n }, [webhookTriggers]);\n\n React.useEffect(() => {\n if (!canGetSecret) {\n return;\n }\n let errors: string[] = [];\n Promise.all(\n secretNames.map(\n (webhookName: string): Promise<K8sResourceKind> => {\n return k8sGet(SecretModel, webhookName, namespace).then(\n (secret) => secret,\n (error) => {\n errors = [...errors, `Error: ${error.message}`];\n return null;\n },\n );\n },\n ),\n ).then((secrets) => {\n setSecretErrors(errors);\n setWebhookSecrets(_.compact(secrets));\n setLoaded(true);\n });\n }, [secretNames, isLoaded, canGetSecret, namespace]);\n\n if (_.isEmpty(webhookTriggers)) {\n return null;\n }\n\n const getWebhookURL = (trigger: WebhookTrigger, secret?: string) => {\n const triggerProperty = getTriggerProperty(trigger);\n return `${kubeAPIServerURL}/apis/build.openshift.io/v1/namespaces/${namespace}/buildconfigs/${name}/webhooks/${\n secret ? secret : '<secret>'\n }/${triggerProperty}`;\n };\n\n const getSecretReference = (trigger: WebhookTrigger) => {\n const triggerProperty = getTriggerProperty(trigger);\n const secretName = _.get(trigger, [triggerProperty, 'secretReference', 'name']);\n if (!secretName) {\n return <span className=\"text-muted\">No secret</span>;\n }\n const webhookSecret: K8sResourceKind = webhookSecrets.find(\n (secret: K8sResourceKind) => secret.metadata.name === secretName,\n );\n if (!webhookSecret) {\n return secretName;\n }\n return (\n <ResourceLink kind=\"Secret\" name={secretName} namespace={namespace} title={secretName} />\n );\n };\n\n const copyWebhookToClipboard = (trigger: WebhookTrigger) => {\n const triggerProperty = getTriggerProperty(trigger);\n\n // In case of obsolete `secret` field on the trigger.\n // https://github.com/openshift/api/blob/master/build/v1/types.go#L950\n if (_.has(trigger, [triggerProperty, 'secret'])) {\n const webhookSecret = _.get(trigger, [triggerProperty, 'secret']);\n const url = getWebhookURL(trigger, webhookSecret);\n navigator.clipboard.writeText(url);\n return;\n }\n\n const secretName = _.get(trigger, [triggerProperty, 'secretReference', 'name']);\n const webhookSecret: K8sResourceKind = webhookSecrets.find(\n (secret: K8sResourceKind) => secret.metadata.name === secretName,\n );\n if (!_.has(webhookSecret, 'data.WebHookSecretKey')) {\n errorModal({\n error: t(\n 'public~Secret referenced in the {{triggerProperty}} webhook trigger does not contain \"WebHookSecretKey\" key. Webhook trigger won’t work due to the invalid secret reference',\n { triggerProperty },\n ),\n });\n return;\n }\n const webhookSecretValue = Base64.decode(webhookSecret.data.WebHookSecretKey);\n const url = getWebhookURL(trigger, webhookSecretValue);\n navigator.clipboard.writeText(url);\n };\n\n const getClipboardButton = (trigger: WebhookTrigger) => {\n const triggerProperty = getTriggerProperty(trigger);\n const plainSecret = _.get(trigger, [triggerProperty, 'secret']);\n const secretReference = _.get(trigger, [triggerProperty, 'secretReference', 'name']);\n const webhookSecret: K8sResourceKind = webhookSecrets.find(\n (secret: K8sResourceKind) => secret.metadata.name === secretReference,\n );\n return webhookSecret || plainSecret ? (\n <Button variant=\"link\" type=\"button\" onClick={() => copyWebhookToClipboard(trigger)}>\n <PasteIcon />\n \n {t('public~Copy URL with Secret')}\n </Button>\n ) : null;\n };\n\n return (\n <div className=\"co-m-pane__body\">\n {!_.isEmpty(secretErrors) && (\n <ExpandableAlert\n variant={AlertVariant.warning}\n alerts={_.map(secretErrors, (error, i) => (\n <div className=\"co-pre-line\" key={i}>\n {error}\n </div>\n ))}\n />\n )}\n <SectionHeading text={t('public~Webhooks')} />\n <div className=\"co-table-container pf-v5-c-scroll-inner-wrapper\">\n <table className=\"pf-v5-c-table pf-m-compact pf-m-border-rows\">\n <thead className=\"pf-v5-c-table__thead\">\n <tr className=\"pf-v5-c-table__tr\">\n <th className={tableColumnClasses[0]}>{t('public~Type')}</th>\n <th className={tableColumnClasses[1]}>{t('public~Webhook URL')}</th>\n <th className={tableColumnClasses[2]}>{t('public~Secret')}</th>\n <th className={tableColumnClasses[3]} />\n </tr>\n </thead>\n <tbody>\n {_.map(webhookTriggers, (trigger, i) => {\n const webhookURL = getWebhookURL(trigger);\n const secretReference = getSecretReference(trigger);\n const clipboardButton = getClipboardButton(trigger);\n return (\n <tr className=\"pf-v5-c-table__tr\" key={i}>\n <td className={tableColumnClasses[0]}>{trigger.type}</td>\n <td className={tableColumnClasses[1]}>{webhookURL || '-'}</td>\n <td className={tableColumnClasses[2]}>{secretReference}</td>\n <td className={tableColumnClasses[3]}>{clipboardButton}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n\nexport type WebhookTriggersProps = {\n resource: K8sResourceKind;\n};\n\nexport type WebhookTrigger = {\n type: string;\n [key: string]: any;\n};\n\nWebhookTriggers.displayName = 'WebhookTriggers';\n","import * as React from 'react';\n\n// When pages share a resource (e.g., pod.jsx and container.jsx),\n// the scroll position will be maintained when navigating between\n// pages. Use <ScrollToTopOnMount /> to always reset the scroll position\n// back to the top of the navigated to page when pages share a resource.\nexport class ScrollToTopOnMount extends React.Component {\n componentDidMount() {\n document.getElementById('content-scrollable').scrollTop = 0;\n }\n\n render() {\n return null;\n }\n}\n\nexport const useScrollToTopOnMount = () =>\n React.useEffect(() => {\n document.getElementById('content-scrollable').scrollTop = 0;\n }, []);\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport { useTranslation } from 'react-i18next';\nimport { ContainerSpec } from '../../module/k8s';\n\nconst ContainerRow: React.FC<ContainerRowProps> = ({ container }) => {\n const resourceLimits = _.get(container, 'resources.limits');\n const ports = _.get(container, 'ports');\n return (\n <div className=\"row\">\n <div className=\"col-xs-5 col-sm-4 col-md-3 co-break-word\">{container.name}</div>\n <div className=\"col-xs-7 col-sm-5 co-break-all co-select-to-copy\">\n {container.image || '-'}\n </div>\n <div className=\"col-sm-3 col-md-2 hidden-xs\">\n {_.map(resourceLimits, (v, k) => `${k}: ${v}`).join(', ') || '-'}\n </div>\n <div className=\"col-md-2 hidden-xs hidden-sm co-break-word\">\n {_.map(ports, (port) => `${port.containerPort}/${port.protocol}`).join(', ') || '-'}\n </div>\n </div>\n );\n};\n\nexport const ContainerTable: React.FC<ContainerTableProps> = ({ containers }) => {\n const { t } = useTranslation();\n return (\n <div className=\"co-m-table-grid co-m-table-grid--bordered\">\n <div className=\"row co-m-table-grid__head\">\n <div className=\"col-xs-5 col-sm-4 col-md-3\">{t('public~Name')}</div>\n <div className=\"col-xs-7 col-sm-5\">{t('public~Image')}</div>\n <div className=\"col-sm-3 col-md-2 hidden-xs\">{t('public~Resource limits')}</div>\n <div className=\"col-md-2 hidden-xs hidden-sm\">{t('public~Ports')}</div>\n </div>\n <div className=\"co-m-table-grid__body\">\n {_.map(containers, (c, i) => (\n <ContainerRow key={i} container={c} />\n ))}\n </div>\n </div>\n );\n};\n\nexport type ContainerRowProps = {\n container: ContainerSpec;\n};\n\nexport type ContainerTableProps = {\n containers: ContainerSpec[];\n};\n","import * as React from 'react';\nimport * as classNames from 'classnames';\nimport * as _ from 'lodash-es';\nimport { withTranslation } from 'react-i18next';\n\nclass SimpleTab extends React.PureComponent<SimpleTabProps> {\n constructor(props) {\n super(props);\n this.onClick = this.onClick.bind(this);\n }\n\n onClick() {\n this.props.onClick(this.props.title);\n }\n\n render() {\n const { active, title } = this.props;\n const className = classNames('co-m-horizontal-nav__menu-item', {\n 'co-m-horizontal-nav-item--active': active,\n });\n return (\n <li className={className} data-test-id={`horizontal-link-${title}`}>\n <button onClick={this.onClick} type=\"button\">\n {title}\n </button>\n </li>\n );\n }\n}\n\nclass SimpleTabNav_ extends React.Component<SimpleTabNavProps, SimpleTabNavState> {\n constructor(props) {\n super(props);\n this.state = { selectedTab: props.selectedTab };\n }\n\n onClickTab = (name) => {\n this.props.onClickTab && this.props.onClickTab(name);\n this.setState({\n selectedTab: name,\n });\n };\n\n static getDerivedStateFromProps(nextProps, prevState) {\n const selectedTab = (\n _.find(nextProps.tabs, { name: prevState.selectedTab }) ||\n _.find(nextProps.tabs, { name: nextProps.selectedTab }) ||\n _.head(nextProps.tabs)\n ).name;\n if (prevState.selectedTab !== selectedTab) {\n return {\n selectedTab,\n };\n }\n return null;\n }\n\n render() {\n const { tabs, tabProps, additionalClassNames } = this.props;\n const { selectedTab } = this.state;\n const selectedTabData = _.find(tabs, { name: selectedTab }) || _.head(tabs);\n const content =\n !React.isValidElement(selectedTabData.component) && !Array.isArray(selectedTabData.component)\n ? React.createElement(selectedTabData.component, tabProps)\n : selectedTabData.component;\n\n return (\n <>\n <ul className={classNames('co-m-horizontal-nav__menu', additionalClassNames)}>\n {_.map(tabs, (tab) => (\n <SimpleTab\n key={tab.name}\n active={selectedTabData.name === tab.name}\n onClick={this.onClickTab}\n title={tab.name}\n data-test={`horizonta-link-${tab.name}`}\n />\n ))}\n </ul>\n {content}\n </>\n );\n }\n}\n\nexport const SimpleTabNav = withTranslation()(SimpleTabNav_) as React.FC<SimpleTabNavProps>;\n\nexport type Tab = {\n name: string;\n component: React.FunctionComponent<{}> | React.ReactElement;\n};\n\ntype SimpleTabNavProps = {\n onClickTab?: (name: string) => void;\n selectedTab?: string;\n tabProps: any;\n tabs: Tab[];\n additionalClassNames?: string;\n};\n\ntype SimpleTabNavState = {\n selectedTab: string;\n};\n\ntype SimpleTabProps = {\n active: boolean;\n onClick: (title: string) => void;\n title: string;\n};\n","import * as React from 'react';\nimport { Dropdown } from './dropdown';\nimport { useTranslation } from 'react-i18next';\nimport { NumberSpinner } from './number-spinner';\n\nexport const RequestSizeInput: React.FC<RequestSizeInputProps> = ({\n children,\n defaultRequestSizeUnit,\n defaultRequestSizeValue,\n describedBy,\n dropdownUnits,\n inputID,\n isInputDisabled,\n minValue,\n name,\n onChange,\n placeholder,\n required,\n testID,\n}) => {\n const parsedRequestSizeValue = parseInt(defaultRequestSizeValue, 10);\n const defaultValue = Number.isFinite(parsedRequestSizeValue) ? parsedRequestSizeValue : null;\n const [unit, setUnit] = React.useState<string>(defaultRequestSizeUnit);\n const [value, setValue] = React.useState<number>(defaultValue);\n\n const onValueChange: React.ReactEventHandler<HTMLInputElement> = (event) => {\n setValue(parseInt(event.currentTarget.value, 10));\n onChange({ value: event.currentTarget.value, unit });\n };\n\n const changeValueBy = (changeBy: number) => {\n // When default defaultRequestSizeValue is not set, value becomes NaN and increment decrement buttons of NumberSpinner don't work.\n const newValue = Number.isFinite(value) ? value + changeBy : 0 + changeBy;\n setValue(newValue);\n onChange({ value: newValue, unit });\n };\n\n const onUnitChange = (newUnit) => {\n setUnit(newUnit);\n onChange({ value, unit: newUnit });\n };\n\n React.useEffect(() => {\n setUnit(defaultRequestSizeUnit);\n setValue(defaultValue);\n }, [defaultRequestSizeUnit, defaultValue]);\n\n const { t } = useTranslation();\n const inputName = `${name}Value`;\n const dropdownName = `${name}Unit`;\n return (\n <div>\n <div className=\"pf-v5-c-input-group\">\n <NumberSpinner\n onChange={onValueChange}\n changeValueBy={changeValueBy}\n placeholder={placeholder}\n aria-describedby={describedBy}\n name={inputName}\n id={inputID}\n data-test={testID}\n required={required}\n value={value}\n min={minValue}\n disabled={isInputDisabled}\n />\n <Dropdown\n title={dropdownUnits[defaultRequestSizeUnit]}\n selectedKey={defaultRequestSizeUnit}\n name={dropdownName}\n className=\"request-size-input__unit\"\n items={dropdownUnits}\n onChange={onUnitChange}\n disabled={isInputDisabled}\n required={required}\n ariaLabel={t('public~Number of {{sizeUnit}}', {\n sizeUnit: dropdownUnits[unit],\n })}\n />\n </div>\n {children}\n </div>\n );\n};\n\nexport type RequestSizeInputProps = {\n placeholder?: string;\n name: string;\n onChange: Function;\n required?: boolean;\n dropdownUnits: any;\n defaultRequestSizeUnit: string;\n defaultRequestSizeValue: string;\n describedBy?: string;\n step?: number;\n minValue?: number;\n inputID?: string;\n testID?: string;\n isInputDisabled?: boolean;\n};\n","import * as React from 'react';\nimport { Alert, AlertActionLink } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\n\nimport { K8sKind, k8sPatch, k8sUpdate, K8sResourceKind } from '../../module/k8s/index';\nimport { errorModal } from '../modals/index';\n\nexport const togglePaused = (model: K8sKind, obj: K8sResourceKind) => {\n // a MachineConfigPool can be created without a spec, despite the API saying it is required\n if (!obj.spec) {\n const newObj = {\n ...obj,\n spec: {\n ...(obj.spec || {}),\n paused: true,\n },\n };\n\n return k8sUpdate(model, newObj);\n }\n\n const patch = [\n {\n path: '/spec/paused',\n op: 'add',\n value: !obj.spec.paused,\n },\n ];\n\n return k8sPatch(model, obj, patch);\n};\n\nexport const WorkloadPausedAlert = ({ model, obj }) => {\n const { t } = useTranslation();\n return (\n <Alert\n isInline\n className=\"co-alert\"\n variant=\"info\"\n title={<>{t('public~{{ metadataName }} is paused', { metadataName: obj.metadata.name })}</>}\n actionLinks={\n <AlertActionLink\n onClick={() =>\n togglePaused(model, obj).catch((err) => errorModal({ error: err.message }))\n }\n >\n {obj.kind === 'MachineConfigPool'\n ? t('public~Resume updates')\n : t('public~Resume rollouts')}\n </AlertActionLink>\n }\n >\n {t('public~This will stop any new rollouts or triggers from running until resumed.')}\n </Alert>\n );\n};\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport * as classNames from 'classnames';\nimport { Button } from '@patternfly/react-core';\nimport { PlusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon';\nimport { MinusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/minus-circle-icon';\n/* eslint-disable-next-line */\nimport { withTranslation, WithTranslation } from 'react-i18next';\n\nclass ListInput_ extends React.Component<ListInputProps, ListInputState> {\n private helpID: string = _.uniqueId('list-view-help-');\n constructor(props: ListInputProps) {\n super(props);\n this.state = {\n values: props.initialValues || [''],\n };\n }\n\n componentDidUpdate(prevProps: ListInputProps, prevState: ListInputState) {\n if (prevState.values !== this.state.values) {\n const values = _.compact(this.state.values);\n this.props.onChange(values);\n }\n }\n\n valueChanged(i: number, v: string) {\n this.setState((state) => {\n const values = [...state.values];\n values[i] = v;\n return { values };\n });\n }\n\n addValue() {\n this.setState((state) => ({ values: [...state.values, ''] }));\n }\n\n removeValue(i: number) {\n this.setState((state) => {\n const values = [...state.values];\n values.splice(i, 1);\n return {\n values: _.isEmpty(values) ? [''] : values,\n };\n });\n }\n\n render() {\n const { label, required, helpText, t } = this.props;\n const { values } = this.state;\n const missingValues = required && (_.isEmpty(values) || _.every(values, (v) => !v));\n const isEmpty = values.length === 1 && (_.isEmpty(values) || _.every(values, (v) => !v));\n return (\n <div className=\"form-group\">\n <label className={classNames('control-label', { 'co-required': required })}>{label}</label>\n {_.map(values, (v: string, i: number) => (\n <div className=\"co-list-input__row\" key={i}>\n <div className=\"co-list-input__value\">\n <input\n className=\"pf-v5-c-form-control\"\n type=\"text\"\n value={v}\n onChange={(e: React.FormEvent<HTMLInputElement>) =>\n this.valueChanged(i, e.currentTarget.value)\n }\n required={missingValues && i === 0}\n aria-describedby={helpText ? this.helpID : undefined}\n data-test-list-input-for={label}\n />\n </div>\n <Button\n type=\"button\"\n className=\"pairs-list__span-btns\"\n onClick={() => this.removeValue(i)}\n aria-label={t('public~Remove')}\n variant=\"plain\"\n disabled={isEmpty}\n >\n <MinusCircleIcon className=\"pairs-list__side-btn pairs-list__delete-icon\" />\n </Button>\n </div>\n ))}\n {helpText && (\n <div className=\"co-list-input__help-block help-block\" id={this.helpID}>\n {helpText}\n </div>\n )}\n <Button\n className=\"pf-m-link--align-left\"\n onClick={() => this.addValue()}\n type=\"button\"\n variant=\"link\"\n >\n <PlusCircleIcon className=\"co-icon-space-r\" />\n {t('public~Add more')}\n </Button>\n </div>\n );\n }\n}\n\nexport const ListInput = withTranslation()(ListInput_);\n\ntype ListInputState = {\n values: string[];\n};\n\ntype ChangeCallback = (values: string[]) => void;\n\ntype ListInputProps = WithTranslation & {\n label: string;\n initialValues?: string[];\n onChange: ChangeCallback;\n helpText?: string;\n required?: boolean;\n};\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\n\nimport { Volume } from '../../module/k8s';\nimport { getVolumeLocation, getVolumeType } from '../../module/k8s/pods';\nimport { ResourceLink } from './resource-link';\n\nexport const VolumeType: React.FC<VolumeTypeProps> = ({ volume, namespace }) => {\n if (volume) {\n if (volume.secret) {\n return <ResourceLink kind=\"Secret\" name={volume.secret.secretName} namespace={namespace} />;\n }\n\n if (volume.configMap) {\n return <ResourceLink kind=\"ConfigMap\" name={volume.configMap.name} namespace={namespace} />;\n }\n\n if (volume.persistentVolumeClaim) {\n return (\n <ResourceLink\n kind=\"PersistentVolumeClaim\"\n name={volume.persistentVolumeClaim.claimName}\n namespace={namespace}\n />\n );\n }\n }\n\n const type = getVolumeType(volume);\n const loc = _.trim(getVolumeLocation(volume));\n return type ? (\n <>\n {type.label}\n {loc && (\n <>\n {' '}\n (<span className=\"co-break-word co-select-to-copy\">{loc}</span>)\n </>\n )}\n </>\n ) : null;\n};\n\nexport type VolumeTypeProps = {\n volume: Volume;\n namespace: string;\n};\n","import * as React from 'react';\n\n// 12 works well because it divides evenly for 2, 3, and 4 column layouts\nconst skeletonTiles = Array.from({ length: 12 }, (_, k: number) => (\n <div key={k} className=\"skeleton-catalog--tile\" />\n));\nexport const skeletonCatalog = (\n <div className=\"loading-skeleton--catalog\">\n <div className=\"skeleton-catalog--list\" />\n <div className=\"skeleton-catalog--grid\">{skeletonTiles}</div>\n </div>\n);\n","import * as React from 'react';\nimport classNames from 'classnames';\n\nexport const HintBlock: React.FC<HintBlockProps> = ({ title, children, className }) => {\n const classes = classNames('co-hint-block', className);\n\n return (\n <div className={classes}>\n <h2 className=\"co-hint-block__title h4\">{title}</h2>\n <div className=\"co-hint-block__body\">{children}</div>\n </div>\n );\n};\n\nexport type HintBlockProps = {\n title: string;\n children: React.ReactNode;\n className?: string;\n};\n","import * as React from 'react';\nimport { OverviewItem } from '@console/shared';\nimport { OwnerReferences } from './owner-references';\nimport { useTranslation } from 'react-i18next';\n\nconst OperatorBackedOwnerReferences: React.FC<OperatorBackedOwnerReferencesProps> = ({ item }) => {\n const { t } = useTranslation();\n\n return item.isOperatorBackedService ? (\n <span className=\"sidebar__section-owner-operator-heading\">\n {t('public~Managed by:')}\n <span className=\"sidebar__section-owner-reference-operator\">\n <OwnerReferences resource={item.obj} />\n </span>\n </span>\n ) : null;\n};\n\ntype OperatorBackedOwnerReferencesProps = {\n item: OverviewItem;\n};\n\nOperatorBackedOwnerReferences.displayName = 'OperatorBackedOwnerReferences';\n\nexport default OperatorBackedOwnerReferences;\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { getReleaseNotesLink } from '../../module/k8s';\nimport { ExternalLink } from '../utils';\n\nexport const ReleaseNotesLink: React.FC<ReleaseNotesLinkProps> = ({ version }) => {\n const releaseNotesLink = getReleaseNotesLink(version);\n const { t } = useTranslation();\n return (\n releaseNotesLink && (\n <ExternalLink text={t('public~View release notes')} href={releaseNotesLink} />\n )\n );\n};\n\ntype ReleaseNotesLinkProps = {\n version: string;\n};\n","export * from './notification-drawer';\n","export { default as NotificationDrawer } from './notification-drawer';\nexport { default as NotificationDrawerHeading } from './notification-drawer-heading';\nexport { default as NotificationEntry, NotificationTypes } from './notification-entry';\nexport { default as NotificationCategory } from './notification-category';\n","import * as React from 'react';\nimport { Drawer, DrawerContent, DrawerPanelContent, DrawerPanelBody } from '@patternfly/react-core';\n\nimport NotificationDrawerHeading from './notification-drawer-heading';\n\nconst NotificationDrawer: React.FC<NotificationDrawerProps> = ({\n isExpanded,\n isInline,\n children,\n notificationEntries,\n className,\n onClose,\n}) => {\n // Added check for `isExpanded` due to flaw in patternfly drawer. Remove the check on patternfly version upgrade\n const panelContent = isExpanded && (\n <DrawerPanelContent className={className}>\n <NotificationDrawerHeading onClose={onClose}>{notificationEntries}</NotificationDrawerHeading>\n <DrawerPanelBody hasNoPadding />\n </DrawerPanelContent>\n );\n return (\n <Drawer isExpanded={isExpanded} isInline={isInline}>\n <DrawerContent panelContent={panelContent}>{children}</DrawerContent>\n </Drawer>\n );\n};\n\nNotificationDrawer.displayName = 'NotificationDrawer';\n\nexport type NotificationDrawerProps = {\n isInline: boolean;\n isExpanded: boolean;\n notificationEntries?: JSX.Element[];\n count?: number;\n children: React.ReactNode;\n className: string;\n /** A callback for when the close button is clicked */\n onClose: () => void;\n};\n\nexport default NotificationDrawer;\n","import * as React from 'react';\nimport * as classNames from 'classnames';\nimport { Badge } from '@patternfly/react-core';\n\nconst NotificationCategory: React.FC<NotificationCategoryProps> = ({\n label,\n count,\n isExpanded,\n children,\n onExpandContents,\n}) => (\n <section\n className={classNames('query-pf-v5-c-notification-drawer__group', {\n 'pf-m-expanded': isExpanded,\n })}\n >\n <button\n className=\"pf-v5-c-notification-drawer__group-toggle\"\n aria-expanded={isExpanded}\n onClick={() => onExpandContents(!isExpanded)}\n >\n <div className=\"pf-v5-c-notification-drawer__group-toggle-title\">{label}</div>\n <div className=\"pf-v5-c-notification-drawer__group-toggle-count\">\n <Badge isRead>{count}</Badge>\n </div>\n <span className=\"pf-v5-c-notification-drawer__group-toggle-icon\">\n <i\n className={classNames({\n 'fas fa-angle-down': isExpanded,\n 'fas fa-angle-right': !isExpanded,\n })}\n aria-hidden={!isExpanded}\n />\n </span>\n </button>\n <ul className=\"pf-v5-c-notification-drawer__list\" hidden={!isExpanded}>\n {children}\n </ul>\n </section>\n);\n\ntype NotificationCategoryProps = {\n children: React.ReactNode;\n count: number;\n isExpanded: boolean;\n label: string;\n onExpandContents: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport default NotificationCategory;\n","import * as React from 'react';\nimport { useK8sWatchResources } from '@console/internal/components/utils/k8s-watch-hook';\nimport { K8sResourceKind } from '@console/internal/module/k8s';\nimport { BuildConfigOverviewItem } from '../types';\nimport { getBuildConfigsForResource } from '../utils';\n\nexport type BuildConfigData = {\n loaded: boolean;\n loadError: string;\n buildConfigs: BuildConfigOverviewItem[];\n};\n\nexport const useBuildConfigsWatcher = (resource: K8sResourceKind): BuildConfigData => {\n const { namespace } = resource.metadata;\n const watchedResources = React.useMemo(\n () => ({\n buildConfigs: {\n isList: true,\n kind: 'BuildConfig',\n namespace,\n },\n builds: {\n isList: true,\n kind: 'Build',\n namespace,\n },\n }),\n [namespace],\n );\n\n const resources = useK8sWatchResources(watchedResources);\n\n const result = React.useMemo(() => {\n const resourceWithLoadError = Object.values(resources).find((r) => r.loadError);\n if (resourceWithLoadError) {\n return { loaded: false, loadError: resourceWithLoadError.loadError, buildConfigs: null };\n }\n if (\n Object.keys(resources).length > 0 &&\n Object.keys(resources).every((key) => resources[key].loaded)\n ) {\n const resourceBuildConfigs = getBuildConfigsForResource(resource, resources);\n return { loaded: true, loadError: null, buildConfigs: resourceBuildConfigs };\n }\n return { loaded: false, loadError: null, buildConfigs: null };\n }, [resource, resources]);\n\n return result;\n};\n","export const joinGrammaticallyListOfItems = (items: string[], separator = 'and') => {\n const result = items.join(', ');\n const lastCommaIdx = result.lastIndexOf(',');\n\n return items.length > 1 && lastCommaIdx >= 0\n ? `${result.substr(0, lastCommaIdx)} ${separator}${result.substr(lastCommaIdx + 1)}`\n : result;\n};\n\nexport const assureEndsWith = (sentence: string, appendix: string) => {\n if (!sentence || !appendix || sentence.endsWith(appendix)) {\n return sentence;\n }\n\n return `${sentence}${appendix}`;\n};\n","import * as React from 'react';\nimport { ChartLabel } from '@patternfly/react-charts';\nimport * as classNames from 'classnames';\nimport i18next, { TFunction } from 'i18next';\nimport * as _ from 'lodash';\nimport { ImpersonateKind, useSafetyFirst } from '@console/dynamic-plugin-sdk';\nimport { DaemonSetModel, PodModel, JobModel, CronJobModel } from '@console/internal/models';\nimport {\n K8sResourceKind,\n K8sKind,\n SelfSubjectAccessReviewKind,\n HorizontalPodAutoscalerKind,\n} from '@console/internal/module/k8s';\nimport { RevisionModel } from '@console/knative-plugin';\nimport { AllPodStatus } from '../constants';\nimport { ExtPodKind } from '../types';\nimport { checkPodEditAccess, getPodStatus } from './pod-utils';\n\nimport './pod-ring-text.scss';\n\ntype PodRingLabelType = {\n subTitle: string;\n title: string;\n titleComponent: React.ReactElement;\n};\n\ntype PodRingLabelData = {\n title: string;\n longTitle: boolean;\n subTitle: string;\n longSubtitle: boolean;\n reversed: boolean;\n};\n\nconst podKindString = (count: number) =>\n count === 1 ? i18next.t('console-shared~Pod') : i18next.t('console-shared~Pods');\n\nconst isPendingPods = (\n pods: ExtPodKind[],\n currentPodCount: number,\n desiredPodCount: number,\n): boolean =>\n (pods?.length === 1 && pods[0].status?.phase === 'Pending') ||\n (!currentPodCount && !!desiredPodCount);\n\nexport const getFailedPods = (pods: ExtPodKind[]): number => {\n if (!pods?.length) {\n return 0;\n }\n\n return pods.reduce((acc, currValue) => {\n if ([AllPodStatus.CrashLoopBackOff, AllPodStatus.Failed].includes(getPodStatus(currValue))) {\n return acc + 1;\n }\n return acc;\n }, 0);\n};\n\nconst getTitleAndSubtitle = (\n isPending: boolean,\n currentPodCount: number,\n desiredPodCount: number,\n t: TFunction,\n) => {\n let titlePhrase;\n let subTitlePhrase = '';\n let longTitle = false;\n let longSubtitle = false;\n\n // handles the initial state when the first pod is coming up and the state for no pods(scaled to zero)\n if (!currentPodCount) {\n titlePhrase = isPending ? '0' : t('console-shared~Scaled to 0');\n longTitle = !isPending;\n if (desiredPodCount) {\n subTitlePhrase = t('console-shared~Scaling to {{podSubTitle}}', {\n podSubTitle: desiredPodCount,\n });\n longSubtitle = true;\n }\n }\n\n // handles the idle state or scaling to desired no. of pods\n if (currentPodCount) {\n titlePhrase = currentPodCount.toString();\n if (currentPodCount === desiredPodCount) {\n subTitlePhrase = podKindString(currentPodCount);\n } else {\n subTitlePhrase = t('console-shared~Scaling to {{podSubTitle}}', {\n podSubTitle: desiredPodCount,\n });\n longSubtitle = true;\n }\n }\n\n return { title: titlePhrase, longTitle, subTitle: subTitlePhrase, longSubtitle };\n};\n\nconst getTitleComponent = (\n longTitle: boolean = false,\n longSubtitle: boolean = false,\n reversed: boolean = false,\n) => {\n const labelClasses = classNames('pf-v5-chart-donut-title', {\n 'pod-ring__center-text--reversed': reversed,\n 'pod-ring__center-text': !reversed,\n 'pod-ring__long-text': longTitle,\n });\n return React.createElement(ChartLabel, {\n dy: longSubtitle ? -5 : 0,\n style: { lineHeight: '11px' },\n className: labelClasses,\n });\n};\n\nexport const podRingLabel = (\n obj: K8sResourceKind,\n ownerKind: string,\n pods: ExtPodKind[],\n t: TFunction,\n): PodRingLabelData => {\n let currentPodCount;\n let desiredPodCount;\n let isPending;\n let titleData;\n const podRingLabelData: PodRingLabelData = {\n title: '',\n subTitle: '',\n longTitle: false,\n longSubtitle: false,\n reversed: false,\n };\n\n const failedPodCount = getFailedPods(pods);\n switch (ownerKind) {\n case DaemonSetModel.kind:\n currentPodCount = (obj.status?.currentNumberScheduled || 0) + failedPodCount;\n desiredPodCount = obj.status?.desiredNumberScheduled;\n desiredPodCount = obj.status?.desiredNumberScheduled;\n isPending = isPendingPods(pods, currentPodCount, desiredPodCount);\n titleData = getTitleAndSubtitle(isPending, currentPodCount, desiredPodCount, t);\n podRingLabelData.title = titleData.title;\n podRingLabelData.subTitle = titleData.subTitle;\n podRingLabelData.longSubtitle = titleData.longSubtitle;\n break;\n case RevisionModel.kind:\n currentPodCount = (obj.status?.readyReplicas || 0) + failedPodCount;\n desiredPodCount = obj.spec?.replicas;\n isPending = isPendingPods(pods, currentPodCount, desiredPodCount);\n if (!isPending && !desiredPodCount) {\n podRingLabelData.title = t('console-shared~Autoscaled');\n podRingLabelData.subTitle = t('console-shared~to 0');\n podRingLabelData.reversed = true;\n break;\n }\n if (isPending) {\n podRingLabelData.title = '0';\n podRingLabelData.subTitle = t('console-shared~Scaling to {{podSubTitle}}', {\n podSubTitle: desiredPodCount,\n });\n } else {\n podRingLabelData.title = currentPodCount;\n podRingLabelData.subTitle = podKindString(currentPodCount);\n }\n break;\n case PodModel.kind:\n case JobModel.kind:\n podRingLabelData.title = '1';\n podRingLabelData.subTitle = PodModel.label;\n break;\n case CronJobModel.kind:\n podRingLabelData.title = `${pods.length}`;\n podRingLabelData.subTitle = podKindString(currentPodCount);\n break;\n default:\n currentPodCount = (obj.status?.readyReplicas || 0) + failedPodCount;\n desiredPodCount = obj.spec?.replicas;\n isPending = isPendingPods(pods, currentPodCount, desiredPodCount);\n titleData = getTitleAndSubtitle(isPending, currentPodCount, desiredPodCount, t);\n podRingLabelData.title = titleData.title;\n podRingLabelData.subTitle = titleData.subTitle;\n podRingLabelData.longTitle = titleData.longTitle;\n podRingLabelData.longSubtitle = titleData.longSubtitle;\n break;\n }\n\n return podRingLabelData;\n};\n\nexport const hpaPodRingLabel = (\n obj: K8sResourceKind,\n hpa: HorizontalPodAutoscalerKind,\n pods: ExtPodKind[],\n t: TFunction,\n): PodRingLabelData => {\n const desiredPodCount = obj.spec?.replicas;\n const desiredPods = hpa.status?.desiredReplicas || desiredPodCount;\n const currentPods = hpa.status?.currentReplicas;\n const scaling =\n (!currentPods && !!desiredPods) || !pods?.every((p) => p.status?.phase === 'Running');\n return {\n title: scaling ? t('console-shared~Autoscaling') : t('console-shared~Autoscaled'),\n subTitle: t('console-shared~to {{count}} Pod', { count: desiredPods }),\n longTitle: false,\n longSubtitle: false,\n reversed: true,\n };\n};\n\nexport const usePodRingLabel = (\n obj: K8sResourceKind,\n ownerKind: string,\n pods: ExtPodKind[],\n hpaControlledScaling: boolean = false,\n t: TFunction,\n hpa?: HorizontalPodAutoscalerKind,\n): PodRingLabelType => {\n const podRingLabelData = hpaControlledScaling\n ? hpaPodRingLabel(obj, hpa, pods, t)\n : podRingLabel(obj, ownerKind, pods, t);\n const { title, subTitle, longTitle, longSubtitle, reversed } = podRingLabelData;\n\n return React.useMemo(\n () => ({\n title,\n subTitle,\n titleComponent: getTitleComponent(longTitle, longSubtitle, reversed),\n }),\n [longSubtitle, longTitle, reversed, subTitle, title],\n );\n};\n\nexport const usePodScalingAccessStatus = (\n obj: K8sResourceKind,\n resourceKind: K8sKind,\n pods: ExtPodKind[],\n enableScaling?: boolean,\n impersonate?: ImpersonateKind,\n) => {\n const isKnativeRevision = obj.kind === 'Revision';\n const isPod = obj.kind === 'Pod';\n const isScalingAllowed = !isKnativeRevision && !isPod && enableScaling;\n const [editable, setEditable] = useSafetyFirst(false);\n\n React.useEffect(() => {\n if (isScalingAllowed) {\n checkPodEditAccess(obj, resourceKind, impersonate, 'scale')\n .then((resp: SelfSubjectAccessReviewKind) =>\n setEditable(_.get(resp, 'status.allowed', false)),\n )\n .catch((error) => {\n // console.log is used here instead of throw error\n // throw error will break the thread and likely end-up in a white screen\n // eslint-disable-next-line\n console.log('Checking pod edit acceess failed:', error);\n setEditable(false);\n });\n }\n }, [pods, obj, resourceKind, impersonate, setEditable, isScalingAllowed]);\n\n return editable;\n};\n","import { KebabOption } from '@console/internal/components/utils';\nimport { K8sKind, K8sResourceKind } from '@console/internal/module/k8s';\nimport { setSinkSourceModal } from '../components/modals';\n\nexport const setSinkSource = (model: K8sKind, source: K8sResourceKind): KebabOption => {\n return {\n // t('knative-plugin~Move sink')\n labelKey: 'knative-plugin~Move sink',\n callback: () =>\n setSinkSourceModal({\n source,\n }),\n accessReview: {\n group: model.apiGroup,\n resource: model.plural,\n name: source.metadata.name,\n namespace: source.metadata.namespace,\n verb: 'update',\n },\n };\n};\n","import {\n CronJobModel,\n DeploymentConfigModel,\n DeploymentModel,\n StatefulSetModel,\n} from '@console/internal/models';\nimport {\n apiVersionForModel,\n K8sResourceKind,\n PodKind,\n WatchK8sResources,\n} from '@console/internal/module/k8s';\nimport { PodRCData } from '../types';\nimport {\n getJobsForCronJob,\n getPodsForResource,\n getReplicaSetsForResource,\n getReplicationControllersForResource,\n getRolloutStatus,\n getStatefulSetsResource,\n} from './resource-utils';\n\nexport const getPodsForDeploymentConfig = (\n deploymentConfig: K8sResourceKind,\n resources: any,\n): PodRCData => {\n const obj: K8sResourceKind = {\n ...deploymentConfig,\n apiVersion: apiVersionForModel(DeploymentConfigModel),\n kind: DeploymentConfigModel.kind,\n };\n const { visibleReplicationControllers } = getReplicationControllersForResource(obj, resources);\n const [current, previous] = visibleReplicationControllers;\n const isRollingOut = getRolloutStatus(obj, current, previous);\n return {\n obj,\n current,\n previous,\n pods: [...(current?.pods || []), ...(previous?.pods || [])],\n isRollingOut,\n };\n};\n\nexport const getPodsForDeploymentConfigs = (\n deploymentConfigs: K8sResourceKind[],\n resources: any,\n): PodRCData[] =>\n deploymentConfigs ? deploymentConfigs.map((dc) => getPodsForDeploymentConfig(dc, resources)) : [];\n\nexport const getPodsForDeployment = (deployment: K8sResourceKind, resources: any): PodRCData => {\n const obj: K8sResourceKind = {\n ...deployment,\n apiVersion: apiVersionForModel(DeploymentModel),\n kind: DeploymentModel.kind,\n };\n const replicaSets = getReplicaSetsForResource(obj, resources);\n const [current, previous] = replicaSets;\n const isRollingOut = !!current && !!previous;\n\n return {\n obj,\n current,\n previous,\n isRollingOut,\n pods: [...(current?.pods || []), ...(previous?.pods || [])],\n };\n};\n\nexport const getPodsForDeployments = (\n deployments: K8sResourceKind[],\n resources: any,\n): PodRCData[] => (deployments ? deployments.map((d) => getPodsForDeployment(d, resources)) : []);\n\nexport const getPodsForStatefulSet = (ss: K8sResourceKind, resources: any): PodRCData => {\n const obj: K8sResourceKind = {\n ...ss,\n apiVersion: apiVersionForModel(StatefulSetModel),\n kind: StatefulSetModel.kind,\n };\n const statefulSets = getStatefulSetsResource(obj, resources);\n const [current, previous] = statefulSets;\n const isRollingOut = !!current && !!previous;\n\n return {\n obj,\n current,\n previous,\n isRollingOut,\n pods: [...(current?.pods || []), ...(previous?.pods || [])],\n };\n};\n\nexport const getPodsForStatefulSets = (ss: K8sResourceKind[], resources: any): PodRCData[] =>\n ss ? ss.map((s) => getPodsForStatefulSet(s, resources)) : [];\n\nexport const getPodsForDaemonSet = (ds: K8sResourceKind, resources: any): PodRCData => {\n const obj: K8sResourceKind = {\n ...ds,\n apiVersion: apiVersionForModel(StatefulSetModel),\n kind: StatefulSetModel.kind,\n };\n return {\n obj,\n current: undefined,\n previous: undefined,\n isRollingOut: undefined,\n pods: getPodsForResource(ds, resources),\n };\n};\n\nexport const getPodsForDaemonSets = (ds: K8sResourceKind[], resources: any): PodRCData[] =>\n ds ? ds.map((d) => getPodsForDaemonSet(d, resources)) : [];\n\nexport const getPodsForCronJob = (cronJob: K8sResourceKind, resources: any): PodRCData => {\n const obj: K8sResourceKind = {\n ...cronJob,\n apiVersion: apiVersionForModel(CronJobModel),\n kind: CronJobModel.kind,\n };\n const jobs = getJobsForCronJob(cronJob?.metadata?.uid, resources);\n return {\n obj,\n current: undefined,\n previous: undefined,\n isRollingOut: undefined,\n pods: jobs?.reduce((acc, job) => {\n acc.push(...getPodsForResource(job, resources));\n return acc;\n }, []),\n };\n};\n\nexport const getPodsForCronJobs = (cronJobs: K8sResourceKind[], resources: any): PodRCData[] =>\n cronJobs ? cronJobs.map((cronJob) => getPodsForCronJob(cronJob, resources)) : [];\n\n/**\n * Extract the resources from `getResourcesToWatchForPods` which are watched with `useK8sWatchResources`.\n */\nexport const getPodsDataForResource = (\n resource: K8sResourceKind,\n kind: string,\n resources: any,\n): PodRCData => {\n switch (kind) {\n case 'DeploymentConfig':\n return getPodsForDeploymentConfig(resource, resources);\n case 'Deployment':\n return getPodsForDeployment(resource, resources);\n case 'StatefulSet':\n return getPodsForStatefulSet(resource, resources);\n case 'DaemonSet':\n return getPodsForDaemonSet(resource, resources);\n case 'CronJob':\n return getPodsForCronJob(resource, resources);\n case 'Pod':\n return {\n obj: resource,\n current: undefined,\n previous: undefined,\n isRollingOut: true,\n pods: [resource as PodKind],\n };\n default:\n return {\n obj: resource,\n current: undefined,\n previous: undefined,\n isRollingOut: undefined,\n pods: getPodsForResource(resource, resources),\n };\n }\n};\n\n/**\n * Return a `WatchK8sResources` object for `useK8sWatchResources` to get all related `Pods`\n * for a given kind and namespace.\n *\n * - It watches for all `Pods` and all `ReplicationControllers` for a `DeploymentConfig`\n * - It watches for all `Pods` and all `ReplicaSets` for a `Deployment`\n * - It watches for all `Pods` and all `StatefulSets` for a `StatefulSet`\n * - It watches for all `Pods` and all `Jobs` for a `CronJob`\n * - And it watches for all `Pods` for all other kinds, or when no kind is provided.\n *\n * See also `getPodsDataForResource` above\n */\nexport const getResourcesToWatchForPods = (\n kind: string,\n namespace: string,\n): WatchK8sResources<any> => {\n if (!kind) {\n return {\n pods: {\n isList: true,\n kind: 'Pod',\n namespace,\n },\n };\n }\n switch (kind) {\n case 'DeploymentConfig':\n return {\n pods: {\n isList: true,\n kind: 'Pod',\n namespace,\n },\n replicationControllers: {\n isList: true,\n kind: 'ReplicationController',\n namespace,\n },\n };\n case 'Deployment':\n return {\n pods: {\n isList: true,\n kind: 'Pod',\n namespace,\n },\n replicaSets: {\n isList: true,\n kind: 'ReplicaSet',\n namespace,\n },\n };\n case 'StatefulSet':\n return {\n pods: {\n isList: true,\n kind: 'Pod',\n namespace,\n },\n statefulSets: {\n isList: true,\n kind: 'StatefulSet',\n namespace,\n },\n };\n case 'CronJob':\n return {\n pods: {\n isList: true,\n kind: 'Pod',\n namespace,\n },\n jobs: {\n isList: true,\n kind: 'Job',\n namespace,\n },\n };\n default:\n return {\n pods: {\n isList: true,\n kind: 'Pod',\n namespace,\n },\n };\n }\n};\n","import * as _ from 'lodash';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n formatPrometheusDuration,\n parsePrometheusDuration,\n} from '@openshift-console/plugin-shared/src/datetime/prometheus';\nimport {\n Dropdown as DropdownDeprecated,\n DropdownToggle as DropdownToggleDeprecated,\n DropdownItem as DropdownItemDeprecated,\n} from '@patternfly/react-core/deprecated';\n\nimport { useBoolean } from './hooks/useBoolean';\n\nconst OFF_KEY = 'OFF_KEY';\n\ntype Props = {\n interval: number;\n setInterval: (v: number) => void;\n id?: string;\n};\n\nconst IntervalDropdown: React.FC<Props> = ({ id, interval, setInterval }) => {\n const [isOpen, toggleIsOpen, , setClosed] = useBoolean(false);\n const { t } = useTranslation();\n\n const onChange = React.useCallback(\n (v: string) => setInterval(v === OFF_KEY ? null : parsePrometheusDuration(v)),\n [setInterval],\n );\n\n const intervalOptions = {\n [OFF_KEY]: t('public~Refresh off'),\n '15s': t('public~{{count}} second', { count: 15 }),\n '30s': t('public~{{count}} second', { count: 30 }),\n '1m': t('public~{{count}} minute', { count: 1 }),\n '5m': t('public~{{count}} minute', { count: 5 }),\n '15m': t('public~{{count}} minute', { count: 15 }),\n '30m': t('public~{{count}} minute', { count: 30 }),\n '1h': t('public~{{count}} hour', { count: 1 }),\n '2h': t('public~{{count}} hour', { count: 2 }),\n '1d': t('public~{{count}} day', { count: 1 }),\n };\n\n const selectedKey = interval === null ? OFF_KEY : formatPrometheusDuration(interval);\n\n return (\n <DropdownDeprecated\n dropdownItems={_.map(intervalOptions, (name, key) => (\n <DropdownItemDeprecated component=\"button\" key={key} onClick={() => onChange(key)}>\n {name}\n </DropdownItemDeprecated>\n ))}\n isOpen={isOpen}\n onSelect={setClosed}\n toggle={\n <DropdownToggleDeprecated\n className=\"monitoring-dashboards__dropdown-button\"\n id={`${id}-dropdown`}\n onToggle={toggleIsOpen}\n >\n {intervalOptions[selectedKey]}\n </DropdownToggleDeprecated>\n }\n className=\"monitoring-dashboards__variable-dropdown\"\n />\n );\n};\n\nexport default IntervalDropdown;\n","import { PrometheusRulesResponse } from '@console/dynamic-plugin-sdk';\nimport { coFetchJSON } from '@console/internal/co-fetch';\n\n/**\n * Merges prometheus monitoring alerts with external sources\n */\nexport const fetchAlerts = async (\n prometheusURL: string,\n externalAlertsFetch?: Array<{\n id: string;\n getAlertingRules: (namespace?: string) => Promise<PrometheusRulesResponse>;\n }>,\n namespace?: string,\n): Promise<PrometheusRulesResponse> => {\n if (!externalAlertsFetch || externalAlertsFetch.length === 0) {\n return coFetchJSON(prometheusURL);\n }\n\n const resolvedExternalAlertsSources = externalAlertsFetch.map((extensionProperties) => ({\n id: extensionProperties.id,\n fetch: extensionProperties.getAlertingRules,\n }));\n\n const sourceIds = ['prometheus', ...resolvedExternalAlertsSources.map((source) => source.id)];\n\n try {\n const groups = await Promise.allSettled([\n coFetchJSON(prometheusURL),\n ...resolvedExternalAlertsSources.map((source) => source.fetch(namespace)),\n ]).then((results) =>\n results\n .map((result, i) => ({ sourceId: sourceIds[i], alerts: result }))\n .flatMap((result) =>\n result.alerts.status === 'fulfilled' && result.alerts.value?.data?.groups\n ? result.alerts.value.data.groups.map((group) => ({\n ...group,\n rules: [...group.rules.map((rule) => ({ ...rule, sourceId: result.sourceId }))],\n }))\n : [],\n ),\n );\n\n return { data: { groups }, status: 'success' };\n } catch {\n return coFetchJSON(prometheusURL);\n }\n};\n","export * from './types';\nexport * from './validation';\n","import * as _ from 'lodash';\nimport { ValidationErrorType, ValidationObject } from './types';\n\nconst alphanumericRegex = '[a-zA-Z0-9]';\nconst alphanumericRegexWithDash = '[-a-zA-Z0-9]';\n\nconst DNS1123_MAX_LENGTH = 253;\n\ntype DNSValidationMsgs = {\n emptyMsg: string;\n startEndAlphanumbericMsg: string;\n errorMsg: string;\n uppercaseMsg: string;\n longMsg: string;\n shortMsg: string;\n};\n\nexport const asValidationObject = (\n messageKey: string,\n type: ValidationErrorType = ValidationErrorType.Error,\n): ValidationObject => ({\n messageKey,\n type,\n});\n\n// DNS-1123 subdomain\nexport const validateDNS1123SubdomainValue = (\n value: string,\n {\n emptyMsg,\n errorMsg,\n uppercaseMsg,\n startEndAlphanumbericMsg,\n shortMsg,\n longMsg,\n }: DNSValidationMsgs,\n { min, max }: { min?: number; max?: number } = {\n min: undefined,\n max: DNS1123_MAX_LENGTH,\n },\n): ValidationObject => {\n const maxLength = max || DNS1123_MAX_LENGTH;\n\n if (!value) {\n return asValidationObject(emptyMsg, ValidationErrorType.TrivialError);\n }\n\n if (value.match(/^\\$\\{[A-Z_]+\\}$/)) {\n return asValidationObject('template parameter', ValidationErrorType.Warn);\n }\n\n if (min && value.length < min) {\n return asValidationObject(shortMsg);\n }\n if (value.length > maxLength) {\n return asValidationObject(longMsg);\n }\n\n const startsWithAlphaNumeric = value.charAt(0).match(alphanumericRegex);\n const endsWithAlphaNumeric = value.charAt(value.length - 1).match(alphanumericRegex);\n\n if (!startsWithAlphaNumeric || !endsWithAlphaNumeric) {\n return asValidationObject(startEndAlphanumbericMsg);\n }\n\n for (const c of value) {\n if (c.toLowerCase() !== c) {\n return asValidationObject(uppercaseMsg);\n }\n\n if (!c.match(alphanumericRegexWithDash)) {\n return asValidationObject(errorMsg);\n }\n }\n return null;\n};\n\nexport const alignWithDNS1123 = (str) => {\n if (!str) {\n return '';\n }\n\n const chars = str.toLowerCase().replace(/\\./g, '-').split('');\n\n const firstValidCharIndex = chars.findIndex((c) => c.match(alphanumericRegex));\n const lastValidCharIndex = _.findLastIndex(chars, (c: string) => c.match(alphanumericRegex));\n\n if (firstValidCharIndex < 0) {\n return '';\n }\n\n let result = chars\n .slice(firstValidCharIndex, lastValidCharIndex + 1)\n .filter((c) => c.match(alphanumericRegexWithDash));\n\n if (result.length > DNS1123_MAX_LENGTH) {\n result = result.slice(0, DNS1123_MAX_LENGTH);\n }\n\n return result.join('');\n};\n","import { StorageClass } from '@console/internal/components/storage-class-form';\n\nexport const cephStorageProvisioners = [\n 'ceph.rook.io/block',\n 'cephfs.csi.ceph.com',\n 'rbd.csi.ceph.com',\n];\n\nconst objectStorageProvisioners = ['noobaa.io/obc', 'ceph.rook.io/bucket'];\n\n// To check if the provisioner is OCS based\nexport const isCephProvisioner = (scProvisioner: string): boolean =>\n cephStorageProvisioners.some((provisioner: string) => scProvisioner?.includes(provisioner));\n\nexport const isObjectSC = (sc: StorageClass) =>\n objectStorageProvisioners.some((provisioner: string) => sc.provisioner?.includes(provisioner));\n","const ICON_OPERATOR = 'icon-operator';\nexport type CSVIcon = { base64data: string; mediatype: string };\nexport const getImageForCSVIcon = (icon: CSVIcon | undefined) => {\n return icon ? `data:${icon.mediatype};base64,${icon.base64data}` : ICON_OPERATOR;\n};\n\nexport const getDefaultOperatorIcon = () => ICON_OPERATOR;\n","import { ALL_NAMESPACES_KEY } from '../constants/common';\n\nexport const formatNamespacedRouteForResource = (resource, namespace) =>\n namespace === ALL_NAMESPACES_KEY\n ? `/k8s/all-namespaces/${resource}`\n : `/k8s/ns/${namespace}/${resource}`;\n\nexport const formatNamespacedRouteForHref = (href: string, namespace: string) =>\n namespace === ALL_NAMESPACES_KEY ? `${href}/all-namespaces` : `${href}/ns/${namespace}`;\n","import * as _ from 'lodash';\nimport { toRequirements, requirementToString } from '@console/dynamic-plugin-sdk/src/utils/k8s';\n\nexport const getLabelsAsString = (obj: any, path: string = 'metadata.labels'): string[] => {\n const labels = _.get(obj, path);\n const requirements = toRequirements(labels);\n return _.map(requirements, requirementToString);\n};\n","import * as _ from 'lodash';\nimport { Alert, AlertSeverity, AlertStates } from '@console/dynamic-plugin-sdk';\nimport { alertSeverityOrder } from '@console/internal/components/monitoring/utils';\n\nexport const sortMonitoringAlerts = (alerts: Alert[]): Alert[] =>\n _.sortBy(alerts, alertSeverityOrder) as Alert[];\n\nexport const getSeverityAlertType = (alerts: Alert[]): AlertSeverity => {\n const sortedAlerts = sortMonitoringAlerts(alerts);\n const severityType = (sortedAlerts[0]?.labels?.severity as AlertSeverity) ?? AlertSeverity.None;\n return severityType;\n};\n\nexport const getFiringAlerts = (alerts: Alert[]): Alert[] =>\n _.filter(alerts, (alert) => alert.state === AlertStates.Firing);\n\nexport const shouldHideMonitoringAlertDecorator = (severityAlertType: AlertSeverity): boolean =>\n severityAlertType === AlertSeverity.None || severityAlertType === AlertSeverity.Info;\n","import * as _ from 'lodash';\nimport { K8sResourceKind } from '@console/internal/module/k8s';\n\nexport const isHelmResource = (resource: K8sResourceKind): boolean =>\n resource?.metadata?.labels?.['app.kubernetes.io/managed-by'] === 'Helm' ||\n resource?.metadata?.labels?.heritage === 'Helm' ||\n _.has(resource?.metadata?.labels, 'helm.sh/chart');\n","import { TFunction } from 'i18next';\nimport { Map as ImmutableMap } from 'immutable';\nimport YAML from 'js-yaml';\nimport * as _ from 'lodash';\nimport { PodDisruptionBudgetModel } from '@console/app/src/models';\nimport {\n AddAction,\n isAddAction,\n CatalogItemType,\n isCatalogItemType,\n isPerspective,\n Perspective,\n} from '@console/dynamic-plugin-sdk';\nimport { FirehoseResult } from '@console/internal/components/utils';\nimport * as denyOtherNamespacesImg from '@console/internal/imgs/network-policy-samples/1-deny-other-namespaces.svg';\nimport * as limitCertainAppImg from '@console/internal/imgs/network-policy-samples/2-limit-certain-apps.svg';\nimport * as allowIngressImg from '@console/internal/imgs/network-policy-samples/3-allow-ingress.svg';\nimport * as defaultDenyAllImg from '@console/internal/imgs/network-policy-samples/4-default-deny-all.svg';\nimport * as webAllowExternalImg from '@console/internal/imgs/network-policy-samples/5-web-allow-external.svg';\nimport * as webDbAllowAllNsImg from '@console/internal/imgs/network-policy-samples/6-web-db-allow-all-ns.svg';\nimport * as webAllowProductionImg from '@console/internal/imgs/network-policy-samples/7-web-allow-production.svg';\nimport {\n BuildConfigModel,\n ClusterRoleModel,\n ConsoleLinkModel,\n ConsoleOperatorConfigModel,\n NetworkPolicyModel,\n ResourceQuotaModel,\n RoleModel,\n} from '@console/internal/models';\nimport {\n apiVersionForModel,\n GroupVersionKind,\n K8sKind,\n K8sResourceKind,\n referenceForModel,\n} from '@console/internal/module/k8s';\nimport { LoadedExtension } from '@console/plugin-sdk/src';\nimport { subscribeToExtensions } from '@console/plugin-sdk/src/api/pluginSubscriptionService';\nimport { defaultCatalogCategories } from './default-categories';\n\nexport type Sample = {\n highlightText?: string;\n title: string;\n img?: string;\n description: string;\n id: string;\n yaml?: string;\n lazyYaml?: () => Promise<string>;\n snippet?: boolean;\n targetResource: {\n apiVersion: string;\n kind: string;\n };\n};\n\ntype ProjectAccessRoles = {\n availableClusterRoles: string[];\n};\n\nconst getTargetResource = (model: K8sKind) => ({\n apiVersion: apiVersionForModel(model),\n kind: model.kind,\n});\n\nconst defaultProjectAccessRoles: ProjectAccessRoles = {\n availableClusterRoles: ['admin', 'edit', 'view'],\n};\n\nconst samplePinnedResources = [\n { group: 'apps', version: 'v1', resource: 'deployments' },\n { group: '', version: 'v1', resource: 'secrets' },\n { group: '', version: 'v1', resource: 'configmaps' },\n { group: '', version: 'v1', resource: 'pods' },\n];\n\nconst clusterRoleBindingSamples = (t: TFunction): Sample[] => [\n {\n title: t('console-shared~Allow reading Nodes in the core API groups (for ClusterRoleBinding)'),\n description: t(\n 'console-shared~This \"ClusterRole\" is allowed to read the resource \"Nodes\" in the core group (because a Node is cluster-scoped, this must be bound with a \"ClusterRoleBinding\" to be effective).',\n ),\n id: 'read-nodes',\n targetResource: getTargetResource(ClusterRoleModel),\n },\n {\n title: t(\n 'console-shared~\"GET/POST\" requests to non-resource endpoint and all subpaths (for ClusterRoleBinding)',\n ),\n description: t(\n 'console-shared~This \"ClusterRole\" is allowed to \"GET\" and \"POST\" requests to the non-resource endpoint \"/healthz\" and all subpaths (must be in the \"ClusterRole\" bound with a \"ClusterRoleBinding\" to be effective).',\n ),\n id: 'get-and-post-to-non-resource-endpoints',\n targetResource: getTargetResource(ClusterRoleModel),\n },\n];\n\nconst defaultSamples = (t: TFunction) =>\n ImmutableMap<GroupVersionKind, Sample[]>()\n .setIn(\n [referenceForModel(BuildConfigModel)],\n [\n {\n title: t('console-shared~Build from Dockerfile'),\n description: t(\n 'console-shared~A Dockerfile build performs an image build using a Dockerfile in the source repository or specified in build configuration.',\n ),\n id: 'docker-build',\n targetResource: getTargetResource(BuildConfigModel),\n },\n {\n title: t('console-shared~Source-to-Image (S2I) build'),\n description: t(\n 'console-shared~S2I is a tool for building reproducible container images. It produces ready-to-run images by injecting the application source into a container image and assembling a new image.',\n ),\n id: 's2i-build',\n targetResource: getTargetResource(BuildConfigModel),\n },\n ],\n )\n .setIn(\n [referenceForModel(NetworkPolicyModel)],\n [\n {\n highlightText: t('console-shared~Limit'),\n title: t('console-shared~access to the current namespace'),\n img: denyOtherNamespacesImg,\n description: t(\n 'console-shared~Deny traffic from other namespaces while allowing all traffic from the namespaces the Pod is living in.',\n ),\n id: 'deny-other-namespaces',\n targetResource: getTargetResource(NetworkPolicyModel),\n },\n {\n highlightText: t('console-shared~Limit'),\n title: t('console-shared~traffic to an application within the same namespace'),\n img: limitCertainAppImg,\n description: t(\n 'console-shared~Allow inbound traffic from only certain Pods. One typical use case is to restrict the connections to a database only to the specific applications.',\n ),\n id: 'db-or-api-allow-app',\n targetResource: getTargetResource(NetworkPolicyModel),\n },\n {\n highlightText: t('console-shared~Allow'),\n title: t('console-shared~http and https ingress within the same namespace'),\n img: allowIngressImg,\n description: t(\n 'console-shared~Define ingress rules for specific port numbers of an application. The rule applies to all port numbers if not specified.',\n ),\n id: 'api-allow-http-and-https',\n targetResource: getTargetResource(NetworkPolicyModel),\n },\n {\n highlightText: t('console-shared~Deny'),\n title: t('console-shared~all non-whitelisted traffic in the current namespace'),\n img: defaultDenyAllImg,\n description: t(\n 'console-shared~A fundamental policy by blocking all cross-pod traffics expect whitelisted ones through the other Network Policies being deployed.',\n ),\n id: 'default-deny-all',\n targetResource: getTargetResource(NetworkPolicyModel),\n },\n {\n highlightText: t('console-shared~Allow'),\n title: t('console-shared~traffic from external clients'),\n img: webAllowExternalImg,\n description: t(\n 'console-shared~Allow external service from public Internet directly or through a Load Balancer to access the Pod.',\n ),\n id: 'web-allow-external',\n targetResource: getTargetResource(NetworkPolicyModel),\n },\n {\n highlightText: t('console-shared~Allow'),\n title: t('console-shared~traffic to an application from all namespaces'),\n img: webDbAllowAllNsImg,\n description: t(\n 'console-shared~One typical use case is for a common database which is used by deployments in different namespaces.',\n ),\n id: 'web-db-allow-all-ns',\n targetResource: getTargetResource(NetworkPolicyModel),\n },\n {\n highlightText: t('console-shared~Allow'),\n title: t('console-shared~traffic from all Pods in a particular namespace'),\n img: webAllowProductionImg,\n description: t(\n 'console-shared~Typical use case should be \"only allow deployments in production namespaces to access the database\" or \"allow monitoring tools (in another namespace) to scrape metrics from current namespace.\"',\n ),\n id: 'web-allow-production',\n targetResource: getTargetResource(NetworkPolicyModel),\n },\n ],\n )\n .setIn(\n [referenceForModel(ResourceQuotaModel)],\n [\n {\n title: t('console-shared~Set compute resource quota'),\n description: t(\n 'console-shared~Limit the total amount of memory and CPU that can be used in a namespace.',\n ),\n id: 'rq-compute',\n targetResource: getTargetResource(ResourceQuotaModel),\n },\n {\n title: t('console-shared~Set maximum count for any resource'),\n description: t(\n 'console-shared~Restrict maximum count of each resource so users cannot create more than the allotted amount.',\n ),\n id: 'rq-counts',\n targetResource: getTargetResource(ResourceQuotaModel),\n },\n {\n title: t('console-shared~Specify resource quotas for a given storage class'),\n description: t(\n 'console-shared~Limit the size and number of persistent volume claims that can be created with a storage class.',\n ),\n id: 'rq-storageclass',\n targetResource: getTargetResource(ResourceQuotaModel),\n },\n ],\n )\n .setIn(\n [referenceForModel(RoleModel)],\n [\n {\n title: t('console-shared~Allow reading the resource in API group'),\n description: t(\n 'console-shared~This \"Role\" is allowed to read the resource \"Pods\" in the core API group.',\n ),\n id: 'read-pods-within-ns',\n targetResource: getTargetResource(RoleModel),\n },\n {\n title: t('console-shared~Allow reading/writing the resource in API group'),\n description: t(\n 'console-shared~This \"Role\" is allowed to read and write the \"Deployments\" in both the \"extensions\" and \"apps\" API groups.',\n ),\n id: 'read-write-deployment-in-ext-and-apps-apis',\n targetResource: getTargetResource(RoleModel),\n },\n {\n title: t(\n 'console-shared~Allow different access rights to different types of resource and API groups',\n ),\n description: t(\n 'console-shared~This \"Role\" is allowed to read \"Pods\" and read/write \"Jobs\" resources in API groups.',\n ),\n id: 'read-pods-and-read-write-jobs',\n targetResource: getTargetResource(RoleModel),\n },\n {\n title: t(\n 'console-shared~Allow reading a ConfigMap in a specific namespace (for RoleBinding)',\n ),\n description: t(\n 'console-shared~This \"Role\" is allowed to read a \"ConfigMap\" named \"my-config\" (must be bound with a \"RoleBinding\" to limit to a single \"ConfigMap\" in a single namespace).',\n ),\n id: 'read-configmap-within-ns',\n targetResource: getTargetResource(RoleModel),\n },\n ...clusterRoleBindingSamples(t),\n ],\n )\n .setIn([referenceForModel(ClusterRoleModel)], clusterRoleBindingSamples(t))\n .setIn(\n [referenceForModel(ConsoleLinkModel)],\n [\n {\n title: t('console-shared~Add a link to the user menu'),\n description: t(\n 'console-shared~The user menu appears in the right side of the masthead below the username.',\n ),\n id: 'cl-user-menu',\n targetResource: getTargetResource(ConsoleLinkModel),\n },\n {\n title: t('console-shared~Add a link to the application menu'),\n description: t(\n 'console-shared~The application menu appears in the masthead below the 9x9 grid icon. Application menu links can include an optional image and section heading.',\n ),\n id: 'cl-application-menu',\n targetResource: getTargetResource(ConsoleLinkModel),\n },\n {\n title: t('console-shared~Add a link to the namespace dashboard'),\n description: t(\n 'console-shared~Namespace dashboard links appear on the project dashboard and namespace details pages in a section called \"Launcher\". Namespace dashboard links can optionally be restricted to a specific namespace or namespaces.',\n ),\n id: 'cl-namespace-dashboard',\n targetResource: getTargetResource(ConsoleLinkModel),\n },\n ],\n )\n .setIn(\n [referenceForModel(ConsoleOperatorConfigModel)],\n [\n {\n title: t('console-shared~Add catalog categories'),\n description: t(\n 'console-shared~Provides a list of default categories which are shown in the Developer Catalog. The categories must be added below customization developerCatalog.',\n ),\n id: 'devcatalog-categories',\n snippet: true,\n lazyYaml: () => YAML.dump(defaultCatalogCategories),\n targetResource: getTargetResource(ConsoleOperatorConfigModel),\n },\n {\n title: t('console-shared~Add project access roles'),\n description: t(\n 'console-shared~Provides a list of default roles which are shown in the Project Access. The roles must be added below customization projectAccess.',\n ),\n id: 'projectaccess-roles',\n snippet: true,\n lazyYaml: () => YAML.dump(defaultProjectAccessRoles),\n targetResource: getTargetResource(ConsoleOperatorConfigModel),\n },\n {\n title: t('console-shared~Add page actions'),\n description: t(\n 'console-shared~Provides a list of all available actions on the Add page in the Developer perspective. The IDs must be added below customization addPage disabledActions to hide these actions.',\n ),\n id: 'addpage-actions',\n snippet: true,\n lazyYaml: () => {\n // Similar to useTranslationExt\n const translateExtension = (key: string) => {\n if (key.length < 3 || key[0] !== '%' || key[key.length - 1] !== '%') {\n return key;\n }\n return t(key.substr(1, key.length - 2));\n };\n return new Promise<string>((resolve) => {\n // Using subscribeToExtensions here instead of useExtensions hook because\n // this lazyYaml method is not called in a render flow.\n // We should probably have a yaml snippets extension later for this.\n const unsubscribe = subscribeToExtensions<AddAction>(\n (extensions: LoadedExtension<AddAction>[]) => {\n const sortedExtensions = extensions\n .slice()\n .sort((a, b) => a.properties.id.localeCompare(b.properties.id));\n const yaml = sortedExtensions\n .map((extension) => {\n const { id, label, description } = extension.properties;\n const labelComment = translateExtension(label).split('\\n').join('\\n # ');\n const descriptionComment = translateExtension(description)\n .split('\\n')\n .join('\\n # ');\n return `- # ${labelComment}\\n # ${descriptionComment}\\n ${id}`;\n })\n .join('\\n');\n resolve(yaml);\n unsubscribe();\n },\n isAddAction,\n );\n });\n },\n targetResource: getTargetResource(ConsoleOperatorConfigModel),\n },\n {\n title: t('console-shared~Add sub-catalog types'),\n description: t(\n 'console-shared~Provides a list of all the available sub-catalog types which are shown in the Developer Catalog. The types must be added below spec customization developerCatalog',\n ),\n id: 'devcatalog-types',\n snippet: true,\n lazyYaml: () => {\n return new Promise<string>((resolve) => {\n const unsubscribe = subscribeToExtensions<CatalogItemType>(\n (extensions: LoadedExtension<CatalogItemType>[]) => {\n const enabledTypes = {\n state: 'Enabled',\n enabled: extensions.map((extension) => extension.properties.type),\n };\n resolve(YAML.dump(enabledTypes));\n unsubscribe();\n },\n isCatalogItemType,\n );\n });\n },\n targetResource: getTargetResource(ConsoleOperatorConfigModel),\n },\n {\n title: t('console-shared~Add user perspectives'),\n description: t(\n 'console-shared~Provides a list of all the available user perspectives which are shown in the perspective dropdown. The perspectives must be added below spec customization.',\n ),\n id: 'user-perspectives',\n snippet: true,\n lazyYaml: () => {\n return new Promise<string>((resolve) => {\n const unsubscribe = subscribeToExtensions<Perspective>(\n (extensions: LoadedExtension<Perspective>[]) => {\n const yaml = extensions.map((extension) => {\n const { id } = extension.properties;\n return {\n id,\n visibility: {\n state: 'Enabled',\n },\n };\n });\n resolve(YAML.dump(yaml));\n unsubscribe();\n },\n isPerspective,\n );\n });\n },\n targetResource: getTargetResource(ConsoleOperatorConfigModel),\n },\n {\n title: t('console-shared~Add pinned resources'),\n description: t(\n 'console-shared~Provides a list of resources to be pinned on the Developer perspective navigation. The pinned resources must be added below spec customization perspectives.',\n ),\n id: 'dev-pinned-resources',\n snippet: true,\n lazyYaml: () => YAML.dump(samplePinnedResources),\n targetResource: getTargetResource(ConsoleOperatorConfigModel),\n },\n ],\n )\n .setIn(\n [referenceForModel(PodDisruptionBudgetModel)],\n [\n {\n title: t('console-shared~Set maxUnavaliable to 0'),\n description: t(\n 'console-shared~An eviction is allowed if at most 0 pods selected by \"selector\" are unavailable after the eviction.',\n ),\n id: 'pdb-max-unavailable',\n targetResource: getTargetResource(PodDisruptionBudgetModel),\n },\n {\n title: t('console-shared~Set minAvailable to 25%'),\n description: t(\n 'console-shared~An eviction is allowed if at least 25% of pods selected by \"selector\" will still be available after the eviction.',\n ),\n id: 'pdb-min-available',\n targetResource: getTargetResource(PodDisruptionBudgetModel),\n },\n ],\n );\n\nexport const getResourceSidebarSamples = (\n kindObj: K8sKind,\n yamlSamplesList: FirehoseResult,\n t: TFunction,\n) => {\n const yamlSamplesData = !_.isEmpty(yamlSamplesList)\n ? _.filter(\n yamlSamplesList.data,\n (sample: K8sResourceKind) =>\n sample.spec.targetResource.apiVersion === apiVersionForModel(kindObj) &&\n sample.spec.targetResource.kind === kindObj.kind,\n )\n : [];\n const existingSamples = defaultSamples(t).get(referenceForModel(kindObj)) || [];\n const extensionSamples = !_.isEmpty(yamlSamplesData)\n ? yamlSamplesData.map((sample: K8sResourceKind) => {\n return {\n id: sample.metadata.uid,\n ...sample.spec,\n };\n })\n : [];\n\n const allSamples = [...existingSamples, ...extensionSamples];\n\n // For the time being, `snippets` are a superset of `samples`\n const snippets = allSamples.filter((sample: Sample) => sample.snippet);\n const samples = allSamples.filter((sample: Sample) => !sample.snippet);\n\n return { snippets, samples };\n};\n","import * as React from 'react';\nimport {\n Select as SelectDeprecated,\n SelectOption as SelectOptionDeprecated,\n SelectVariant as SelectVariantDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { useTranslation } from 'react-i18next';\n\nexport const MultiSelectDropdown: React.FC<MultiSelectDropdownProps> = ({\n onChange,\n placeholder,\n id,\n options,\n defaultSelected = [],\n}) => {\n const [isOpen, setOpen] = React.useState(false);\n const [selected, setSelected] = React.useState<string[]>(defaultSelected || []);\n const onSelect = (event: React.MouseEvent | React.ChangeEvent, selection: string) => {\n let cSelected: string[] = selected;\n if (selected.includes(selection)) {\n cSelected = selected.filter((item) => item !== selection);\n } else {\n cSelected = [...selected, selection];\n }\n setSelected(cSelected);\n onChange(cSelected);\n };\n\n const { t } = useTranslation();\n\n const items: JSX.Element[] = options.map((item) => {\n return <SelectOptionDeprecated key={item} value={item} />;\n });\n return (\n <div>\n <SelectDeprecated\n variant={SelectVariantDeprecated.typeaheadMulti}\n aria-label={t('console-shared~Select input')}\n onToggle={(_event, isExpanded: boolean) => setOpen(isExpanded)}\n onSelect={onSelect}\n selections={selected}\n isOpen={isOpen}\n placeholderText={placeholder || t('console-shared~Select options')}\n aria-labelledby={id}\n noResultsFoundText={t('console-shared~No results found')}\n >\n {items}\n </SelectDeprecated>\n </div>\n );\n};\n\nexport type MultiSelectDropdownProps = {\n id?: string;\n options?: string[];\n defaultSelected?: string[];\n placeholder?: string;\n onChange: (selected: string[]) => void;\n};\n","import { Terminal, ITerminalAddon } from 'xterm';\nimport './xterm-addon-fullscreen.scss';\n\nexport class XtermAddonFullscreen implements ITerminalAddon {\n private terminal: Terminal | undefined;\n\n public activate(terminal: Terminal): void {\n this.terminal = terminal;\n }\n\n public dispose(): void {\n if (this.terminal?.element.classList.contains('fullscreen')) {\n this.terminal?.element.classList.remove('fullscreen');\n }\n }\n\n public toggleFullScreen(fullscreen?: boolean): void {\n let fn: string;\n\n if (typeof fullscreen === 'undefined') {\n fn = this.terminal?.element.classList.contains('fullscreen') ? 'remove' : 'add';\n } else if (!fullscreen) {\n fn = 'remove';\n } else {\n fn = 'add';\n }\n\n this.terminal?.element.classList[fn]('fullscreen');\n }\n}\n","import { TFunction } from 'i18next';\nimport * as yup from 'yup';\n\nexport const nameRegex = /^[a-z]([a-z0-9]-?)*[a-z0-9]$/;\nexport const nameValidationSchema = (t: TFunction, maxLength = 263) =>\n yup\n .string()\n .matches(nameRegex, {\n message: t(\n 'console-shared~Name must consist of lower-case letters, numbers and hyphens. It must start with a letter and end with a letter or number.',\n ),\n excludeEmptyString: true,\n })\n .max(\n maxLength,\n // see https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n t('console-shared~Cannot be longer than {{characterCount}} characters.', {\n characterCount: maxLength,\n }),\n )\n .required(t('console-shared~Required'));\n","import * as _ from 'lodash';\nimport { K8sResourceKind, Patch } from '@console/internal/module/k8s';\n\nexport const getPluginPatch = (\n console: K8sResourceKind,\n plugin: string,\n enabled: boolean,\n): Patch => {\n if (!enabled) {\n return {\n path: '/spec/plugins',\n value: console.spec.plugins.filter((p: string) => p !== plugin),\n op: 'replace',\n };\n }\n\n // Create the array if it doesn't exist. Append to the array otherwise.\n return _.isEmpty(console.spec.plugins)\n ? {\n path: '/spec/plugins',\n value: [plugin],\n op: 'add',\n }\n : {\n path: '/spec/plugins/-',\n value: plugin,\n op: 'add',\n };\n};\n\nexport const getPatchForRemovingPlugins = (console: K8sResourceKind, plugins: string[]): Patch => {\n return {\n path: '/spec/plugins',\n value: console.spec?.plugins?.filter((p: string) => !plugins.includes(p)),\n op: 'replace',\n };\n};\n\nexport const isPluginEnabled = (console: K8sResourceKind, plugin: string): boolean =>\n !!console?.spec?.plugins?.includes(plugin);\n","import * as React from 'react';\nimport { useK8sWatchResources } from '@console/internal/components/utils/k8s-watch-hook';\nimport { K8sResourceKind, JobKind } from '@console/internal/module/k8s';\nimport { getJobsForCronJob } from '../utils';\n\nexport const useJobsForCronJobWatcher = (\n cronJob: K8sResourceKind,\n): { loaded: boolean; loadError: string; jobs: JobKind[] } => {\n const { namespace, uid } = cronJob.metadata;\n const [loaded, setLoaded] = React.useState<boolean>(false);\n const [loadError, setLoadError] = React.useState<string>('');\n const [jobs, setJobs] = React.useState<JobKind[]>([]);\n const watchedResources = React.useMemo(\n () => ({\n jobs: {\n isList: true,\n kind: 'Job',\n namespace,\n },\n }),\n [namespace],\n );\n const resources = useK8sWatchResources(watchedResources);\n\n React.useEffect(() => {\n const errorKey = Object.keys(resources).find((key) => resources[key].loadError);\n if (errorKey) {\n setLoadError(resources[errorKey].loadError);\n return;\n }\n setLoadError('');\n if (\n Object.keys(resources).length > 0 &&\n Object.keys(resources).every((key) => resources[key].loaded)\n ) {\n const resourceJobs = getJobsForCronJob(uid, resources);\n setJobs(resourceJobs);\n setLoaded(true);\n }\n }, [uid, resources]);\n\n return { loaded, loadError, jobs };\n};\n","import * as React from 'react';\nimport { useSafetyFirst } from '@console/dynamic-plugin-sdk';\nimport { useK8sWatchResources } from '@console/internal/components/utils/k8s-watch-hook';\nimport { K8sResourceKind } from '@console/internal/module/k8s';\nimport { PodRCData } from '../types';\nimport { getPodsDataForResource, getResourcesToWatchForPods } from '../utils';\nimport { useDebounceCallback } from './debounce';\nimport { useDeepCompareMemoize } from './deep-compare-memoize';\n\n/**\n * Watches for all Pods for a kind and namespace.\n * Kind and namespace is used from the given `resource` and can be overridden\n * with the `kind` and `namespace` parameters.\n */\nexport const usePodsWatcher = (\n resource: K8sResourceKind,\n kind?: string,\n namespace?: string,\n): { loaded: boolean; loadError: string; podData: PodRCData } => {\n const [loaded, setLoaded] = useSafetyFirst<boolean>(false);\n const [loadError, setLoadError] = useSafetyFirst<string>('');\n const [podData, setPodData] = useSafetyFirst<PodRCData>(undefined);\n const watchKind = kind || resource?.kind;\n const watchNS = namespace || resource?.metadata.namespace;\n const watchedResources = React.useMemo(\n () => (watchKind ? getResourcesToWatchForPods(watchKind, watchNS) : {}),\n [watchKind, watchNS],\n );\n\n const resources = useK8sWatchResources(watchedResources);\n\n const updateResults = React.useCallback(\n (watchedResource, updatedResources) => {\n const errorKey = Object.keys(updatedResources).find((key) => updatedResources[key].loadError);\n if (errorKey) {\n setLoadError(updatedResources[errorKey].loadError);\n return;\n }\n setLoadError('');\n if (\n Object.keys(updatedResources).length > 0 &&\n Object.keys(updatedResources).every((key) => updatedResources[key].loaded)\n ) {\n const updatedPods = getPodsDataForResource(watchedResource, watchKind, updatedResources);\n setPodData(updatedPods);\n setLoaded(true);\n }\n },\n [setLoadError, setLoaded, setPodData, watchKind],\n );\n\n const debouncedUpdateResources = useDebounceCallback(updateResults, 250);\n\n React.useEffect(() => {\n debouncedUpdateResources(resource, resources);\n }, [debouncedUpdateResources, resources, resource]);\n\n return useDeepCompareMemoize({ loaded, loadError, podData });\n};\n","import * as React from 'react';\nimport { useK8sWatchResources } from '@console/internal/components/utils/k8s-watch-hook';\nimport { K8sResourceKind } from '@console/internal/module/k8s';\nimport { PodControllerOverviewItem } from '../types';\nimport { getReplicationControllersForResource } from '../utils';\n\nexport const useReplicationControllersWatcher = (\n resource: K8sResourceKind,\n): {\n loaded: boolean;\n loadError: string;\n mostRecentRC: K8sResourceKind;\n visibleReplicationControllers: PodControllerOverviewItem[];\n} => {\n const { namespace } = resource.metadata;\n const watchedResources = React.useMemo(\n () => ({\n replicationControllers: {\n isList: true,\n kind: 'ReplicationController',\n namespace,\n },\n pods: {\n isList: true,\n kind: 'Pod',\n namespace,\n },\n }),\n [namespace],\n );\n const resources = useK8sWatchResources(watchedResources);\n\n const { loaded, loadError, mostRecentRC, visibleReplicationControllers } = React.useMemo(() => {\n const resourcesLoaded =\n Object.keys(resources).length > 0 &&\n Object.keys(resources).every((key) => resources[key].loaded);\n const resourceWithLoadError = Object.values(resources).find((r) => r.loadError);\n if (!resourcesLoaded || resourceWithLoadError) {\n return {\n loaded: resourcesLoaded,\n loadError: resourceWithLoadError ? resourceWithLoadError.loadError : null,\n mostRecentRC: null,\n visibleReplicationControllers: [],\n };\n }\n\n return {\n loaded: true,\n loadError: null,\n ...getReplicationControllersForResource(resource, resources),\n };\n }, [resources, resource]);\n\n return { loaded, loadError, mostRecentRC, visibleReplicationControllers };\n};\n","import * as React from 'react';\nimport { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';\nimport { K8sResourceKind, RouteKind } from '@console/internal/module/k8s';\nimport { getRoutesForServices } from '../utils';\nimport { useServicesWatcher } from './useServicesWatcher';\n\nexport const useRoutesWatcher = (\n resource: K8sResourceKind,\n): { loaded: boolean; loadError: string; routes: RouteKind[] } => {\n const watchedServices = useServicesWatcher(resource);\n const [allRoutes, loaded, loadError] = useK8sWatchResource<RouteKind[]>({\n isList: true,\n kind: 'Route',\n namespace: resource?.metadata?.namespace,\n });\n\n const servicesNames = React.useMemo(\n () =>\n !watchedServices.loadError && watchedServices.loaded\n ? watchedServices.services.map((s) => s.metadata?.name)\n : [],\n [watchedServices.loadError, watchedServices.loaded, watchedServices.services],\n );\n\n const routes = React.useMemo(() => getRoutesForServices(servicesNames, allRoutes), [\n servicesNames,\n allRoutes,\n ]);\n\n return {\n loaded: loaded && watchedServices.loaded,\n loadError: loadError || watchedServices.loadError,\n routes,\n };\n};\n","import * as React from 'react';\nimport { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';\nimport { referenceForModel } from '@console/internal/module/k8s';\nimport {\n ClusterServiceVersionModel,\n ClusterServiceVersionKind,\n} from '@console/operator-lifecycle-manager';\n\ntype CsvWatchResource = {\n csvData: ClusterServiceVersionKind[];\n csvLoaded: boolean;\n csvError: {};\n};\nexport const useCsvWatchResource = (ns: string): CsvWatchResource => {\n const csvResource = React.useMemo(\n () => ({\n isList: true,\n kind: referenceForModel(ClusterServiceVersionModel),\n namespace: ns,\n optional: true,\n }),\n [ns],\n );\n\n const [csvData, csvLoaded, csvError] = useK8sWatchResource<ClusterServiceVersionKind[]>(\n csvResource,\n );\n return { csvData, csvLoaded, csvError };\n};\n","import { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\n// FIXME upgrading redux types is causing many errors at this time\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useSelector } from 'react-redux';\nimport { Location } from 'react-router-dom-v5-compat';\nimport { getBreadcrumbPath } from '@console/internal/components/utils/breadcrumbs';\nimport { K8sKind } from '@console/internal/module/k8s';\nimport { getActiveNamespace } from '@console/internal/reducers/ui';\nimport { RootState } from '@console/internal/redux';\nimport { ALL_NAMESPACES_KEY } from '../constants/common';\n\nexport const useTabbedTableBreadcrumbsFor = (\n kindObj: K8sKind,\n location: Location,\n params: { [key: string]: string },\n navOption: string,\n subTab: string = null,\n customBreadcrumbName?: string,\n customBreadcrumbURLRequired?: boolean,\n customBreadCrumbDetailsPrefix?: string,\n) => {\n const { t } = useTranslation();\n const { label, labelKey, labelPlural, labelPluralKey } = kindObj;\n const currentNamespace = useSelector((state: RootState) => getActiveNamespace(state));\n const nsURL =\n ALL_NAMESPACES_KEY === currentNamespace ? 'all-namespaces' : `ns/${currentNamespace}`;\n return useMemo(\n () =>\n subTab === null\n ? []\n : [\n {\n name: customBreadcrumbName || (labelPluralKey ? t(labelPluralKey) : labelPlural),\n path: customBreadcrumbURLRequired\n ? `/${navOption}/${nsURL}/${subTab}`\n : getBreadcrumbPath(params),\n },\n {\n name: t('console-shared~{{label}} details', {\n label: customBreadCrumbDetailsPrefix || (labelKey ? t(labelKey) : label),\n }),\n path: location,\n },\n ],\n [\n subTab,\n customBreadcrumbName,\n customBreadcrumbURLRequired,\n customBreadCrumbDetailsPrefix,\n labelPluralKey,\n t,\n labelPlural,\n navOption,\n nsURL,\n location,\n params,\n labelKey,\n label,\n ],\n );\n};\n","import { useMemo, useCallback } from 'react';\nimport * as _ from 'lodash';\nimport { ExtensionK8sModel, K8sModel, useActivePerspective } from '@console/dynamic-plugin-sdk';\nimport { referenceForExtensionModel, useModelFinder } from '@console/internal/module/k8s';\nimport { PINNED_RESOURCES_LOCAL_STORAGE_KEY } from '../constants';\nimport { usePerspectives, Perspective } from './perspective-utils';\nimport { useTelemetry } from './useTelemetry';\nimport { useUserSettingsCompatibility } from './useUserSettingsCompatibility';\n\ntype PinnedResourcesType = {\n [perspective: string]: string[];\n};\n\nconst PINNED_RESOURCES_CONFIG_MAP_KEY = 'console.pinnedResources';\n\nexport const usePinnedResources = (): [string[], (pinnedResources: string[]) => void, boolean] => {\n const fireTelemetryEvent = useTelemetry();\n const [activePerspective] = useActivePerspective();\n const perspectiveExtensions = usePerspectives();\n const { findModel } = useModelFinder();\n\n const getPins = useCallback(\n (id: string, defaultPins: ExtensionK8sModel[]): ExtensionK8sModel[] => {\n let customizedPins: ExtensionK8sModel[] = null;\n if (window.SERVER_FLAGS.perspectives) {\n const perspectives: Perspective[] = JSON.parse(window.SERVER_FLAGS.perspectives);\n const perspective = perspectives.find((p: Perspective) => p.id === id);\n customizedPins = perspective?.pinnedResources?.map((pr) => {\n const model: K8sModel = findModel(pr.group, pr.resource);\n return (\n model && {\n group: pr.group,\n version: pr.version,\n kind: model.kind,\n }\n );\n });\n }\n return customizedPins ?? defaultPins ?? [];\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const defaultPins: PinnedResourcesType = useMemo(\n () =>\n perspectiveExtensions.reduce(\n (acc, e) => ({\n ...acc,\n [e.properties.id]: getPins(e.properties.id, e.properties.defaultPins)?.map((gvk) =>\n referenceForExtensionModel(gvk),\n ),\n }),\n {},\n ),\n [perspectiveExtensions, getPins],\n );\n const [pinnedResources, setPinnedResources, loaded] = useUserSettingsCompatibility<\n PinnedResourcesType\n >(PINNED_RESOURCES_CONFIG_MAP_KEY, PINNED_RESOURCES_LOCAL_STORAGE_KEY, null, true);\n\n const pins = useMemo(() => {\n if (!loaded) {\n return [];\n }\n if (_.isEmpty(pinnedResources) || !pinnedResources?.[activePerspective]) {\n return defaultPins[activePerspective] ?? [];\n }\n return pinnedResources[activePerspective] ?? [];\n }, [loaded, pinnedResources, activePerspective, defaultPins]);\n\n const setPins = useCallback(\n (newPins: string[]) => {\n setPinnedResources((prevPR) => {\n _.difference(\n newPins,\n prevPR?.[activePerspective]?.length > 0 ? prevPR[activePerspective] : pins,\n ).forEach((resource) =>\n fireTelemetryEvent('Navigation Added', {\n resource,\n perspective: activePerspective,\n }),\n );\n\n _.difference(\n prevPR?.[activePerspective]?.length > 0 ? prevPR[activePerspective] : pins,\n newPins,\n ).forEach((resource) =>\n fireTelemetryEvent('Navigation Removed', {\n resource,\n perspective: activePerspective,\n }),\n );\n\n return { ...prevPR, [activePerspective]: newPins };\n });\n },\n [setPinnedResources, activePerspective, pins, fireTelemetryEvent],\n );\n\n return [pins, setPins, loaded];\n};\n","import * as React from 'react';\n\nconst MAX_MOBILE_WIDTH = 767;\nconst MOBILE_MEDIA_QUERY = `(max-width: ${MAX_MOBILE_WIDTH}px)`;\n\nexport const useIsMobile = () => {\n const [isMobile, setIsMobile] = React.useState<boolean>(window.innerWidth <= MAX_MOBILE_WIDTH);\n\n React.useEffect(() => {\n const mobileResolutionMatch = window.matchMedia(MOBILE_MEDIA_QUERY);\n\n const updateIsMobile = (e) => {\n setIsMobile(e.matches);\n };\n\n // support safari with fallback to addListener / removeListener\n if (mobileResolutionMatch.addEventListener) {\n mobileResolutionMatch.addEventListener('change', updateIsMobile);\n } else {\n mobileResolutionMatch.addListener(updateIsMobile);\n }\n\n // Remove event listener on cleanup\n return () => {\n if (mobileResolutionMatch.removeEventListener) {\n mobileResolutionMatch.removeEventListener('change', updateIsMobile);\n } else {\n mobileResolutionMatch.removeListener(updateIsMobile);\n }\n };\n }, []); // Empty array ensures that effect is only run on mount\n\n return isMobile;\n};\n","import * as React from 'react';\nimport { useResizeObserver } from './useResizeObserver';\n\ntype BoundingClientRect = ClientRect | null;\n\nexport const useBoundingClientRect = (targetElement: HTMLElement | null): BoundingClientRect => {\n const [clientRect, setClientRect] = React.useState<BoundingClientRect>(() =>\n targetElement ? targetElement.getBoundingClientRect() : null,\n );\n\n const observerCallback = React.useCallback(() => {\n setClientRect(targetElement ? targetElement.getBoundingClientRect() : null);\n }, [targetElement]);\n\n useResizeObserver(observerCallback);\n\n return clientRect;\n};\n","import { useEffect } from 'react';\n\nexport const useEventListener = (\n target: EventTarget,\n event: keyof WindowEventMap,\n callback: EventListener,\n) => {\n useEffect(() => {\n target.addEventListener(event, callback);\n return () => {\n target.removeEventListener(event, callback);\n };\n }, [target, event, callback]);\n};\n","import * as React from 'react';\nimport { Modal as PfModal, ModalProps as PfModalProps } from '@patternfly/react-core';\nimport * as cx from 'classnames';\nimport './Modal.scss';\n\ntype ModalProps = {\n isFullScreen?: boolean;\n ref?: React.LegacyRef<PfModal>;\n} & PfModalProps;\n\nconst Modal: React.FC<ModalProps> = ({ isFullScreen = false, className, ...props }) => (\n <PfModal\n {...props}\n className={cx('ocs-modal', className)}\n appendTo={() => (isFullScreen ? document.body : document.querySelector('#modal-container'))}\n />\n);\n\nexport default Modal;\n","import * as React from 'react';\nimport { consoleFetchJSON as coFetchJSON } from '@console/dynamic-plugin-sdk/src/utils/fetch';\nimport { FLAGS } from '../constants';\nimport { useFlag } from './flag';\n\nconst COPY_LOGIN_COMMANDS_ENDPOINT = '/api/copy-login-commands';\n\nexport const useCopyLoginCommands = (): [string, string] => {\n const [requestTokenURL, setRequestTokenURL] = React.useState<string>();\n const [externalLoginCommand, setExternalLoginCommand] = React.useState<string>();\n const authEnabled = useFlag(FLAGS.AUTH_ENABLED);\n React.useEffect(() => {\n if (authEnabled) {\n coFetchJSON(COPY_LOGIN_COMMANDS_ENDPOINT, 'GET', {}, 5000)\n .then((resp) => {\n const newRequestTokenURL = resp?.requestTokenURL ?? '';\n const newExternalLoginCommand = resp?.externalLoginCommand ?? '';\n if (newRequestTokenURL) {\n setRequestTokenURL(newRequestTokenURL);\n setExternalLoginCommand('');\n } else if (newExternalLoginCommand) {\n setExternalLoginCommand(newExternalLoginCommand);\n setRequestTokenURL('');\n }\n })\n .catch((err) => {\n // eslint-disable-next-line no-console\n console.warn(`GET ${COPY_LOGIN_COMMANDS_ENDPOINT} failed: ${err}`);\n setRequestTokenURL('');\n setExternalLoginCommand('');\n });\n }\n }, [authEnabled]);\n\n return [requestTokenURL, externalLoginCommand];\n};\n","export * from './PopupKebabMenu';\n","import * as React from 'react';\nimport { DropdownMenu as DropdownMenuDeprecated } from '@patternfly/react-core/deprecated';\nimport * as classNames from 'classnames';\nimport * as _ from 'lodash';\nimport { history, KebabItem, KebabOption } from '@console/internal/components/utils';\nimport './PopupKebabMenu.scss';\n\nexport interface PopupKebabMenuProps {\n kebabOptions: KebabOption[];\n className?: string;\n onClose?(): void;\n eventX: number;\n eventY: number;\n container?: Element;\n}\ninterface PopopKebabMenuState {\n menuTop: number;\n menuLeft: number;\n}\n\nconst MENU_PADDING = 20;\n\nexport class PopupKebabMenu extends React.Component<PopupKebabMenuProps, PopopKebabMenuState> {\n state = {\n menuTop: 0,\n menuLeft: 0,\n };\n\n private menu: Element;\n\n componentDidMount() {\n document.addEventListener('focus', this.handleBlur, true);\n this.updateMenuPosition();\n }\n\n componentDidUpdate(prevProps) {\n if (\n this.props.eventX !== prevProps.eventX ||\n this.props.eventY !== prevProps.eventY ||\n !_.isEqual(this.props.kebabOptions, prevProps.kebabOptions)\n ) {\n this.updateMenuPosition();\n }\n }\n\n componentWillUnmount() {\n document.removeEventListener('focus', this.handleBlur, true);\n }\n\n updateMenuPosition = () => {\n const { container, eventX, eventY } = this.props;\n let menuTop = eventY;\n let menuLeft = eventX;\n\n if (container) {\n const menu: Element = this.menu.firstElementChild;\n if (menu) {\n const elementRect = container.getBoundingClientRect();\n const menuRect = menu.getBoundingClientRect();\n\n if (\n eventY + menuRect.height + menuRect.top >\n elementRect.top + elementRect.height - MENU_PADDING\n ) {\n menuTop = Math.max(\n elementRect.top + elementRect.height - menuRect.height - menuRect.top - MENU_PADDING,\n 0,\n );\n }\n if (\n eventX + menuRect.width + menuRect.left >\n elementRect.left + elementRect.width - MENU_PADDING\n ) {\n menuLeft = Math.max(\n elementRect.left + elementRect.width - menuRect.width - menuRect.left - MENU_PADDING,\n 0,\n );\n }\n }\n }\n\n if (menuTop !== this.state.menuTop || menuLeft !== this.state.menuLeft) {\n this.setState({ menuTop, menuLeft });\n }\n };\n\n handleClose = () => {\n const { onClose } = this.props;\n\n onClose && onClose();\n };\n\n handleMenuMouseDown = (e) => {\n e.stopPropagation();\n };\n\n handleBlur = (e) => {\n if (!this.menu.contains(e.target)) {\n let focusTarget;\n\n const menuItems = this.menu.querySelectorAll('button');\n if (_.first(menuItems) === e.relatedTarget) {\n focusTarget = _.last(menuItems);\n } else if (_.last(menuItems) === e.relatedTarget) {\n focusTarget = _.first(menuItems);\n } else {\n focusTarget = e.relatedTarget;\n }\n\n focusTarget.focus();\n }\n };\n\n onKebabOptionClick = (event, option: KebabOption) => {\n event.stopPropagation();\n\n if (option.callback) {\n option.callback();\n }\n\n if (option.href) {\n history.push(option.href);\n }\n\n this.handleClose();\n };\n\n setMenu = (ref) => {\n this.menu = ref;\n };\n\n render() {\n const { className, kebabOptions } = this.props;\n const { menuTop, menuLeft } = this.state;\n const visibleOptions = _.reject(kebabOptions, (o) => _.get(o, 'hidden', false));\n const classes = classNames('ocs-popup-kebab-menu', className);\n\n return (\n <div className=\"pf-v5-c-page ocs-popup-kebab-menu__container\">\n <input className=\"ocs-popup-kebab-menu__faux-input\" />\n <div className={classes}>\n <div\n className=\"ocs-popup-kebab-menu__backdrop\"\n role=\"presentation\"\n onMouseDown={this.handleClose}\n >\n <div\n className=\"pf-v5-c-dropdown pf-m-expanded\"\n style={{ top: menuTop, left: menuLeft }}\n ref={this.setMenu}\n role=\"presentation\"\n onMouseDown={this.handleMenuMouseDown}\n >\n <DropdownMenuDeprecated className=\"pf-v5-c-dropdown__menu\">\n {_.map(visibleOptions, (o, i) => (\n <li key={i}>\n <KebabItem\n option={o}\n onClick={this.onKebabOptionClick}\n autoFocus={i === 0}\n onEscape={this.handleClose}\n />\n </li>\n ))}\n </DropdownMenuDeprecated>\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n","import * as React from 'react';\nimport DropdownWithSwitchMenu from './DropdownWithSwitchMenu';\nimport DropdownWithSwitchToggle from './DropdownWithSwitchToggle';\n\nconst DropdownWithSwitch: React.FC<DropdownWithSwitchProps> = ({\n isDisabled,\n isFullWidth,\n toggleLabel,\n ...dropdownWithSwitchMenuProps\n}) => {\n const menuRef = React.useRef(null);\n const [isOpen, setOpen] = React.useState(false);\n const switchMenuProps: React.ComponentProps<typeof DropdownWithSwitchMenu> = {\n ...dropdownWithSwitchMenuProps,\n menuRef,\n setOpen,\n };\n const onToggle = React.useCallback((menuState: boolean) => {\n setOpen(menuState);\n }, []);\n\n return (\n <DropdownWithSwitchToggle\n isDisabled={isDisabled}\n isFullWidth={isFullWidth}\n label={toggleLabel}\n menu={<DropdownWithSwitchMenu {...switchMenuProps} />}\n menuRef={menuRef}\n isOpen={isOpen}\n onToggle={onToggle}\n />\n );\n};\n\ntype DropdownWithSwitchProps = Omit<\n React.ComponentProps<typeof DropdownWithSwitchMenu>,\n 'menuRef' | 'setOpen'\n> & {\n isDisabled?: boolean;\n isFullWidth?: boolean;\n toggleLabel: string;\n};\n\nexport default DropdownWithSwitch;\n","import { MachineSetKind } from '@console/internal/module/k8s';\n\n// How to find the instance type varies by provider\n// Amazon: obj.spec?.template?.spec?.providerSpec?.value?.instanceType\n// Azure: obj.spec?.template?.spec?.providerSpec?.value?.vmSize\n// GCP: obj.spec?.template?.spec?.providerSpec?.value?.machineType\n// OpenStack: obj.spec?.template?.spec?.providerSpec?.value?.flavor\n// RHV: Field is being removed in favor of users setting memory/CPU explicitly\n// vSphere has no single field to gather this information\nexport const getMachineSetInstanceType = (obj: MachineSetKind): string =>\n obj.spec?.template?.spec?.providerSpec?.value?.instanceType ||\n obj.spec?.template?.spec?.providerSpec?.value?.vmSize ||\n obj.spec?.template?.spec?.providerSpec?.value?.machineType ||\n obj.spec?.template?.spec?.providerSpec?.value?.flavor;\n","import { K8sResourceKind } from '@console/internal/module/k8s';\n\nexport const getRequester = (obj: K8sResourceKind): string =>\n obj.metadata.annotations?.['openshift.io/requester'];\nexport const getDescription = (obj: K8sResourceKind): string =>\n obj.metadata.annotations?.['openshift.io/description'];\n","import { K8sResourceKind, StorageClassResourceKind } from '@console/internal/module/k8s';\n\nexport const getRequestedPVCSize = (pvc: K8sResourceKind): string =>\n pvc?.spec?.resources?.requests?.storage;\n\nexport const onlyPvcSCs = (\n scObj: StorageClassResourceKind,\n scResourceLoadError: boolean,\n scResource: StorageClassResourceKind | null,\n) =>\n !scResourceLoadError\n ? scObj.provisioner.includes(scResource?.provisioner) &&\n scObj.parameters?.encrypted === scResource?.parameters?.encrypted\n : true;\n","import * as React from 'react';\nimport { ActionGroup, Alert, Button, ButtonVariant } from '@patternfly/react-core';\nimport { DownloadIcon } from '@patternfly/react-icons/dist/esm/icons/download-icon';\nimport * as cx from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport { ButtonBar } from '@console/internal/components/utils';\nimport { Shadows, useScrollShadows, useScrollContainer } from '../../hooks';\nimport { FormFooterProps } from './form-utils-types';\n\nimport './FormFooter.scss';\n\nconst FormFooter: React.FC<FormFooterProps> = ({\n handleSubmit,\n handleReset,\n handleCancel,\n handleDownload,\n submitLabel,\n resetLabel,\n cancelLabel,\n infoTitle,\n infoMessage,\n isSubmitting,\n errorMessage,\n successMessage,\n disableSubmit,\n hideSubmit = false,\n showAlert,\n sticky,\n}) => {\n const { t } = useTranslation();\n const [scrollContainer, footerElementRef] = useScrollContainer();\n const shadowPosition = useScrollShadows(sticky ? scrollContainer : null);\n return (\n <div\n className={cx('ocs-form-footer', {\n 'ocs-form-footer__sticky': sticky,\n 'ocs-form-footer__shadow':\n sticky && (shadowPosition === Shadows.both || shadowPosition === Shadows.bottom),\n })}\n data-test=\"form-footer\"\n ref={footerElementRef}\n >\n <ButtonBar\n inProgress={isSubmitting && hideSubmit}\n errorMessage={errorMessage}\n successMessage={successMessage}\n >\n {showAlert && (\n <Alert\n isInline\n className=\"co-alert\"\n variant=\"info\"\n title={infoTitle || t('console-shared~You made changes to this page.')}\n >\n {infoMessage ||\n t('console-shared~Click {{submit}} to save changes or {{reset}} to cancel changes.', {\n submit: submitLabel,\n reset: resetLabel,\n })}\n </Alert>\n )}\n <ActionGroup className=\"pf-v5-c-form pf-v5-c-form__group--no-top-margin\">\n {!hideSubmit && (\n <Button\n type={handleSubmit ? 'button' : 'submit'}\n {...(handleSubmit && { onClick: handleSubmit })}\n variant={ButtonVariant.primary}\n isDisabled={disableSubmit}\n isLoading={isSubmitting}\n data-test-id=\"submit-button\"\n data-test=\"save-changes\"\n >\n {submitLabel || t('console-shared~Save')}\n </Button>\n )}\n {handleReset && (\n <Button\n type=\"button\"\n data-test-id=\"reset-button\"\n variant={ButtonVariant.secondary}\n onClick={handleReset}\n >\n {resetLabel || t('console-shared~Reload')}\n </Button>\n )}\n {handleCancel && (\n <Button\n type=\"button\"\n data-test-id=\"cancel-button\"\n variant={ButtonVariant.secondary}\n onClick={handleCancel}\n >\n {cancelLabel || t('console-shared~Cancel')}\n </Button>\n )}\n {handleDownload && (\n <Button\n type=\"button\"\n data-test-id=\"download-button\"\n variant={ButtonVariant.secondary}\n className=\"pf-v5-c-button--align-right hidden-sm hidden-xs\"\n onClick={handleDownload}\n icon={<DownloadIcon />}\n >\n {t('console-shared~Download')}\n </Button>\n )}\n </ActionGroup>\n </ButtonBar>\n </div>\n );\n};\nexport default FormFooter;\n","import * as React from 'react';\nimport { Title, FormHelperText } from '@patternfly/react-core';\n\ntype SpacerSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';\n\ntype FormHeaderProps = {\n title: React.ReactNode;\n helpText?: React.ReactNode;\n marginTop?: SpacerSize;\n marginBottom?: SpacerSize;\n};\n\nconst FormHeader: React.FC<FormHeaderProps> = ({ title, helpText, marginTop, marginBottom }) => {\n const marginStyles = {\n ...(marginTop ? { marginTop: `var(--pf-v5-global--spacer--${marginTop})` } : {}),\n ...(marginBottom ? { marginBottom: `var(--pf-v5-global--spacer--${marginBottom})` } : {}),\n };\n\n return (\n <div style={marginStyles}>\n <Title headingLevel=\"h1\" size=\"2xl\" data-test=\"form-title\">\n {title}\n </Title>\n <FormHelperText style={{ marginTop: 'var(--pf-v5-global--spacer--xs)' }}>\n {helpText}\n </FormHelperText>\n </div>\n );\n};\n\nexport default FormHeader;\n","import * as React from 'react';\nimport classnames from 'classnames';\n\ninterface PageBodyProps {\n children?: React.ReactNode;\n flexLayout?: boolean;\n}\n\nconst PageBody: React.FC<PageBodyProps> = ({ children, flexLayout }) => (\n <div\n className={classnames('co-m-pane__body', { 'co-m-page__body': flexLayout })}\n style={{ paddingBottom: 0 }}\n >\n {children}\n </div>\n);\n\nexport default PageBody;\n","import * as React from 'react';\n\ntype FlexFormProps = {\n children?: React.ReactNode;\n};\n\nconst FlexForm: React.FC<FlexFormProps & React.HTMLProps<HTMLFormElement>> = ({\n children,\n ...props\n}) => (\n <form {...props} style={{ display: 'flex', flex: 1, flexDirection: 'column' }}>\n {children}\n </form>\n);\n\nexport default FlexForm;\n","import * as React from 'react';\nimport { ActionGroup, Button, ButtonVariant } from '@patternfly/react-core';\nimport { CheckIcon } from '@patternfly/react-icons/dist/esm/icons/check-icon';\nimport CloseButton from '../close-button/CloseButton';\nimport { ActionGroupWithIconsProps } from './form-utils-types';\n\nconst ActionGroupWithIcons: React.FC<ActionGroupWithIconsProps> = ({\n onSubmit,\n onClose,\n isDisabled,\n}) => {\n return (\n <ActionGroup className=\"pf-v5-c-form pf-v5-c-form__actions--right\">\n {onSubmit && (\n <Button\n type=\"submit\"\n onClick={onSubmit}\n variant={ButtonVariant.plain}\n data-test-id=\"check-icon\"\n style={{ padding: '0' }}\n isDisabled={isDisabled}\n >\n <CheckIcon />\n </Button>\n )}\n <CloseButton\n additionalClassName=\"co-close-button--no-padding\"\n dataTestID=\"close-icon\"\n onClick={onClose}\n />\n </ActionGroup>\n );\n};\n\nexport default ActionGroupWithIcons;\n","import * as React from 'react';\nimport * as classNames from 'classnames';\n\ntype FormBodyProps = {\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n flexLayout?: boolean;\n disablePaneBody?: boolean;\n};\n\nconst FormBody: React.FC<FormBodyProps & React.HTMLProps<HTMLDivElement>> = ({\n children,\n className,\n style,\n disablePaneBody = false,\n flexLayout = false,\n ...props\n}) => (\n <div\n {...props}\n className={classNames('pf-v5-c-form', { 'co-m-pane__body': !disablePaneBody }, className)}\n style={\n flexLayout\n ? { display: 'flex', flex: 1, flexDirection: 'column', paddingBottom: 0, ...(style ?? {}) }\n : { paddingBottom: 0, ...(style ?? {}) }\n }\n >\n {children}\n </div>\n);\n\nexport default FormBody;\n","/* eslint-disable no-unused-vars, no-undef */\nimport * as React from 'react';\nimport { Checkbox } from '@patternfly/react-core';\nimport { CheckboxFieldProps } from './field-types';\nimport ToggleableFieldBase from './ToggleableFieldBase';\n\nconst CheckboxField: React.FC<CheckboxFieldProps> = (baseProps) => (\n <ToggleableFieldBase {...baseProps}>\n {(props) => <Checkbox {...props} data-checked-state={props.isChecked} />}\n </ToggleableFieldBase>\n);\n\nexport default CheckboxField;\n","import * as React from 'react';\nimport { StatusComponent as Status } from '@console/dynamic-plugin-sdk';\n\nexport { StatusComponent as Status } from '@console/dynamic-plugin-sdk';\n\nexport const StatusIcon: React.FC<StatusIconProps> = ({ status }) => (\n <Status status={status} iconOnly />\n);\n\ntype StatusIconProps = {\n status: string;\n};\n","import * as React from 'react';\nimport { StatusComponentProps } from '@console/dynamic-plugin-sdk';\nimport { WarningStatus } from './statuses';\n\nconst NodeUnschedulableStatus: React.FC<NodeUnschedulableStatusProps> = ({\n status,\n title,\n iconOnly,\n noTooltip,\n className,\n}) => {\n const statusProps = { title: title || status, iconOnly, noTooltip, className };\n return <WarningStatus {...statusProps} />;\n};\n\ntype NodeUnschedulableStatusProps = StatusComponentProps & {\n status: string;\n};\n\nexport default NodeUnschedulableStatus;\n","import * as React from 'react';\nimport { FormGroup, FormHelperText, HelperText, HelperTextItem } from '@patternfly/react-core';\nimport cx from 'classnames';\nimport { useField, useFormikContext, FormikValues } from 'formik';\nimport { Dropdown } from '@console/internal/components/utils';\nimport { useFormikValidationFix } from '../../hooks';\nimport { RedExclamationCircleIcon } from '../status';\nimport { DropdownFieldProps } from './field-types';\nimport { getFieldId } from './field-utils';\n\nconst DropdownField: React.FC<DropdownFieldProps> = ({ label, helpText, required, ...props }) => {\n const [field, { touched, error }] = useField(props.name);\n const { setFieldValue, setFieldTouched } = useFormikContext<FormikValues>();\n const fieldId = getFieldId(props.name, 'dropdown');\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n\n useFormikValidationFix(field.value);\n\n return (\n <FormGroup fieldId={fieldId} label={label} isRequired={required}>\n <Dropdown\n {...props}\n id={fieldId}\n selectedKey={field.value}\n dropDownClassName={cx({ 'dropdown--full-width': props.fullWidth })}\n aria-describedby={helpText ? `${fieldId}-helper` : undefined}\n onChange={(value: string) => {\n props.onChange && props.onChange(value);\n // Validation is automatically done by the useFormikValidationFix above\n setFieldValue(props.name, value, false);\n setFieldTouched(props.name, true, false);\n }}\n />\n\n <FormHelperText>\n <HelperText>\n {!isValid ? (\n <HelperTextItem variant=\"error\" icon={<RedExclamationCircleIcon />}>\n {errorMessage}\n </HelperTextItem>\n ) : (\n <HelperTextItem>{helpText}</HelperTextItem>\n )}\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n};\n\nexport default DropdownField;\n","import * as React from 'react';\nimport { FormGroup } from '@patternfly/react-core';\nimport { FormikValues, useField, useFormikContext } from 'formik';\nimport { DroppableFileInput } from '@console/internal/components/utils/file-input';\nimport { DroppableFileInputFieldProps } from './field-types';\nimport { getFieldId } from './field-utils';\n\nconst DroppableFileInputField: React.FC<DroppableFileInputFieldProps> = ({\n name,\n label,\n helpText,\n onChange,\n}) => {\n const [field] = useField(name);\n const { setFieldValue } = useFormikContext<FormikValues>();\n const fieldId = getFieldId(name, 'droppable-input');\n return (\n <FormGroup fieldId={fieldId}>\n <DroppableFileInput\n id={fieldId}\n label={label}\n onChange={(fileData: string) => {\n setFieldValue(name, fileData);\n onChange && onChange(fileData);\n }}\n inputFileData={field.value}\n inputFieldHelpText={helpText}\n aria-describedby={helpText ? `${fieldId}-helper` : undefined}\n />\n </FormGroup>\n );\n};\n\nexport default DroppableFileInputField;\n","import * as React from 'react';\nimport { FormGroup, FormHelperText, HelperText, HelperTextItem } from '@patternfly/react-core';\nimport { useFormikContext, FormikValues } from 'formik';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { errorModal } from '@console/internal/components/modals';\nimport { NameValueEditor } from '@console/internal/components/utils/name-value-editor';\nimport { SecretModel, ConfigMapModel } from '@console/internal/models';\nimport { k8sGet } from '@console/internal/module/k8s';\nimport { EnvironmentFieldProps } from './field-types';\nimport { getFieldId } from './field-utils';\n\nconst EnvironmentField: React.FC<EnvironmentFieldProps> = ({\n label,\n helpText,\n required,\n envs,\n ...props\n}) => {\n const {\n obj: {\n metadata: { namespace },\n },\n } = props;\n const { setFieldValue, values } = useFormikContext<FormikValues>();\n const { t } = useTranslation();\n const fieldId = getFieldId(props.name, 'env-input');\n const environmentVariables = React.useMemo(() => {\n return _.isEmpty(envs) ? [['', '']] : envs.map((env) => _.values(env));\n }, [envs]);\n const [nameValue, setNameValue] = React.useState(environmentVariables);\n const [configMaps, setConfigMaps] = React.useState({});\n const [secrets, setSecrets] = React.useState({});\n const handleNameValuePairs = React.useCallback(\n ({ nameValuePairs }) => {\n const updatedNameValuePairs = _.compact(\n nameValuePairs.map(([name, value]) => {\n if (_.isObject(value)) {\n return { name, valueFrom: value };\n }\n if (value.length) {\n return { name, value };\n }\n return null;\n }),\n );\n setNameValue(nameValuePairs);\n setFieldValue(props.name, updatedNameValuePairs);\n },\n [props.name, setFieldValue],\n );\n\n React.useEffect(() => {\n if (values.formReloadCount) {\n setNameValue(environmentVariables);\n }\n // this effect only handles reload, so we disable dep on environmentVariables\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [values.formReloadCount]);\n\n React.useEffect(() => {\n Promise.all([k8sGet(ConfigMapModel, null, namespace), k8sGet(SecretModel, null, namespace)])\n .then(([nsConfigMaps, nsSecrets]) => {\n setConfigMaps(nsConfigMaps);\n setSecrets(nsSecrets);\n })\n .catch(async (err) => {\n if (err?.response?.status !== 403) {\n try {\n await errorModal({ error: err?.message });\n // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n });\n }, [namespace]);\n\n return (\n <FormGroup fieldId={fieldId} label={label} isRequired={required}>\n <NameValueEditor\n nameValuePairs={nameValue}\n valueString={t('console-shared~Value')}\n nameString={t('console-shared~Name')}\n addString={t('console-shared~Add value')}\n readOnly={false}\n allowSorting={false}\n updateParentData={handleNameValuePairs}\n configMaps={configMaps}\n secrets={secrets}\n addConfigMapSecret\n />\n\n <FormHelperText>\n <HelperText>\n <HelperTextItem>{helpText}</HelperTextItem>\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n};\n\nexport default EnvironmentField;\n","import * as React from 'react';\nimport {\n FormGroup,\n FormHelperText,\n FormSelect,\n FormSelectOption,\n HelperText,\n HelperTextItem,\n} from '@patternfly/react-core';\nimport { useField, useFormikContext, FormikValues } from 'formik';\nimport { useFormikValidationFix } from '../../hooks';\nimport { RedExclamationCircleIcon } from '../status';\nimport { FormSelectFieldOption, FormSelectFieldProps } from './field-types';\nimport { getFieldId } from './field-utils';\n\nconst FormSelectField: React.FC<FormSelectFieldProps> = ({\n label,\n helpText,\n required,\n options,\n ...props\n}) => {\n const [field, { touched, error }] = useField(props.name);\n const { setFieldValue, setFieldTouched } = useFormikContext<FormikValues>();\n const fieldId = getFieldId(props.name, 'dropdown');\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n\n useFormikValidationFix(field.value);\n\n // PF bug workaround\n // Return to field.value when fixed: https://github.com/patternfly/patternfly-react/issues/5687\n const hasSelectedOption: boolean = options.some(({ value }) => field.value === value);\n const placeholderOption: FormSelectFieldOption = options.find(\n ({ isPlaceholder }) => isPlaceholder,\n );\n const safeValue: string = hasSelectedOption\n ? field.value\n : placeholderOption\n ? placeholderOption.value\n : field.value;\n\n return (\n <FormGroup fieldId={fieldId} label={label} isRequired={required}>\n <FormSelect\n {...props}\n id={fieldId}\n aria-describedby={helpText ? `${fieldId}-helper` : undefined}\n onChange={(_event, value: any) => {\n props.onChange && props.onChange(value);\n // Validation is automatically done by the useFormikValidationFix above\n setFieldValue(props.name, value, false);\n setFieldTouched(props.name, true, false);\n }}\n value={safeValue}\n >\n {options.map((option) => (\n <FormSelectOption {...option} key={option.label} />\n ))}\n </FormSelect>\n\n <FormHelperText>\n <HelperText>\n {!isValid ? (\n <HelperTextItem variant=\"error\" icon={<RedExclamationCircleIcon />}>\n {errorMessage}\n </HelperTextItem>\n ) : (\n <HelperTextItem>{helpText}</HelperTextItem>\n )}\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n};\n\nexport default FormSelectField;\n","import * as React from 'react';\nimport {\n FormGroup,\n FormHelperText,\n HelperText,\n HelperTextItem,\n gridItemSpanValueShape,\n} from '@patternfly/react-core';\nimport { FieldArray, useFormikContext, FormikValues } from 'formik';\nimport * as _ from 'lodash';\nimport { useFormikValidationFix } from '../../../hooks/formik-validation-fix';\nimport SecondaryStatus from '../../status/SecondaryStatus';\nimport { MultiColumnFieldProps } from '../field-types';\nimport { getSpans } from './multicolumn-field-utils';\nimport MultiColumnFieldFooter from './MultiColumnFieldFooter';\nimport MultiColumnFieldHeader from './MultiColumnFieldHeader';\nimport MultiColumnFieldRow from './MultiColumnFieldRow';\nimport './MultiColumnField.scss';\n\nconst MultiColumnField: React.FC<MultiColumnFieldProps> = ({\n children,\n name,\n label,\n helpText,\n required,\n addLabel,\n headers,\n emptyValues,\n emptyMessage,\n isReadOnly,\n disableDeleteRow,\n tooltipDeleteRow,\n disableAddRow,\n tooltipAddRow,\n spans,\n complexFields,\n rowRenderer,\n ...props\n}) => {\n const { values } = useFormikContext<FormikValues>();\n const fieldValue = _.get(values, name, []);\n const totalFieldCount: gridItemSpanValueShape = React.Children.count(\n children,\n ) as gridItemSpanValueShape;\n const fieldSpans = spans || getSpans(totalFieldCount);\n useFormikValidationFix(fieldValue);\n return (\n <FieldArray\n name={name}\n render={({ push, remove }) => {\n return (\n <FormGroup\n data-test={props['data-test'] || 'multicolumn-field'}\n fieldId={`form-multi-column-input-${name.replace(/\\./g, '-')}-field`}\n label={label}\n isRequired={required}\n >\n {fieldValue.length < 1 ? (\n emptyMessage && (\n <div className=\"odc-multi-column-field__empty-message\">\n <SecondaryStatus status={emptyMessage} />\n </div>\n )\n ) : (\n <MultiColumnFieldHeader headers={headers} spans={fieldSpans} />\n )}\n {fieldValue.length > 0 &&\n fieldValue.map((value, index) => (\n <MultiColumnFieldRow\n key={`${index.toString()}`} // There is no other usable value for key prop in this case.\n name={name}\n rowIndex={index}\n isReadOnly={isReadOnly}\n spans={fieldSpans}\n complexFields={complexFields}\n rowRenderer={rowRenderer}\n disableDeleteRow={disableDeleteRow}\n tooltipDeleteRow={tooltipDeleteRow}\n onDelete={() => remove(index)}\n >\n {children}\n </MultiColumnFieldRow>\n ))}\n {!isReadOnly && (\n <MultiColumnFieldFooter\n disableAddRow={disableAddRow}\n tooltipAddRow={tooltipAddRow}\n addLabel={addLabel}\n onAdd={() => push(emptyValues)}\n />\n )}\n\n <FormHelperText>\n <HelperText>\n <HelperTextItem>{helpText}</HelperTextItem>\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n }}\n />\n );\n};\n\nexport default MultiColumnField;\n","import * as React from 'react';\nimport { FormGroup, FormHelperText, HelperText, HelperTextItem } from '@patternfly/react-core';\nimport { useField, useFormikContext, FormikValues } from 'formik';\nimport { NsDropdown } from '@console/internal/components/utils';\nimport { useFormikValidationFix } from '../../hooks';\nimport { RedExclamationCircleIcon } from '../status';\nimport { DropdownFieldProps } from './field-types';\nimport { getFieldId } from './field-utils';\n\nconst NSDropdownField: React.FC<DropdownFieldProps> = ({\n label,\n helpText,\n required,\n fullWidth,\n ...props\n}) => {\n const [field, { touched, error }] = useField(props.name);\n const { setFieldValue, setFieldTouched } = useFormikContext<FormikValues>();\n const fieldId = getFieldId(props.name, 'ns-dropdown');\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n\n useFormikValidationFix(field.value);\n\n return (\n <FormGroup fieldId={fieldId} label={label} isRequired={required}>\n <NsDropdown\n {...props}\n id={fieldId}\n selectedKey={field.value}\n onChange={(value: string) => {\n setFieldValue(props.name, value);\n setFieldTouched(props.name, true);\n }}\n />\n\n <FormHelperText>\n <HelperText>\n {!isValid ? (\n <HelperTextItem variant=\"error\" icon={<RedExclamationCircleIcon />}>\n {errorMessage}\n </HelperTextItem>\n ) : (\n <HelperTextItem>{helpText}</HelperTextItem>\n )}\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n};\n\nexport default NSDropdownField;\n","import * as React from 'react';\nimport { FormGroup, FormHelperText, HelperText, HelperTextItem } from '@patternfly/react-core';\nimport { useField, useFormikContext, FormikValues } from 'formik';\nimport * as _ from 'lodash';\nimport { NumberSpinner } from '@console/internal/components/utils';\nimport { useFormikValidationFix } from '../../hooks';\nimport { RedExclamationCircleIcon } from '../status';\nimport { FieldProps } from './field-types';\nimport { getFieldId } from './field-utils';\n\ninterface NumberSpinnerFieldProps extends FieldProps {\n setOutputAsIntegerFlag?: boolean;\n}\n\nconst NumberSpinnerField: React.FC<NumberSpinnerFieldProps> = ({\n label,\n helpText,\n required,\n ...props\n}) => {\n const [field, { touched, error }] = useField(props.name);\n const { setFieldValue, setFieldTouched } = useFormikContext<FormikValues>();\n const fieldId = getFieldId(props.name, 'number-spinner');\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n\n useFormikValidationFix(field.value);\n\n const handleChange: React.ReactEventHandler<HTMLInputElement> = React.useCallback(\n (event) => {\n field.onChange(event);\n setFieldValue(\n props.name,\n props?.setOutputAsIntegerFlag\n ? _.toInteger(event.currentTarget.value)\n : event.currentTarget.value,\n );\n },\n [field, props.name, setFieldValue, props?.setOutputAsIntegerFlag],\n );\n\n return (\n <FormGroup fieldId={fieldId} label={label} isRequired={required}>\n <NumberSpinner\n {...field}\n {...props}\n onChange={handleChange}\n value={field.value ? parseInt(field.value, 10) : 0}\n id={fieldId}\n data-test-id=\"number-spinner-field\"\n changeValueBy={(operation: number) => {\n setFieldValue(props.name, _.toInteger(field.value) + operation);\n setFieldTouched(props.name, true);\n }}\n aria-describedby={helpText ? `${fieldId}-helper` : undefined}\n />\n\n <FormHelperText>\n <HelperText>\n {!isValid ? (\n <HelperTextItem variant=\"error\" icon={<RedExclamationCircleIcon />}>\n {errorMessage}\n </HelperTextItem>\n ) : (\n <HelperTextItem>{helpText}</HelperTextItem>\n )}\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n};\n\nexport default NumberSpinnerField;\n","import * as React from 'react';\nimport { FormGroup, FormHelperText, HelperText, HelperTextItem } from '@patternfly/react-core';\nimport cx from 'classnames';\nimport { useField, useFormikContext, FormikValues } from 'formik';\nimport { Firehose, FirehoseResource } from '@console/internal/components/utils';\nimport { K8sResourceKind } from '@console/internal/module/k8s';\nimport { useFormikValidationFix } from '../../hooks';\nimport ResourceDropdown, { ResourceDropdownItems } from '../dropdown/ResourceDropdown';\nimport { RedExclamationCircleIcon } from '../status';\nimport { DropdownFieldProps } from './field-types';\nimport { getFieldId } from './field-utils';\n\nexport interface ResourceDropdownFieldProps extends DropdownFieldProps {\n dataSelector: string[] | number[] | symbol[];\n resources: FirehoseResource[];\n showBadge?: boolean;\n onLoad?: (items: ResourceDropdownItems) => void;\n onChange?: (key: string, name?: string | object, resource?: K8sResourceKind) => void;\n resourceFilter?: (resource: K8sResourceKind) => boolean;\n autoSelect?: boolean;\n placeholder?: string;\n actionItems?: {\n actionTitle: string;\n actionKey: string;\n }[];\n appendItems?: ResourceDropdownItems;\n customResourceKey?: (key: string, resource: K8sResourceKind) => string;\n dataTest?: string;\n menuClassName?: string;\n}\n\nconst ResourceDropdownField: React.FC<ResourceDropdownFieldProps> = ({\n label,\n helpText,\n required,\n fullWidth,\n dataSelector,\n resources,\n onLoad,\n resourceFilter,\n dataTest,\n ...props\n}) => {\n const [field, { touched, error }] = useField(props.name);\n const { setFieldValue, setFieldTouched } = useFormikContext<FormikValues>();\n const fieldId = getFieldId(props.name, 'ns-dropdown');\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n\n useFormikValidationFix(field.value);\n\n return (\n <FormGroup fieldId={fieldId} label={label} isRequired={required} data-test={dataTest}>\n <Firehose resources={resources}>\n <ResourceDropdown\n {...props}\n id={fieldId}\n dataSelector={dataSelector}\n selectedKey={field.value}\n dropDownClassName={cx({ 'dropdown--full-width': fullWidth })}\n onLoad={onLoad}\n resourceFilter={resourceFilter}\n onChange={(value: string, name: string | object, resource: K8sResourceKind) => {\n props.onChange && props.onChange(value, name, resource);\n setFieldValue(props.name, value);\n setFieldTouched(props.name, true);\n }}\n />\n </Firehose>\n\n <FormHelperText>\n <HelperText>\n {!isValid ? (\n <HelperTextItem variant=\"error\" icon={<RedExclamationCircleIcon />}>\n {errorMessage}\n </HelperTextItem>\n ) : (\n <HelperTextItem>{helpText}</HelperTextItem>\n )}\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n};\n\nexport default ResourceDropdownField;\n","import * as React from 'react';\nimport { FormGroup, FormHelperText, HelperText, HelperTextItem } from '@patternfly/react-core';\nimport { useField, useFormikContext, FormikValues } from 'formik';\nimport { RequestSizeInput } from '@console/internal/components/utils';\nimport { useFormikValidationFix } from '../../hooks';\nimport { RedExclamationCircleIcon } from '../status';\nimport { ResourceLimitFieldProps } from './field-types';\nimport { getFieldId } from './field-utils';\n\nconst ResourceLimitField: React.FC<ResourceLimitFieldProps> = ({\n label,\n unitName,\n unitOptions,\n helpText,\n ...props\n}) => {\n const [field, { touched, error }] = useField(props.name);\n const [fieldUnit] = useField(unitName);\n const { setFieldValue, setFieldTouched } = useFormikContext<FormikValues>();\n const fieldId = getFieldId(props.name, 'resource-limit');\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n\n useFormikValidationFix(field.value);\n\n return (\n <FormGroup fieldId={fieldId} label={label} isRequired={props.required}>\n <RequestSizeInput\n {...props}\n onChange={(val) => {\n setFieldValue(props.name, val.value);\n setFieldTouched(props.name, true);\n setFieldValue(unitName, val.unit);\n }}\n dropdownUnits={unitOptions}\n defaultRequestSizeUnit={fieldUnit.value}\n defaultRequestSizeValue={field.value}\n describedBy={`${fieldId}-helper`}\n />\n\n <FormHelperText>\n <HelperText>\n {!isValid ? (\n <HelperTextItem variant=\"error\" icon={<RedExclamationCircleIcon />}>\n {errorMessage}\n </HelperTextItem>\n ) : (\n <HelperTextItem>{helpText}</HelperTextItem>\n )}\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n};\n\nexport default ResourceLimitField;\n","import * as React from 'react';\nimport { Switch } from '@patternfly/react-core';\nimport { CheckboxFieldProps } from './field-types';\nimport ToggleableFieldBase from './ToggleableFieldBase';\n\nconst SwitchField: React.FC<CheckboxFieldProps> = (baseProps) => (\n <ToggleableFieldBase {...baseProps}>\n {({ isValid, ...props }) => <Switch {...props} />}\n </ToggleableFieldBase>\n);\n\nexport default SwitchField;\n","import * as React from 'react';\nimport {\n FormGroup,\n FormHelperText,\n HelperText,\n HelperTextItem,\n TextArea,\n} from '@patternfly/react-core';\nimport { useField } from 'formik';\nimport { RedExclamationCircleIcon } from '../status';\nimport { TextAreaProps } from './field-types';\nimport { getFieldId } from './field-utils';\n\nconst TextAreaField: React.FC<TextAreaProps> = (\n { label, helpText, required, onChange, ...props },\n ref,\n) => {\n const [field, { touched, error }] = useField(props.name);\n const fieldId = getFieldId(props.name, 'input');\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n\n return (\n <FormGroup fieldId={fieldId} label={label} isRequired={required}>\n <TextArea\n {...field}\n {...props}\n ref={ref}\n id={fieldId}\n style={{ resize: 'vertical' }}\n validated={isValid ? 'default' : 'error'}\n isRequired={required}\n aria-describedby={helpText ? `${fieldId}-helper` : undefined}\n onChange={(event, value) => {\n onChange && onChange(value);\n field.onChange(event);\n }}\n />\n\n <FormHelperText>\n <HelperText>\n {!isValid ? (\n <HelperTextItem variant=\"error\" icon={<RedExclamationCircleIcon />}>\n {errorMessage}\n </HelperTextItem>\n ) : (\n <HelperTextItem>{helpText}</HelperTextItem>\n )}\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n};\n\nexport default React.forwardRef(TextAreaField);\n","import * as React from 'react';\nimport { Button } from '@patternfly/react-core';\nimport { InfoCircleIcon } from '@patternfly/react-icons/dist/esm/icons/info-circle-icon';\nimport { FormikValues, useField, useFormikContext } from 'formik';\nimport { isEmpty } from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport {\n useResolvedExtensions,\n isYAMLTemplate,\n YAMLTemplate,\n WatchK8sResource,\n} from '@console/dynamic-plugin-sdk';\nimport { AsyncComponent } from '@console/internal/components/utils';\nimport { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';\nimport { ConsoleYAMLSampleModel } from '@console/internal/models';\nimport { getYAMLTemplates } from '@console/internal/models/yaml-templates';\nimport { definitionFor, K8sResourceCommon, referenceForModel } from '@console/internal/module/k8s';\nimport { getResourceSidebarSamples } from '../../utils';\nimport { CodeEditorFieldProps } from './field-types';\n\nimport './CodeEditorField.scss';\n\nconst SampleResource: WatchK8sResource = {\n kind: referenceForModel(ConsoleYAMLSampleModel),\n isList: true,\n};\n\nconst CodeEditorField: React.FC<CodeEditorFieldProps> = ({\n name,\n label,\n model,\n schema,\n showSamples,\n showShortcuts,\n showMiniMap,\n minHeight,\n onSave,\n language,\n}) => {\n const [field] = useField(name);\n const { setFieldValue } = useFormikContext<FormikValues>();\n const { t } = useTranslation();\n const editorRef = React.useRef();\n\n const [sidebarOpen, setSidebarOpen] = React.useState<boolean>(true);\n\n const [sampleResources, loaded, loadError] = useK8sWatchResource<K8sResourceCommon[]>(\n SampleResource,\n );\n\n const { samples, snippets } = model\n ? getResourceSidebarSamples(\n model,\n {\n data: sampleResources,\n loaded,\n loadError,\n },\n t,\n )\n : { samples: [], snippets: [] };\n\n const definition = model ? definitionFor(model) : { properties: [] };\n const hasSchema = !!schema || (!!definition && !isEmpty(definition.properties));\n const hasSidebarContent = hasSchema || (showSamples && !isEmpty(samples)) || !isEmpty(snippets);\n\n const [templateExtensions] = useResolvedExtensions<YAMLTemplate>(isYAMLTemplate);\n\n const sanitizeYamlContent = React.useCallback(\n (id: string = 'default', yaml: string = '', kind: string) => {\n if (yaml) {\n return yaml;\n }\n const yamlByExtension: string = getYAMLTemplates(\n templateExtensions?.filter((e) => e.properties.model.kind === kind),\n ).getIn([kind, id]);\n return yamlByExtension?.trim() || '';\n },\n [templateExtensions],\n );\n\n return (\n <div className=\"osc-yaml-editor\" data-test=\"yaml-editor\">\n <div className=\"osc-yaml-editor__editor\">\n <AsyncComponent\n loader={() => import('../editor/CodeEditor').then((c) => c.default)}\n forwardRef={editorRef}\n value={field.value}\n minHeight={minHeight ?? '200px'}\n onChange={(yaml: string) => setFieldValue(name, yaml)}\n onSave={onSave}\n showShortcuts={showShortcuts}\n showMiniMap={showMiniMap}\n language={language}\n toolbarLinks={\n !sidebarOpen &&\n hasSidebarContent && [\n <Button isInline variant=\"link\" onClick={() => setSidebarOpen(true)}>\n <InfoCircleIcon className=\"co-icon-space-r co-p-has-sidebar__sidebar-link-icon\" />\n {t('console-shared~View sidebar')}\n </Button>,\n ]\n }\n />\n </div>\n {sidebarOpen && hasSidebarContent && (\n <div className=\"osc-yaml-editor__sidebar\">\n <AsyncComponent\n loader={() => import('../editor/CodeEditorSidebar').then((c) => c.default)}\n editorRef={editorRef}\n model={model}\n schema={schema}\n samples={showSamples ? samples : []}\n snippets={snippets}\n sanitizeYamlContent={sanitizeYamlContent}\n sidebarLabel={label}\n toggleSidebar={() => setSidebarOpen(!sidebarOpen)}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default CodeEditorField;\n","import * as React from 'react';\nimport {\n FormGroup,\n EmptyState,\n Button,\n TextInput,\n EmptyStateBody,\n EmptyStateActions,\n EmptyStateHeader,\n EmptyStateFooter,\n FormHelperText,\n HelperText,\n HelperTextItem,\n} from '@patternfly/react-core';\nimport { useField, useFormikContext, FormikValues } from 'formik';\nimport * as fuzzy from 'fuzzysearch';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { LoadingInline } from '@console/internal/components/utils';\nimport { useDebounceCallback } from '../../../hooks/debounce';\nimport { RedExclamationCircleIcon } from '../../status';\nimport { getFieldId } from '../field-utils';\nimport SelectorCard from './SelectorCard';\nimport './ItemSelectorField.scss';\n\ninterface Item {\n name: string;\n title: string;\n displayName?: string;\n iconUrl?: string;\n}\n\ninterface NormalizedItem {\n [item: string]: Item;\n}\n\ninterface ItemSelectorFieldProps {\n itemList: NormalizedItem;\n name: string;\n loadingItems?: boolean;\n recommended?: string;\n label?: string;\n autoSelect?: boolean;\n onSelect?: (name: string) => void;\n showIfSingle?: boolean;\n showFilter?: boolean;\n showCount?: boolean;\n emptyStateMessage?: string;\n}\n\nconst ItemSelectorField: React.FC<ItemSelectorFieldProps> = ({\n itemList,\n name,\n loadingItems,\n recommended,\n onSelect,\n label,\n autoSelect,\n showIfSingle = false,\n showFilter = false,\n showCount = false,\n emptyStateMessage,\n}) => {\n const { t } = useTranslation();\n const [selected, { error: selectedError, touched: selectedTouched }] = useField(name);\n const { setFieldValue, setFieldTouched, validateForm } = useFormikContext<FormikValues>();\n const [filteredList, setFilteredList] = React.useState(itemList);\n const [filterText, setFilterText] = React.useState('');\n const itemCount = _.keys(filteredList).length;\n\n const handleItemChange = React.useCallback(\n (item: string) => {\n setFieldValue(name, item);\n setFieldTouched(name, true);\n validateForm();\n onSelect && onSelect(item);\n },\n [name, setFieldValue, setFieldTouched, validateForm, onSelect],\n );\n\n React.useEffect(() => {\n if (!selected.value && _.keys(itemList).length === 1) {\n const image = _.find(filteredList);\n handleItemChange(image.name);\n }\n if (!selected.value && recommended) {\n handleItemChange(recommended);\n setFieldTouched(name, false);\n }\n if (!selected.value && autoSelect && !_.isEmpty(filteredList)) {\n const image = _.get(_.keys(filteredList), 0);\n handleItemChange(filteredList[image]?.name);\n }\n }, [\n autoSelect,\n itemList,\n filteredList,\n handleItemChange,\n selected.value,\n recommended,\n name,\n setFieldTouched,\n ]);\n\n const filterSources = React.useCallback(\n (text: string) => {\n const subList = _.pickBy(itemList, (val) =>\n fuzzy(text.toLowerCase(), val.title.toLowerCase()),\n );\n if (selected.value) {\n subList[selected.value] = itemList[selected.value];\n }\n setFilteredList(subList);\n },\n [itemList, selected.value],\n );\n\n const debounceFilterText = useDebounceCallback<(text: string) => void>(filterSources);\n\n const handleFilterChange = (_event, text: string) => {\n setFilterText(text);\n debounceFilterText(text);\n };\n\n const handleClearFilter = () => {\n setFilterText('');\n filterSources('');\n };\n\n if (!showIfSingle && itemCount === 1) {\n return null;\n }\n\n const fieldId = getFieldId(name, 'itemselector');\n const isValid = !(selectedTouched && selectedError);\n const errorMessage = !isValid ? selectedError : '';\n\n return (\n <FormGroup fieldId={fieldId} label={label} isRequired>\n {loadingItems ? (\n <LoadingInline />\n ) : (\n <>\n {showFilter && (\n <div className=\"odc-item-selector-filter\">\n <TextInput\n className=\"odc-item-selector-filter__input\"\n onChange={handleFilterChange}\n value={filterText}\n placeholder={t('console-shared~Filter by type...')}\n aria-label={t('console-shared~Filter by type')}\n />\n {showCount && (\n <span className=\"odc-item-selector-filter__count\">\n {t('console-shared~{{count}} item', { count: itemCount })}\n </span>\n )}\n </div>\n )}\n {showFilter && itemCount === 0 ? (\n <EmptyState>\n <EmptyStateHeader\n titleText={<>{t('console-shared~No results match the filter criteria')}</>}\n headingLevel=\"h2\"\n />\n <EmptyStateFooter>\n {emptyStateMessage && <EmptyStateBody>{emptyStateMessage}</EmptyStateBody>}\n <EmptyStateActions>\n <Button variant=\"link\" onClick={handleClearFilter}>\n {t('console-shared~Clear filter')}\n </Button>\n </EmptyStateActions>\n </EmptyStateFooter>\n </EmptyState>\n ) : (\n <div\n id=\"item-selector-field\"\n className={`odc-item-selector-field ${\n showFilter ? 'odc-item-selector-field__scrollbar' : ''\n }`}\n >\n {_.values(filteredList).map((item) => (\n <SelectorCard\n key={item.name}\n title={item.title}\n iconUrl={item.iconUrl}\n name={item.name}\n selected={selected.value === item.name}\n recommended={recommended === item.name}\n onChange={handleItemChange}\n />\n ))}\n </div>\n )}\n </>\n )}\n\n {!isValid && (\n <FormHelperText>\n <HelperText>\n <HelperTextItem variant=\"error\" icon={<RedExclamationCircleIcon />}>\n {errorMessage}\n </HelperTextItem>\n </HelperText>\n </FormHelperText>\n )}\n </FormGroup>\n );\n};\n\nexport default ItemSelectorField;\n","import * as React from 'react';\nimport { InputGroup, TextInput, TextArea, InputGroupItem } from '@patternfly/react-core';\nimport BaseInputField from './BaseInputField';\nimport { GroupInputProps, GroupTextType } from './field-types';\n\nconst InputGroupField: React.FC<GroupInputProps> = ({\n beforeInput,\n afterInput,\n groupTextType,\n ...baseProps\n}) => {\n return (\n <BaseInputField {...baseProps}>\n {(props) => {\n return (\n <InputGroup>\n <InputGroupItem>{beforeInput}</InputGroupItem>\n <InputGroupItem>\n {groupTextType === GroupTextType.TextArea ? (\n <TextArea {...props} />\n ) : (\n <TextInput {...props} />\n )}\n </InputGroupItem>\n <InputGroupItem>{afterInput}</InputGroupItem>\n </InputGroup>\n );\n }}\n </BaseInputField>\n );\n};\n\nexport default InputGroupField;\n","import * as React from 'react';\nimport { FormGroup, FormHelperText, HelperText, HelperTextItem } from '@patternfly/react-core';\nimport { FieldArray, useField } from 'formik';\nimport { useFormikValidationFix } from '../../../hooks/formik-validation-fix';\nimport { RedExclamationCircleIcon } from '../../status';\nimport { getFieldId } from '../field-utils';\nimport MultiColumnFieldFooter from '../multi-column-field/MultiColumnFieldFooter';\nimport { TextColumnFieldProps, TextColumnItemProps } from './text-column-types';\nimport TextColumnItem from './TextColumnItem';\nimport TextColumnItemWithDnd from './TextColumnItemWithDnd';\n\nconst TextColumnField: React.FC<TextColumnFieldProps> = (props) => {\n const {\n required,\n name,\n label,\n addLabel,\n helpText,\n isReadOnly,\n onChange,\n children,\n dndEnabled = false,\n } = props;\n const [field, { touched, error }] = useField<string[]>(name);\n useFormikValidationFix(field.value);\n const rowValues = field.value ?? [];\n const fieldId = getFieldId(name, 'single-column');\n const isValid = !(touched && error);\n const getTextColumnProps = (colProps: TextColumnItemProps) => {\n return { ...colProps, key: `${colProps.idx.toString()}` };\n };\n\n return (\n <FieldArray\n name={name}\n render={(arrayHelpers) => (\n <>\n <FormGroup\n fieldId={fieldId}\n label={label}\n isRequired={required}\n data-test={props['data-test'] || 'text-column-field'}\n >\n {dndEnabled ? (\n <>\n {rowValues.map((v, idx) => {\n return (\n <TextColumnItemWithDnd\n {...getTextColumnProps({ ...props, rowValues, idx, arrayHelpers })}\n >\n {children}\n </TextColumnItemWithDnd>\n );\n })}\n </>\n ) : (\n <>\n {rowValues.map((v, idx) => {\n return (\n <TextColumnItem\n {...getTextColumnProps({ ...props, rowValues, idx, arrayHelpers })}\n >\n {children}\n </TextColumnItem>\n );\n })}\n </>\n )}\n {!isReadOnly && (\n <MultiColumnFieldFooter\n addLabel={addLabel}\n onAdd={() => {\n arrayHelpers.push('');\n onChange && onChange([...rowValues, '']);\n }}\n />\n )}\n\n <FormHelperText>\n <HelperText>\n {!isValid ? (\n <HelperTextItem variant=\"error\" icon={<RedExclamationCircleIcon />}>\n {error}\n </HelperTextItem>\n ) : (\n <HelperTextItem>{helpText}</HelperTextItem>\n )}\n </HelperText>\n </FormHelperText>\n </FormGroup>\n </>\n )}\n />\n );\n};\nexport default TextColumnField;\n","import * as React from 'react';\nimport { FormProps } from '@rjsf/core';\nimport cx from 'classnames';\nimport { useField, useFormikContext, FormikValues } from 'formik';\nimport { AsyncComponent } from '@console/internal/components/utils';\n\ntype DynamicFormFieldProps = FormProps<any> & {\n name: string;\n errors?: string[];\n formDescription?: React.ReactNode;\n showAlert?: boolean;\n};\n\nconst DynamicFormField: React.FC<DynamicFormFieldProps> = ({\n name,\n schema,\n uiSchema,\n errors,\n formDescription,\n formContext,\n showAlert,\n}) => {\n const [field] = useField(name);\n const { setFieldValue } = useFormikContext<FormikValues>();\n\n return (\n <div className={cx({ row: formDescription })}>\n <div\n className={cx({\n 'col-sm-12 col-md-4 col-md-push-8 col-lg-5 col-lg-push-7': formDescription,\n })}\n >\n {formDescription}\n </div>\n <div\n className={cx({\n 'col-sm-12 col-md-8 col-md-pull-4 col-lg-7 col-lg-pull-5': formDescription,\n })}\n >\n <AsyncComponent\n loader={() => import('../dynamic-form').then((c) => c.DynamicForm)}\n errors={errors}\n formContext={formContext}\n showAlert={showAlert}\n uiSchema={uiSchema}\n formData={field.value}\n onChange={(data) => setFieldValue(name, data)}\n schema={schema}\n tagName=\"div\"\n customUISchema\n noActions\n liveValidate\n />\n </div>\n </div>\n );\n};\n\nexport default DynamicFormField;\n","import * as React from 'react';\nimport { Alert, Button, AlertActionCloseButton } from '@patternfly/react-core';\nimport cx from 'classnames';\nimport { useField, useFormikContext, FormikValues } from 'formik';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { LoadingBox } from '@console/internal/components/utils';\nimport { safeYAMLToJS, safeJSToYAML } from '../../utils/yaml';\nimport { EditorType } from '../synced-editor/editor-toggle';\nimport { useEditorType } from '../synced-editor/useEditorType';\nimport RadioGroupField from './RadioGroupField';\n\nimport './SyncedEditorField.scss';\n\ntype FormErrorCallback<ReturnValue = {}> = () => ReturnValue;\ntype WithOrWithoutPromise<Type> = Promise<Type> | Type;\nexport type SanitizeToForm<YAMLStruct = {}, FormOutput = {}> = (\n preFormData: YAMLStruct,\n) => WithOrWithoutPromise<FormOutput | FormErrorCallback<FormOutput>>;\nexport type SanitizeToYAML = (preFormData: string) => string;\n\ntype EditorContext<SanitizeTo> = {\n name: string;\n editor: React.ReactNode;\n isDisabled?: boolean;\n sanitizeTo?: SanitizeTo;\n label?: string;\n};\n\ntype SyncedEditorFieldProps = {\n name: string;\n formContext: EditorContext<SanitizeToForm>;\n yamlContext: EditorContext<SanitizeToYAML>;\n lastViewUserSettingKey: string;\n prune?: (data: any) => any;\n noMargin?: boolean;\n};\n\nconst SyncedEditorField: React.FC<SyncedEditorFieldProps> = ({\n name,\n formContext,\n yamlContext,\n prune,\n noMargin = false,\n lastViewUserSettingKey,\n}) => {\n const { t } = useTranslation();\n const [field] = useField(name);\n\n const { values, setFieldValue, setStatus } = useFormikContext<FormikValues>();\n\n const formData = _.get(values, formContext.name);\n const yamlData: string = _.get(values, yamlContext.name);\n\n const [yamlWarning, setYAMLWarning] = React.useState<boolean>(false);\n const [sanitizeToCallback, setSanitizeToCallback] = React.useState<FormErrorCallback>(undefined);\n const [disabledFormAlert, setDisabledFormAlert] = React.useState<boolean>(formContext.isDisabled);\n\n const isEditorTypeEnabled = (type: EditorType): boolean =>\n !(type === EditorType.Form ? formContext?.isDisabled : yamlContext?.isDisabled);\n\n const [editorType, setEditorType, resourceLoaded] = useEditorType(\n lastViewUserSettingKey,\n field.value as EditorType,\n isEditorTypeEnabled,\n );\n\n const loaded = resourceLoaded && field.value === editorType;\n\n const changeEditorType = (newType: EditorType) => {\n setEditorType(newType);\n setFieldValue(name, newType);\n };\n\n const handleToggleToForm = async () => {\n // Convert from YAML\n let content = safeYAMLToJS(yamlData);\n\n // Sanitize the YAML structure if possible\n if (!_.isEmpty(content)) {\n if (formContext.sanitizeTo) {\n try {\n content = await formContext.sanitizeTo(content);\n } catch (e) {\n // Failed to sanitize, discard invalid data\n content = null;\n }\n }\n\n // Handle sanitized result\n if (typeof content === 'object' && !_.isEmpty(content)) {\n setFieldValue(formContext.name, content);\n changeEditorType(EditorType.Form);\n return;\n }\n if (typeof content === 'function') {\n setSanitizeToCallback(() => content);\n }\n }\n\n setYAMLWarning(true);\n };\n\n const handleToggleToYAML = () => {\n const newYAML = safeJSToYAML(prune?.(formData) ?? formData, yamlData, { skipInvalid: true });\n setFieldValue(\n yamlContext.name,\n yamlContext.sanitizeTo ? yamlContext.sanitizeTo(newYAML) : newYAML,\n );\n changeEditorType(EditorType.YAML);\n };\n\n const onClickYAMLWarningConfirm = async () => {\n setYAMLWarning(false);\n if (sanitizeToCallback) {\n setFieldValue(formContext.name, sanitizeToCallback());\n }\n changeEditorType(EditorType.Form);\n };\n\n const onClickYAMLWarningCancel = () => {\n setYAMLWarning(false);\n };\n\n const onChangeType = (newType: EditorType) => {\n switch (newType) {\n case EditorType.YAML:\n handleToggleToYAML();\n break;\n case EditorType.Form:\n handleToggleToForm();\n break;\n default:\n break;\n }\n setStatus({ submitError: '' });\n };\n\n React.useEffect(() => {\n setDisabledFormAlert(formContext.isDisabled);\n if (resourceLoaded && field.value !== editorType) {\n setFieldValue(name, editorType);\n }\n }, [editorType, field.value, formContext.isDisabled, name, resourceLoaded, setFieldValue]);\n\n return loaded ? (\n <>\n <div\n className={cx('ocs-synced-editor-field__editor-toggle', { margin: !noMargin })}\n data-test=\"synced-editor-field\"\n >\n <RadioGroupField\n label={t('console-shared~Configure via:')}\n name={name}\n options={[\n {\n label: formContext.label || t('console-shared~Form view'),\n value: EditorType.Form,\n isDisabled: formContext.isDisabled,\n },\n {\n label: yamlContext.label || t('console-shared~YAML view'),\n value: EditorType.YAML,\n isDisabled: yamlContext.isDisabled,\n },\n ]}\n onChange={(val: string) => onChangeType(val as EditorType)}\n isInline\n />\n </div>\n {yamlWarning && (\n <Alert\n className=\"co-synced-editor__yaml-warning\"\n variant=\"danger\"\n isInline\n title={t('console-shared~Invalid YAML cannot be persisted')}\n >\n <p>{t('console-shared~Switching to form view will delete any invalid YAML.')}</p>\n <Button variant=\"danger\" onClick={onClickYAMLWarningConfirm}>\n {t('console-shared~Switch and delete')}\n </Button>\n \n <Button variant=\"secondary\" onClick={onClickYAMLWarningCancel}>\n {t('console-shared~Cancel')}\n </Button>\n </Alert>\n )}\n {disabledFormAlert && (\n <Alert\n variant=\"custom\"\n title={t(\n 'console-shared~Form view is disabled for this chart because the schema is not available',\n )}\n actionClose={<AlertActionCloseButton onClose={() => setDisabledFormAlert(false)} />}\n isInline\n />\n )}\n {editorType === EditorType.Form && !disabledFormAlert\n ? formContext.editor\n : yamlContext.editor}\n </>\n ) : (\n <LoadingBox />\n );\n};\n\nexport default SyncedEditorField;\n","import { useUserSettings } from '@console/shared';\n\nexport const PREFERRED_CREATE_EDIT_METHOD_USER_SETTING_VALUE_LATEST = 'latest';\nconst PREFERRED_CREATE_EDIT_METHOD_USER_SETTING_KEY = 'console.preferredCreateEditMethod';\n\nexport const usePreferredCreateEditMethod = (): [string, boolean] => {\n const [preferredCreateEditMethod, , preferredCreateEditMethodLoaded] = useUserSettings<string>(\n PREFERRED_CREATE_EDIT_METHOD_USER_SETTING_KEY,\n );\n return [preferredCreateEditMethod, preferredCreateEditMethodLoaded];\n};\n","import * as React from 'react';\nimport { FormGroup, FormHelperText, HelperText, HelperTextItem } from '@patternfly/react-core';\nimport {\n Select as SelectDeprecated,\n SelectOption as SelectOptionDeprecated,\n SelectVariant as SelectVariantDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { useField, useFormikContext, FormikValues } from 'formik';\nimport * as _ from 'lodash';\nimport { useFormikValidationFix } from '../../hooks';\nimport { RedExclamationCircleIcon } from '../status';\nimport { SelectInputFieldProps, SelectInputOption } from './field-types';\nimport { getFieldId } from './field-utils';\n\nconst SelectInputField: React.FC<SelectInputFieldProps> = ({\n name,\n label,\n ariaLabel,\n variant,\n options,\n placeholderText,\n isCreatable,\n hasOnCreateOption,\n helpText,\n required,\n isInputValuePersisted,\n noResultsFoundText,\n toggleOnSelection,\n hideClearButton,\n isDisabled,\n onChange,\n getLabelFromValue,\n}) => {\n const [field, { touched, error }] = useField<string | string[]>(name);\n const { setFieldValue, setFieldTouched } = useFormikContext<FormikValues>();\n const [isOpen, setIsOpen] = React.useState<boolean>(false);\n const [newOptions, setNewOptions] = React.useState<SelectInputOption[]>([]);\n const fieldId = getFieldId(name, 'select-input');\n const isValid = !(touched && error);\n const errorMessage = !isValid ? error : '';\n\n useFormikValidationFix(field.value);\n\n const onToggle = () => {\n setIsOpen(!isOpen);\n };\n\n const onSelect = (event, selection: string) => {\n if (onChange) {\n onChange(selection);\n } else if (\n variant !== SelectVariantDeprecated.typeaheadMulti &&\n variant !== SelectVariantDeprecated.checkbox\n ) {\n setFieldValue(name, selection);\n } else {\n const selections = field.value;\n if (_.includes(selections, selection)) {\n setFieldValue(name, _.pull(selections, selection));\n } else {\n setFieldValue(name, [...selections, selection]);\n }\n }\n setFieldTouched(name);\n toggleOnSelection && onToggle();\n };\n\n const onCreateOption = (newVal: string) => {\n const hasDuplicateOption = [...newOptions, ...options].find(\n (option) => option.value === newVal,\n );\n if (!hasDuplicateOption) {\n setNewOptions([...newOptions, { value: newVal, disabled: false }]);\n }\n };\n\n const onClearSelection = () => {\n if (\n variant !== SelectVariantDeprecated.typeaheadMulti &&\n variant !== SelectVariantDeprecated.checkbox\n ) {\n setFieldValue(name, '');\n } else {\n setFieldValue(name, []);\n }\n setFieldTouched(name);\n };\n\n return (\n <FormGroup fieldId={fieldId} label={label} isRequired={required}>\n <SelectDeprecated\n toggleId={fieldId}\n variant={variant}\n aria-describedby={helpText ? `${fieldId}-helper` : undefined}\n typeAheadAriaLabel={ariaLabel}\n onToggle={onToggle}\n onSelect={onSelect}\n onClear={hideClearButton ? SelectDeprecated.defaultProps.onClear : onClearSelection}\n isOpen={isOpen}\n isDisabled={isDisabled}\n selections={getLabelFromValue ? getLabelFromValue(field.value as string) : field.value}\n placeholderText={placeholderText}\n isCreatable={isCreatable}\n onCreateOption={(hasOnCreateOption && onCreateOption) || undefined}\n isInputValuePersisted={isInputValuePersisted}\n noResultsFoundText={noResultsFoundText}\n >\n {_.map([...options, ...newOptions], (op) => (\n <SelectOptionDeprecated\n value={op.label ? op.label : op.value}\n isDisabled={op.disabled}\n key={op.value}\n id={`select-option-${name}-${op.value}`}\n description={op.description ?? ''}\n />\n ))}\n </SelectDeprecated>\n\n <FormHelperText>\n <HelperText>\n {!isValid ? (\n <HelperTextItem variant=\"error\" icon={<RedExclamationCircleIcon />}>\n {errorMessage}\n </HelperTextItem>\n ) : (\n <HelperTextItem>{helpText}</HelperTextItem>\n )}\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n};\n\nexport default SelectInputField;\n","import * as React from 'react';\nimport {\n Card,\n CardHeader,\n CardTitle,\n CardBody,\n Title,\n TitleSizes,\n Popover,\n} from '@patternfly/react-core';\nimport {\n Dropdown as DropdownDeprecated,\n DropdownItem as DropdownItemDeprecated,\n KebabToggle as KebabToggleDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { OutlinedQuestionCircleIcon } from '@patternfly/react-icons/dist/esm/icons/outlined-question-circle-icon';\nimport { useTranslation } from 'react-i18next';\n\nimport './GettingStartedGrid.scss';\n\ninterface GettingStartedGridProps {\n onHide?: () => void;\n children?: React.ReactNodeArray;\n}\n\nexport const GettingStartedGrid: React.FC<GettingStartedGridProps> = ({ onHide, children }) => {\n const { t } = useTranslation();\n\n const [menuIsOpen, setMenuIsOpen] = React.useState(false);\n const onToggle = () => setMenuIsOpen((open) => !open);\n\n const actionDropdownItem: any[] = [];\n\n if (onHide) {\n actionDropdownItem.push(\n <DropdownItemDeprecated\n key=\"action\"\n component=\"button\"\n description={t(\n 'console-shared~You can always bring these getting started resources back into view by clicking Show getting started resources in the page heading.',\n )}\n onClick={onHide}\n data-test=\"hide\"\n >\n {t('console-shared~Hide from view')}\n </DropdownItemDeprecated>,\n );\n }\n\n const title = t('console-shared~Getting started resources');\n const titleTooltip = (\n <span className=\"ocs-getting-started-grid__tooltip\">\n {t(\n 'console-shared~Use our collection of resources to help you get started with the Console.\\n\\nNote: This card can be hidden at any time.',\n )}\n </span>\n );\n\n return (\n <Card className=\"ocs-getting-started-grid\" data-test=\"getting-started\" isClickable isSelectable>\n <CardHeader\n className=\"ocs-getting-started-grid__header\"\n actions={{\n actions: actionDropdownItem.length > 0 && (\n <DropdownDeprecated\n isOpen={menuIsOpen}\n isPlain\n toggle={<KebabToggleDeprecated onToggle={onToggle} data-test=\"actions\" />}\n position=\"right\"\n dropdownItems={actionDropdownItem}\n className=\"ocs-getting-started-grid__action-dropdown\"\n />\n ),\n }}\n >\n <CardTitle>\n <Title headingLevel=\"h2\" size={TitleSizes.lg} data-test=\"title\">\n {title}{' '}\n <Popover bodyContent={titleTooltip}>\n <span\n role=\"button\"\n aria-label={t('console-shared~More info')}\n className=\"ocs-getting-started-grid__tooltip-icon\"\n >\n <OutlinedQuestionCircleIcon />\n </span>\n </Popover>\n </Title>\n </CardTitle>\n </CardHeader>\n <CardBody className=\"ocs-getting-started-grid__content\">{children}</CardBody>\n </Card>\n );\n};\n","import * as React from 'react';\nimport {\n Flex,\n FlexItem,\n Text,\n TextVariants,\n Title,\n TitleSizes,\n Button,\n SimpleList,\n Skeleton,\n SimpleListItem,\n} from '@patternfly/react-core';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { useActivePerspective } from '@console/dynamic-plugin-sdk';\nimport { useTelemetry } from '@console/shared/src/hooks/useTelemetry';\n\nimport './GettingStartedCard.scss';\n\nexport interface GettingStartedLink {\n id: string;\n loading?: boolean;\n\n title?: string | React.ReactElement;\n description?: string;\n\n external?: boolean;\n /** Default hyperlink location */\n href?: string;\n /** OnClick callback for the SimpleList item */\n onClick?: (event: React.MouseEvent | React.ChangeEvent) => void;\n}\n\nexport interface GettingStartedCardProps {\n id: string;\n icon?: React.ReactElement;\n title: string;\n titleColor?: string;\n description?: string;\n links: GettingStartedLink[];\n moreLink?: GettingStartedLink;\n}\n\nexport const GettingStartedCard: React.FC<GettingStartedCardProps> = ({\n id,\n icon,\n title,\n titleColor,\n description,\n links,\n moreLink,\n}) => {\n const fireTelemetryEvent = useTelemetry();\n const [activePerspective] = useActivePerspective();\n\n const telemetryCallback = () => {\n fireTelemetryEvent('Getting Started Card Link Clicked', {\n id: activePerspective,\n });\n };\n const getLinkTitleClassNames = (external: boolean) =>\n external ? 'co-external-link pf-v5-u-display-block' : 'co-goto-arrow';\n\n return (\n <Flex\n direction={{ default: 'column' }}\n grow={{ default: 'grow' }}\n className=\"ocs-getting-started-card\"\n data-test={`card ${id}`}\n >\n <Title headingLevel=\"h3\" size={TitleSizes.md} style={{ color: titleColor }} data-test=\"title\">\n {icon ? <span className=\"ocs-getting-started-card__title-icon\">{icon}</span> : null}\n {title}\n </Title>\n\n {description ? (\n <Text component={TextVariants.small} data-test=\"description\">\n {description}\n </Text>\n ) : null}\n\n <Flex direction={{ default: 'column' }} grow={{ default: 'grow' }}>\n {links?.length > 0 ? (\n <SimpleList isControlled={false} className=\"ocs-getting-started-card__list\">\n {links.map((link) =>\n link.loading ? (\n <li key={link.id}>\n <Skeleton fontSize=\"sm\" />\n </li>\n ) : (\n <SimpleListItem\n key={link.id}\n component={link.href ? (link.external ? 'a' : (Link as any)) : 'button'}\n componentClassName={link.description ? '' : getLinkTitleClassNames(link.external)}\n componentProps={\n link.external\n ? {\n href: link.href,\n target: '_blank',\n rel: 'noopener noreferrer',\n 'data-test': `item ${link.id}`,\n }\n : {\n to: link.href,\n 'data-test': `item ${link.id}`,\n }\n }\n href={link.href}\n onClick={(e) => {\n telemetryCallback();\n link.onClick?.(e);\n }}\n >\n {link.description ? (\n <>\n <Text className={getLinkTitleClassNames(link.external)}>{link.title}</Text>\n <Text component={TextVariants.small}>{link.description}</Text>\n </>\n ) : (\n link.title\n )}\n </SimpleListItem>\n ),\n )}\n </SimpleList>\n ) : null}\n </Flex>\n\n {moreLink ? (\n <FlexItem>\n {moreLink.onClick ? (\n <Button\n onClick={(e) => {\n telemetryCallback();\n moreLink.onClick(e);\n }}\n isInline\n variant=\"link\"\n data-test={`item ${moreLink.id}`}\n >\n {moreLink.title}\n </Button>\n ) : moreLink.external ? (\n <a\n onClick={telemetryCallback}\n href={moreLink.href}\n target=\"_blank\"\n className=\"co-external-link\"\n rel=\"noopener noreferrer\"\n data-test={`item ${moreLink.id}`}\n >\n {moreLink.title}\n </a>\n ) : (\n <Link to={moreLink.href} data-test={`item ${moreLink.id}`} onClick={telemetryCallback}>\n {moreLink.title}\n </Link>\n )}\n </FlexItem>\n ) : null}\n </Flex>\n );\n};\n","import * as React from 'react';\nimport { Label } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { useGettingStartedShowState, GettingStartedShowState } from './useGettingStartedShowState';\n\ninterface RestoreGettingStartedButtonProps {\n userSettingsKey: string;\n}\n\nexport const RestoreGettingStartedButton: React.FC<RestoreGettingStartedButtonProps> = ({\n userSettingsKey,\n}) => {\n const { t } = useTranslation();\n const [showState, setShowState, showStateLoaded] = useGettingStartedShowState(userSettingsKey);\n\n if (!showStateLoaded || showState !== GettingStartedShowState.HIDE) {\n return null;\n }\n\n return (\n <Label\n color=\"purple\"\n onClick={() => {\n setShowState(GettingStartedShowState.SHOW);\n }}\n onClose={(event) => {\n event.preventDefault();\n event.stopPropagation();\n setShowState(GettingStartedShowState.DISAPPEAR);\n }}\n style={{ cursor: 'pointer' }}\n data-test=\"restore-getting-started\"\n >\n {t('console-shared~Show getting started resources')}\n </Label>\n );\n};\n","import * as React from 'react';\nimport {\n AllQuickStartStates,\n QuickStart,\n QuickStartStatus,\n getQuickStartStatus,\n} from '@patternfly/quickstarts';\nimport { RouteIcon } from '@patternfly/react-icons/dist/esm/icons/route-icon';\nimport { useTranslation } from 'react-i18next';\nimport QuickStartsLoader from '@console/app/src/components/quick-starts/loader/QuickStartsLoader';\nimport {\n GettingStartedCard,\n GettingStartedLink,\n} from '@console/shared/src/components/getting-started';\nimport { useQuickStartContext } from '@console/shared/src/hooks/useQuickStartContext';\n\ninterface QuickStartGettingStartedCardProps {\n featured?: string[];\n title?: string;\n description?: string;\n filter?: (QuickStart) => boolean;\n}\n\nconst orderQuickStarts = (\n allQuickStarts: QuickStart[],\n allQuickStartStates: AllQuickStartStates,\n featured: string[],\n filter?: (QuickStart) => boolean,\n): QuickStart[] => {\n const orderedQuickStarts: QuickStart[] = [];\n\n const filteredQuickStarts = filter ? allQuickStarts.filter(filter) : allQuickStarts;\n\n const isFeatured = (quickStart: QuickStart) => featured?.includes(quickStart.metadata.name);\n const getStatus = (quickStart: QuickStart) =>\n getQuickStartStatus(allQuickStartStates, quickStart.metadata.name);\n\n // Prioritize featured quick starts and keep specified order\n if (featured) {\n const featuredQuickStartsByName = filteredQuickStarts.reduce((acc, q) => {\n acc[q.metadata.name] = q;\n return acc;\n }, {} as Record<string, QuickStart>);\n featured.forEach((quickStartName) => {\n if (\n featuredQuickStartsByName[quickStartName] &&\n getStatus(featuredQuickStartsByName[quickStartName]) !== QuickStartStatus.COMPLETE\n ) {\n orderedQuickStarts.push(featuredQuickStartsByName[quickStartName]);\n }\n });\n }\n\n // Show other in progress quick starts (which are not featured)\n orderedQuickStarts.push(\n ...filteredQuickStarts.filter(\n (q) => !isFeatured(q) && getStatus(q) === QuickStartStatus.IN_PROGRESS,\n ),\n );\n\n // Show other not started quick starts (which are not featured)\n orderedQuickStarts.push(\n ...filteredQuickStarts.filter(\n (q) => !isFeatured(q) && getStatus(q) === QuickStartStatus.NOT_STARTED,\n ),\n );\n\n return orderedQuickStarts;\n};\n\nexport const QuickStartGettingStartedCard: React.FC<QuickStartGettingStartedCardProps> = ({\n featured,\n title,\n description,\n filter,\n}) => {\n const { t } = useTranslation();\n const { allQuickStartStates, setActiveQuickStart } = useQuickStartContext();\n\n return (\n <QuickStartsLoader>\n {(quickStarts, loaded) => {\n const orderedQuickStarts = orderQuickStarts(\n quickStarts,\n allQuickStartStates,\n featured,\n filter,\n );\n const slicedQuickStarts = orderedQuickStarts.slice(0, 2);\n\n if (loaded && slicedQuickStarts.length === 0) {\n return null;\n }\n\n const links: GettingStartedLink[] = loaded\n ? slicedQuickStarts.map((quickStart: QuickStart) => ({\n id: quickStart.metadata.name,\n title: quickStart.spec.displayName,\n onClick: () => {\n setActiveQuickStart(quickStart.metadata.name, quickStart.spec.tasks.length);\n },\n }))\n : featured?.map((name) => ({\n id: name,\n loading: true,\n }));\n\n const moreLink: GettingStartedLink = {\n id: 'all-quick-starts',\n title: t('console-shared~View all quick starts'),\n href: '/quickstart',\n };\n\n return (\n <GettingStartedCard\n id=\"quick-start\"\n icon={<RouteIcon color=\"var(--co-global--palette--purple-600)\" aria-hidden=\"true\" />}\n title={title || t('console-shared~Build with guided documentation')}\n titleColor={'var(--co-global--palette--purple-700)'}\n description={\n description ||\n t(\n 'console-shared~Follow guided documentation to build applications and familiarize yourself with key features.',\n )\n }\n links={links}\n moreLink={moreLink}\n />\n );\n }}\n </QuickStartsLoader>\n );\n};\n","import * as React from 'react';\nimport { QuickStart, getDisabledQuickStarts } from '@patternfly/quickstarts';\nimport { useTranslation } from 'react-i18next';\nimport {\n WatchK8sResult,\n getGroupVersionKindForModel,\n} from '@console/dynamic-plugin-sdk/src/lib-core';\nimport { useK8sWatchResource } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sWatchResource';\nimport { QuickStartModel } from '../../../models';\n\nconst LOCALIZATION_NAME_LABEL = 'console.openshift.io/name';\nconst LOCALIZATION_LANGUAGE_LABEL = 'console.openshift.io/lang';\nconst LOCALIZATION_COUNTRY_LABEL = 'console.openshift.io/country';\n\nexport const getQuickStartNameRef = (quickStart: QuickStart) =>\n quickStart.metadata.labels?.[LOCALIZATION_NAME_LABEL] ||\n quickStart.metadata.annotations?.[LOCALIZATION_NAME_LABEL] ||\n quickStart.metadata.name;\n\nexport const groupQuickStartsByName = (quickStarts: QuickStart[]) => {\n return quickStarts.reduce<Record<string, QuickStart[]>>((grouped, quickStart) => {\n const name = getQuickStartNameRef(quickStart);\n if (!grouped[name]) grouped[name] = [];\n grouped[name].push(quickStart);\n return grouped;\n }, {});\n};\n\n/**\n * Returns the QuickStart with the best localization match, for the given\n * preferred language and preferred country. It prefers a match in this order:\n *\n * 1. QuickStart language and country are equal to the preferred language and country.\n * This includes sample without language (fallbacks to en) and no country.\n *\n * 2. QuickStart language is equal to the preferred language.\n * 1. And the quick starts has no country defined. (eg, select en quick starts is used for en-CA and en-GB)\n * 2. Any country is defined. (eg, select en-CA quick starts is used for en-GB)\n *\n * 3. Fallback to an english quick starts\n * (QuickStart language is en OR quick starts language is not defined):\n * 1. Same country (use en-CA quick starts if preference is fr-CA)\n * 2. No country\n * 3. Any country (use en-CA quick starts if preference is en-US)\n */\nexport const getBestMatch = (quickStarts: QuickStart[], language: string): QuickStart | null => {\n if (!quickStarts || !quickStarts.length) {\n return null;\n }\n const preferredLanguage = (language || 'en').split('-')[0].toLowerCase();\n const preferredCountry = ((language || '').split('-')[1] || '').toUpperCase();\n\n let sameLanguageWithoutCountry: QuickStart = null;\n let sameLanguageWithAnyCountry: QuickStart = null;\n let fallbackLanguageSameCountry: QuickStart = null;\n let fallbackLanguageNoCountry: QuickStart = null;\n let fallbackLanguageAnyCountry: QuickStart = null;\n\n for (const quickStart of quickStarts) {\n const quickStartLanguage = (\n quickStart.metadata?.labels?.[LOCALIZATION_LANGUAGE_LABEL] || 'en'\n ).toLowerCase();\n const quickStartCountry = (\n quickStart.metadata?.labels?.[LOCALIZATION_COUNTRY_LABEL] || ''\n ).toUpperCase();\n\n if (quickStartLanguage === preferredLanguage && quickStartCountry === preferredCountry) {\n return quickStart;\n }\n if (quickStartLanguage === preferredLanguage) {\n if (!quickStartCountry && !sameLanguageWithoutCountry) {\n sameLanguageWithoutCountry = quickStart;\n } else if (quickStartCountry && !sameLanguageWithAnyCountry) {\n sameLanguageWithAnyCountry = quickStart;\n }\n }\n if (quickStartLanguage === 'en') {\n if (quickStartCountry === preferredCountry && !fallbackLanguageSameCountry) {\n fallbackLanguageSameCountry = quickStart;\n } else if (!quickStartCountry && !fallbackLanguageNoCountry) {\n fallbackLanguageNoCountry = quickStart;\n } else if (!fallbackLanguageAnyCountry) {\n fallbackLanguageAnyCountry = quickStart;\n }\n }\n }\n return (\n sameLanguageWithoutCountry ||\n sameLanguageWithAnyCountry ||\n fallbackLanguageSameCountry ||\n fallbackLanguageNoCountry ||\n fallbackLanguageAnyCountry\n );\n};\n\nexport const useQuickStarts = (filterDisabledQuickStarts = true): WatchK8sResult<QuickStart[]> => {\n const preferredLanguage = useTranslation().i18n.language;\n\n const [quickStarts, quickStartsLoaded, quickStartsError] = useK8sWatchResource<QuickStart[]>({\n groupVersionKind: getGroupVersionKindForModel(QuickStartModel),\n isList: true,\n });\n\n const bestMatchQuickStarts = React.useMemo(() => {\n if (!quickStartsLoaded) {\n return [];\n }\n const groupedQuickStarts = groupQuickStartsByName(quickStarts);\n\n if (filterDisabledQuickStarts) {\n const disabledQuickStarts = getDisabledQuickStarts();\n disabledQuickStarts.forEach((quickStartName) => delete groupedQuickStarts[quickStartName]);\n }\n\n return Object.values(groupedQuickStarts).map((quickStartsByName) =>\n getBestMatch(quickStartsByName, preferredLanguage),\n );\n }, [quickStarts, quickStartsLoaded, filterDisabledQuickStarts, preferredLanguage]);\n\n return [bestMatchQuickStarts, quickStartsLoaded, quickStartsError];\n};\n","import * as React from 'react';\nimport {\n Card,\n CardBody,\n Title,\n TitleSizes,\n Popover,\n ExpandableSection,\n} from '@patternfly/react-core';\nimport { TimesIcon } from '@patternfly/react-icons';\nimport { OutlinedQuestionCircleIcon } from '@patternfly/react-icons/dist/esm/icons/outlined-question-circle-icon';\nimport { useTranslation } from 'react-i18next';\nimport { GettingStartedShowState } from './useGettingStartedShowState';\n\nimport './GettingStartedExpandableGrid.scss';\n\ninterface GettingStartedExpandableGridProps {\n children?: React.ReactNodeArray;\n isOpen?: boolean;\n setIsOpen?: (isOpen: boolean) => void;\n setShowState?: (showState: GettingStartedShowState) => void;\n}\n\nexport const GettingStartedExpandableGrid: React.FC<GettingStartedExpandableGridProps> = ({\n children,\n isOpen,\n setIsOpen,\n setShowState,\n}) => {\n const { t } = useTranslation();\n\n const title = t('console-shared~Getting started resources');\n const titleTooltip = (\n <span className=\"ocs-getting-started-expandable-grid__tooltip\">\n {t(\n 'console-shared~Use our collection of resources to help you get started with the Console.',\n )}\n </span>\n );\n\n const handleClose = () => {\n setShowState(GettingStartedShowState.HIDE);\n };\n\n return (\n <ExpandableSection\n onToggle={() => setIsOpen(!isOpen)}\n isExpanded={isOpen}\n displaySize=\"lg\"\n className=\"ocs-getting-started-expandable-section\"\n toggleContent={\n <div className=\"ocs-getting-started-expandable-section__header\">\n <div className=\"ocs-getting-started-expandable-section__toggle-text\">\n <Title headingLevel=\"h2\" size={TitleSizes.lg} data-test=\"title\">\n {title}{' '}\n <Popover bodyContent={titleTooltip} triggerAction=\"hover\">\n <span\n role=\"button\"\n aria-label={t('console-shared~More info')}\n className=\"ocs-getting-started-expandable-grid__tooltip-icon\"\n >\n <OutlinedQuestionCircleIcon />\n </span>\n </Popover>\n </Title>\n </div>\n {setShowState && (\n <TimesIcon onClick={handleClose} className=\"ocs-getting-started-close-icon\" />\n )}\n </div>\n }\n >\n <Card\n className=\"ocs-getting-started-expandable-grid\"\n data-test=\"getting-started\"\n isClickable\n isSelectable\n >\n <CardBody className=\"ocs-getting-started-expandable-grid__content\">{children}</CardBody>\n </Card>\n </ExpandableSection>\n );\n};\n","export { default as DetailPropertyList } from './DetailPropertyList';\nexport { default as DetailPropertyListItem } from './DetailPropertyListItem';\n","import * as React from 'react';\nimport { List, ListProps } from '@patternfly/react-core';\n\nimport './DetailPropertyList.scss';\n\nconst DetailPropertyList: React.FC<ListProps> = ({ children, ...props }) => (\n <List className=\"co-detail-property-list\" {...props}>\n {children}\n </List>\n);\n\nexport default DetailPropertyList;\n","import * as React from 'react';\nimport { ListItem } from '@patternfly/react-core';\n\nimport './DetailPropertyList.scss';\n\ntype DetailPropertyListItemProps = {\n title?: string;\n};\n\nconst DetailPropertyListItem: React.FC<DetailPropertyListItemProps> = ({ title, children }) => (\n <ListItem>\n {title && <span className=\"co-detail-property-list__item-title\">{title}: </span>}\n {children}\n </ListItem>\n);\n\nexport default DetailPropertyListItem;\n","export { default as LogSnippet } from './LogSnippet';\n","import * as React from 'react';\n\nimport './LogSnippet.scss';\n\ntype LogSnippetProps = {\n logSnippet?: string;\n message: string;\n};\n\nconst LogSnippet: React.FC<LogSnippetProps> = ({ logSnippet, message }) => {\n return (\n <div className=\"ocs-log-snippet\">\n <p className=\"ocs-log-snippet__status-message\">{message}</p>\n {logSnippet && <pre className=\"co-pre ocs-log-snippet__log-snippet\">{logSnippet}</pre>}\n </div>\n );\n};\n\nexport default LogSnippet;\n","export { default as PodRing } from './PodRing';\nexport { default as PodStatus } from './PodStatus';\n","import * as React from 'react';\n\nconst ShortcutTable: React.FC = ({ children }) => (\n <table>\n <tbody>{children}</tbody>\n </table>\n);\n\nexport default ShortcutTable;\n","export { default as Drawer } from './Drawer';\n","export { default as HealthChecksAlert } from './HealthChecksAlert';\n","import * as React from 'react';\nimport { Alert, AlertActionCloseButton } from '@patternfly/react-core';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { useAccessReview } from '@console/internal/components/utils';\nimport {\n DeploymentConfigModel,\n DeploymentModel,\n DaemonSetModel,\n StatefulSetModel,\n} from '@console/internal/models';\nimport {\n K8sResourceKind,\n referenceForModel,\n referenceFor,\n modelFor,\n} from '@console/internal/module/k8s';\nimport { ServiceModel as KnativeServiceModel } from '@console/knative-plugin';\nimport { STORAGE_PREFIX, USERSETTINGS_PREFIX } from '../../constants';\nimport { useUserSettingsCompatibility } from '../../hooks/useUserSettingsCompatibility';\n\nimport './HealthChecksAlert.scss';\n\nconst HIDE_HEALTH_CHECK_ALERT_FOR = `${STORAGE_PREFIX}/hide-health-check-alert-for`;\nconst HEALTH_CHECK_CONFIGMAP_KEY = `${USERSETTINGS_PREFIX}.healthChecks`;\n\ntype HealthChecksAlertProps = {\n resource: K8sResourceKind;\n};\n\nconst addHealthChecksRefs = [\n referenceForModel(DeploymentConfigModel),\n referenceForModel(DeploymentModel),\n referenceForModel(DaemonSetModel),\n referenceForModel(StatefulSetModel),\n referenceForModel(KnativeServiceModel),\n];\n\nconst HealthChecksAlert: React.FC<HealthChecksAlertProps> = ({ resource }) => {\n const {\n kind,\n metadata: { name, namespace, uid },\n } = resource;\n const [\n hideHealthCheckAlertFor,\n setHideHealthCheckAlertFor,\n loaded,\n ] = useUserSettingsCompatibility<string[]>(\n HEALTH_CHECK_CONFIGMAP_KEY,\n HIDE_HEALTH_CHECK_ALERT_FOR,\n [],\n );\n const { t } = useTranslation();\n const kindForCRDResource = referenceFor(resource);\n const resourceModel = modelFor(kindForCRDResource);\n const resourceKind = resourceModel.crd ? kindForCRDResource : kind;\n\n const canAddHealthChecks = useAccessReview({\n group: resourceModel.apiGroup,\n resource: resourceModel.plural,\n namespace,\n name,\n verb: 'update',\n });\n\n if (!_.includes(addHealthChecksRefs, referenceFor(resource))) {\n return null;\n }\n\n const containers = resource?.spec?.template?.spec?.containers;\n const containersName = containers?.map((container) => container.name);\n const healthCheckAdded = _.every(\n containers,\n (container) => container.readinessProbe || container.livenessProbe || container.startupProbe,\n );\n\n const handleAlertAction = () => {\n if (loaded) {\n setHideHealthCheckAlertFor((state) => [...state, uid]);\n }\n };\n\n const showAlert =\n loaded && !healthCheckAdded && !_.includes(hideHealthCheckAlertFor, uid) && canAddHealthChecks;\n\n const addHealthChecksLink = `/k8s/ns/${namespace}/${resourceKind}/${name}/containers/${containersName[0]}/health-checks`;\n\n const alertMessage =\n _.size(containersName) > 1\n ? t(\n 'console-shared~Not all Containers have health checks to ensure your Application is running correctly.',\n )\n : t(\n 'console-shared~Container {{containersName}} does not have health checks to ensure your Application is running correctly.',\n { containersName: _.map(containersName) },\n );\n\n return (\n <>\n {showAlert ? (\n <div className=\"ocs-health-checks-alert\">\n <Alert\n variant=\"custom\"\n title={t('console-shared~Health checks')}\n actionClose={<AlertActionCloseButton onClose={handleAlertAction} />}\n isInline\n >\n {alertMessage}{' '}\n <Link to={addHealthChecksLink}>{t('console-shared~Add health checks')}</Link>\n </Alert>\n </div>\n ) : null}\n </>\n );\n};\n\nexport default HealthChecksAlert;\n","export { default as AlertSeverityIcon } from './AlertSeverityIcon';\nexport { default as ErrorAlert } from './error';\n","import * as React from 'react';\nimport { ExclamationCircleIcon } from '@patternfly/react-icons/dist/esm/icons/exclamation-circle-icon';\nimport { ExclamationTriangleIcon } from '@patternfly/react-icons/dist/esm/icons/exclamation-triangle-icon';\nimport { AlertSeverity } from '@console/dynamic-plugin-sdk';\n\ninterface AlertSeverityIconProps {\n severityAlertType: AlertSeverity;\n fontSize?: number;\n}\n\nconst AlertSeverityIcon: React.FC<AlertSeverityIconProps> = ({\n severityAlertType,\n fontSize,\n}): React.ReactElement => {\n switch (severityAlertType) {\n case AlertSeverity.Critical:\n return (\n <ExclamationCircleIcon\n style={{\n fontSize,\n fill: 'var(--pf-v5-global--danger-color--100)',\n }}\n />\n );\n case AlertSeverity.Warning:\n default:\n return (\n <ExclamationTriangleIcon\n style={{\n fontSize,\n fill: 'var(--pf-v5-global--warning-color--100)',\n }}\n />\n );\n }\n};\n\nexport default AlertSeverityIcon;\n","export { default as Popover } from './Popover';\nexport * from './const';\n","import * as React from 'react';\nimport { FocusTrap, TitleSizes, Title } from '@patternfly/react-core';\nimport { PopoverArrow } from '@patternfly/react-core/dist/js/components/Popover/PopoverArrow';\nimport { PopoverBody } from '@patternfly/react-core/dist/js/components/Popover/PopoverBody';\nimport { PopoverCloseButton } from '@patternfly/react-core/dist/js/components/Popover/PopoverCloseButton';\nimport { PopoverContent } from '@patternfly/react-core/dist/js/components/Popover/PopoverContent';\nimport { PopoverFooter } from '@patternfly/react-core/dist/js/components/Popover/PopoverFooter';\nimport { css } from '@patternfly/react-styles';\nimport styles from '@patternfly/react-styles/css/components/Popover/popover';\nimport { useTranslation } from 'react-i18next';\nimport { Popper } from '../popper';\nimport { PopoverPlacement } from './const';\nimport './Popover.scss';\n\ntype PopoverProps = {\n open: boolean;\n uniqueId?: string;\n onClose?: () => void;\n headerContent?: React.ReactNode | string;\n footerContent?: React.ReactNode | string;\n children: React.ReactNode | string;\n trigger: string;\n className?: string;\n placement: PopoverPlacement;\n id?: string;\n};\n\nconst Popover: React.FC<PopoverProps> = ({\n open,\n headerContent,\n placement,\n onClose,\n uniqueId,\n children,\n footerContent,\n trigger,\n className,\n id,\n}) => {\n const { t } = useTranslation();\n return (\n <>\n <Popper\n reference={document.querySelector(trigger)}\n open={open}\n placement={placement}\n className=\"ocs-popover\"\n popperOptions={{\n modifiers: { arrow: { element: '.ocs-popover__arrow' } },\n }}\n >\n <FocusTrap>\n <div id={id} className={css(styles.popover, className)}>\n <PopoverArrow className=\"ocs-popover__arrow\" />\n <PopoverContent>\n <PopoverCloseButton onClose={onClose} aria-label={t('console-shared~Close')} />\n {headerContent && (\n <Title headingLevel=\"h6\" size={TitleSizes.md} id={`popover-${uniqueId}-header`}>\n {headerContent}\n </Title>\n )}\n <PopoverBody id={`popover-${uniqueId}-body`}>{children}</PopoverBody>\n {footerContent && (\n <PopoverFooter id={`popover-${uniqueId}-footer`}>{footerContent}</PopoverFooter>\n )}\n </PopoverContent>\n </div>\n </FocusTrap>\n </Popper>\n </>\n );\n};\n\nPopover.displayName = 'Popover';\n\nexport default Popover;\n","export enum PopoverPlacement {\n top = 'top',\n left = 'left',\n right = 'right',\n bottom = 'bottom',\n}\n","export { default as PageLayout } from './PageLayout';\n","import * as React from 'react';\nimport { Text } from '@patternfly/react-core';\nimport cx from 'classnames';\n\nimport './PageLayout.scss';\n\ntype PageLayoutProps = {\n children: React.ReactNode;\n title: React.ReactNode;\n hint?: React.ReactNode;\n isDark?: boolean;\n};\n\nconst PageLayout: React.FC<PageLayoutProps> = ({ children, title, hint, isDark }) => (\n <>\n <div className=\"ocs-page-layout__header\">\n <Text component=\"h1\" className=\"ocs-page-layout__title\">\n {title}\n </Text>\n {hint && <div className=\"ocs-page-layout__hint\">{hint}</div>}\n </div>\n <div className={cx('ocs-page-layout__content', { 'is-dark': isDark })}>{children}</div>\n </>\n);\n\nexport default PageLayout;\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { RadioInput } from '@console/internal/components/radio';\n\nconst ConsolePluginRadioInputs: React.FC<ConsolePluginRadioInputsProps> = ({\n autofocus,\n enabled,\n onChange: setEnabled,\n name,\n}) => {\n const { t } = useTranslation();\n const onChange = (e: React.ChangeEvent<HTMLInputElement>) =>\n setEnabled(e.currentTarget.value === 'enabled');\n return (\n <>\n <RadioInput\n name={name}\n onChange={onChange}\n value=\"enabled\"\n checked={enabled}\n title={t('console-shared~Enable')}\n autoFocus={autofocus && enabled}\n />\n <RadioInput\n name={name}\n onChange={onChange}\n value=\"disabled\"\n checked={!enabled}\n title={t('console-shared~Disable')}\n autoFocus={autofocus && !enabled}\n />\n </>\n );\n};\n\ntype ConsolePluginRadioInputsProps = {\n autofocus?: boolean;\n enabled: boolean;\n onChange: (enabled: boolean) => void;\n name: string;\n};\n\nexport default ConsolePluginRadioInputs;\n","import * as React from 'react';\nimport { Alert } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\n\nconst ConsolePluginWarning: React.FC<ConsolePluginWarningProps> = ({\n enabled,\n previouslyEnabled,\n trusted,\n}) => {\n const { t } = useTranslation();\n return (\n !previouslyEnabled &&\n enabled &&\n !trusted && (\n <Alert variant=\"warning\" isInline title={t('console-shared~Enabling console plugin')}>\n <p>\n {t(\n 'console-shared~This console plugin will be able to provide a custom interface and run any Kubernetes command as the logged in user. Make sure you trust it before enabling.',\n )}\n </p>\n </Alert>\n )\n );\n};\n\ntype ConsolePluginWarningProps = {\n enabled: boolean;\n previouslyEnabled: boolean;\n trusted: boolean;\n};\n\nexport default ConsolePluginWarning;\n","export { default as deleteHPAModal } from './DeleteHPAModal';\n","import * as React from 'react';\nimport { Form } from '@patternfly/react-core';\nimport { ExclamationTriangleIcon } from '@patternfly/react-icons/dist/esm/icons/exclamation-triangle-icon';\nimport { global_warning_color_100 as warningColor } from '@patternfly/react-tokens/dist/js/global_warning_color_100';\nimport { useTranslation } from 'react-i18next';\nimport {\n createModalLauncher,\n ModalBody,\n ModalComponentProps,\n ModalSubmitFooter,\n ModalTitle,\n} from '@console/internal/components/factory/modal';\nimport { LoadingInline } from '@console/internal/components/utils';\nimport { HorizontalPodAutoscalerModel } from '@console/internal/models';\nimport {\n HorizontalPodAutoscalerKind,\n k8sKill,\n K8sResourceCommon,\n} from '@console/internal/module/k8s';\n\ntype DeleteHPAModalProps = ModalComponentProps & {\n hpa: HorizontalPodAutoscalerKind;\n workload: K8sResourceCommon;\n};\n\nconst DeleteHPAModal: React.FC<DeleteHPAModalProps> = ({ close, hpa, workload }) => {\n const [submitError, setSubmitError] = React.useState<string>(null);\n const [isSubmitting, setIsSubmitting] = React.useState<boolean>(false);\n const { t } = useTranslation();\n const hpaName = hpa.metadata.name;\n const workloadName = workload.metadata.name;\n\n const handleSubmit = (e) => {\n e.preventDefault();\n setIsSubmitting(true);\n k8sKill(HorizontalPodAutoscalerModel, hpa)\n .then(() => {\n close();\n })\n .catch((error) => {\n setSubmitError(\n error?.message ||\n t('console-shared~Unknown error removing {{hpaLabel}} {{hpaName}}.', {\n hpaLabel: HorizontalPodAutoscalerModel.label,\n hpaName,\n }),\n );\n });\n };\n\n return (\n <Form onSubmit={handleSubmit}>\n <div className=\"modal-content\">\n <ModalTitle>\n <ExclamationTriangleIcon color={warningColor.value} />{' '}\n {t('console-shared~Remove {{label}}?', { label: HorizontalPodAutoscalerModel.label })}\n </ModalTitle>\n <ModalBody>\n {hpaName ? (\n <>\n <p>\n {t('console-shared~Are you sure you want to remove the {{hpaLabel}}', {\n hpaLabel: HorizontalPodAutoscalerModel.label,\n })}{' '}\n <b>{hpaName}</b> {t('console-shared~from')} <b>{workloadName}</b>?\n </p>\n <p>\n {t(\n 'console-shared~The resources that are attached to the {{hpaLabel}} will be deleted.',\n { hpaLabel: HorizontalPodAutoscalerModel.label },\n )}\n </p>\n </>\n ) : (\n !submitError && <LoadingInline />\n )}\n </ModalBody>\n <ModalSubmitFooter\n errorMessage={submitError}\n inProgress={isSubmitting}\n submitText={t('console-shared~Remove')}\n submitDanger\n submitDisabled={!!submitError}\n cancel={close}\n />\n </div>\n </Form>\n );\n};\n\nexport default createModalLauncher(DeleteHPAModal);\n","export { default as MultiTabListPage } from './MultiTabListPage';\nexport * from './multi-tab-list-page-types';\n","import * as React from 'react';\nimport { ActionList, ActionListItem, Button } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { useParams, Link } from 'react-router-dom-v5-compat';\nimport {\n history,\n PageHeading,\n HorizontalNav,\n Page,\n Dropdown,\n} from '@console/internal/components/utils';\nimport { referenceForModel } from '@console/internal/module/k8s';\nimport { PageTitleContext } from '../pagetitle/PageTitleContext';\nimport { MenuActions, MenuAction, SecondaryButtonAction } from './multi-tab-list-page-types';\n\ninterface MultiTabListPageProps {\n title: string;\n badge?: React.ReactNode;\n menuActions?: MenuActions;\n pages: Page[];\n secondaryButtonAction?: SecondaryButtonAction;\n telemetryPrefix?: string;\n}\n\nconst MultiTabListPage: React.FC<MultiTabListPageProps> = ({\n title,\n badge,\n pages,\n menuActions,\n secondaryButtonAction,\n telemetryPrefix,\n}) => {\n const { t } = useTranslation();\n const { ns } = useParams();\n const onSelectCreateAction = (actionName: string): void => {\n const selectedMenuItem: MenuAction = menuActions[actionName];\n let url: string;\n if (selectedMenuItem.model) {\n const namespace = ns ?? 'default';\n const modelRef = referenceForModel(selectedMenuItem.model);\n url = namespace ? `/k8s/ns/${namespace}/${modelRef}/~new` : `/k8s/cluster/${modelRef}/~new`;\n }\n if (selectedMenuItem.onSelection) {\n url = selectedMenuItem.onSelection(actionName, selectedMenuItem, url);\n }\n if (url) {\n history.push(url);\n }\n };\n\n const items = menuActions\n ? Object.keys(menuActions).reduce<Record<string, string>>((acc, key) => {\n const menuAction: MenuAction = menuActions[key];\n const label =\n menuAction.label ||\n (menuAction.model?.labelKey ? t(menuAction.model.labelKey) : menuAction.model?.label);\n if (!label) return acc;\n\n return {\n ...acc,\n [key]: label,\n };\n }, {})\n : undefined;\n\n const titleProviderValues = {\n telemetryPrefix,\n titlePrefix: title,\n };\n\n return (\n <PageTitleContext.Provider value={titleProviderValues}>\n <PageHeading className=\"co-m-nav-title--row\" title={title} badge={badge}>\n <ActionList>\n <ActionListItem>\n {secondaryButtonAction && (\n <Button\n type=\"button\"\n variant=\"secondary\"\n data-test=\"secondary-action\"\n component={(props) => <Link {...props} to={secondaryButtonAction.href} />}\n >\n {secondaryButtonAction.label}\n </Button>\n )}\n </ActionListItem>\n <ActionListItem>\n {items && (\n <Dropdown\n buttonClassName=\"pf-m-primary\"\n menuClassName=\"pf-m-align-right-on-md\"\n title={t('console-shared~Create')}\n noSelection\n items={items}\n onChange={onSelectCreateAction}\n />\n )}\n </ActionListItem>\n </ActionList>\n </PageHeading>\n <HorizontalNav pages={pages} noStatusBox />\n </PageTitleContext.Provider>\n );\n};\n\nexport default MultiTabListPage;\n","export { default as Spotlight } from './Spotlight';\n","import * as React from 'react';\nimport InteractiveSpotlight from './InteractiveSpotlight';\nimport StaticSpotlight from './StaticSpotlight';\n\ntype SpotlightProps = {\n selector: string;\n interactive?: boolean;\n};\n\nconst Spotlight: React.FC<SpotlightProps> = ({ selector, interactive }) => {\n // if target element is a hidden one return null\n const element = React.useMemo(() => {\n const highlightElement = document.querySelector(selector);\n let hiddenElement = highlightElement;\n while (hiddenElement && interactive) {\n const ariaHidden = hiddenElement.getAttribute('aria-hidden');\n if (ariaHidden === 'true') return null;\n hiddenElement = hiddenElement.parentElement;\n }\n return highlightElement;\n }, [selector, interactive]);\n\n if (!element) return null;\n return interactive ? (\n <InteractiveSpotlight element={element} />\n ) : (\n <StaticSpotlight element={element} />\n );\n};\n\nexport default Spotlight;\n","export { default as CustomResourceList } from './CustomResourceList';\n","import * as React from 'react';\nimport { EmptyState, EmptyStateVariant } from '@patternfly/react-core';\nimport { SortByDirection } from '@patternfly/react-table';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { Table, RowFunctionArgs, TableProps } from '@console/internal/components/factory';\nimport { FilterToolbar, RowFilter } from '@console/internal/components/filter-toolbar';\nimport { getQueryArgument, LoadingBox } from '@console/internal/components/utils';\n\ninterface CustomResourceListProps {\n queryArg?: string;\n rowFilters?: RowFilter[];\n sortBy: string;\n sortOrder: SortByDirection;\n ResourceRow: React.FC<RowFunctionArgs>;\n resources?: { [key: string]: any }[];\n resourceHeader: () => { [key: string]: any }[];\n EmptyMsg?: React.ComponentType;\n loaded?: boolean;\n rowFilterReducer?: (\n items: { [key: string]: any }[],\n filters: string | string[],\n ) => { [key: string]: any }[];\n textFilter?: string;\n textFilterReducer?: (\n items: { [key: string]: any }[],\n filters: string,\n ) => { [key: string]: any }[];\n customData?: any;\n getRowProps?: TableProps['getRowProps'];\n}\n\nconst CustomResourceList: React.FC<CustomResourceListProps> = ({\n resources,\n loaded = true,\n EmptyMsg,\n queryArg,\n rowFilters,\n rowFilterReducer,\n textFilter,\n textFilterReducer,\n resourceHeader,\n ResourceRow,\n sortBy,\n sortOrder,\n customData,\n getRowProps,\n}) => {\n const { t } = useTranslation();\n const applyFilters = React.useCallback(() => {\n const queryArgument = queryArg ? getQueryArgument(queryArg) : undefined;\n const activeFilters = queryArgument?.split(',');\n const params = new URLSearchParams(window.location.search);\n const filteredText = params.get(textFilter);\n\n let filteredItems = resources;\n if (activeFilters) {\n filteredItems = rowFilterReducer(filteredItems, activeFilters);\n }\n if (filteredText) {\n filteredItems = textFilterReducer(filteredItems, filteredText);\n }\n return filteredItems;\n }, [resources, queryArg, rowFilterReducer, textFilter, textFilterReducer]);\n\n const filteredListItems = applyFilters();\n\n if (!loaded) {\n return <LoadingBox />;\n }\n\n if (_.isEmpty(resources)) {\n return EmptyMsg ? (\n <EmptyMsg />\n ) : (\n <EmptyState variant={EmptyStateVariant.full}>\n <p>{t('console-shared~No resources found')}</p>\n </EmptyState>\n );\n }\n\n return (\n <div className=\"co-m-pane__body\">\n {(rowFilters || textFilter) && (\n <FilterToolbar\n rowFilters={rowFilters}\n data={resources}\n textFilter={textFilter}\n hideLabelFilter\n reduxIDs={[]}\n />\n )}\n <Table\n data={filteredListItems}\n defaultSortField={sortBy}\n defaultSortOrder={sortOrder}\n aria-label=\"CustomResources\"\n Header={resourceHeader}\n Row={ResourceRow}\n loaded={loaded}\n virtualize\n customData={customData}\n getRowProps={getRowProps}\n />\n </div>\n );\n};\n\nexport default React.memo(CustomResourceList);\n","import * as React from 'react';\nimport ToastContext from './ToastContext';\n\nexport default () => React.useContext(ToastContext);\n","export { default as MarkdownCopyClipboard } from './MarkdownCopyClipboard';\nexport { default as MarkdownExecuteSnippet } from './MarkdownExecuteSnippet';\nexport { default as useInlineCopyClipboardShowdownExtension } from './inline-clipboard-extension';\nexport { default as useInlineExecuteCommandShowdownExtension } from './inline-execute-extension';\nexport { default as useMultilineCopyClipboardShowdownExtension } from './multiline-clipboard-extension';\nexport { default as useMultilineExecuteCommandShowdownExtension } from './multiline-execute-extension';\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useEventListener } from '../../hooks';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { MARKDOWN_COPY_BUTTON_ID, MARKDOWN_SNIPPET_ID } from './const';\n\ntype CopyClipboardProps = {\n element: HTMLElement;\n rootSelector: string;\n docContext: HTMLDocument;\n};\n\nexport const CopyClipboard: React.FC<CopyClipboardProps> = ({\n element,\n rootSelector,\n docContext,\n}) => {\n const { t } = useTranslation();\n const [showSuccessContent, setShowSuccessContent] = React.useState<boolean>(false);\n const textToCopy = React.useMemo(() => {\n const copyTextId = element.getAttribute(MARKDOWN_COPY_BUTTON_ID);\n return (docContext.querySelector(\n `${rootSelector} [${MARKDOWN_SNIPPET_ID}=\"${copyTextId}\"]`,\n ) as HTMLElement).innerText;\n }, [element, docContext, rootSelector]);\n\n useEventListener(\n element,\n 'click',\n React.useCallback(() => {\n navigator.clipboard\n .writeText(textToCopy)\n .then(() => {\n setShowSuccessContent(true);\n })\n .catch(() => {});\n }, [textToCopy]),\n );\n\n return (\n <Tooltip\n reference={() => element as HTMLElement}\n content={\n showSuccessContent\n ? t('console-shared~Successfully copied to clipboard!')\n : t('console-shared~Copy to clipboard')\n }\n onHide={() => {\n setShowSuccessContent(false);\n }}\n />\n );\n};\n\ntype MarkdownCopyClipboardProps = {\n docContext: HTMLDocument;\n rootSelector: string;\n};\n\nconst MarkdownCopyClipboard: React.FC<MarkdownCopyClipboardProps> = ({\n docContext,\n rootSelector,\n}) => {\n const elements = docContext.querySelectorAll(`${rootSelector} [${MARKDOWN_COPY_BUTTON_ID}]`);\n return elements.length > 0 ? (\n <>\n {Array.from(elements).map((elm) => {\n const attributeValue = elm.getAttribute(MARKDOWN_COPY_BUTTON_ID);\n return (\n <CopyClipboard\n key={attributeValue}\n element={elm as HTMLElement}\n rootSelector={rootSelector}\n docContext={docContext}\n />\n );\n })}\n </>\n ) : null;\n};\n\nexport default MarkdownCopyClipboard;\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport useCloudShellAvailable from '@console/webterminal-plugin/src/components/cloud-shell/useCloudShellAvailable';\nimport { useCloudShellCommandDispatch } from '@console/webterminal-plugin/src/redux/actions/cloud-shell-dispatchers';\nimport { useEventListener } from '../../hooks';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { MARKDOWN_EXECUTE_BUTTON_ID, MARKDOWN_SNIPPET_ID } from './const';\n\ntype ExecuteSnippetProps = {\n element: HTMLElement;\n rootSelector: string;\n docContext: HTMLDocument;\n};\n\nexport const ExecuteSnippet: React.FC<ExecuteSnippetProps> = ({\n element,\n rootSelector,\n docContext,\n}) => {\n const { t } = useTranslation();\n const setCloudShellCommand = useCloudShellCommandDispatch();\n const [showRunning, setShowRunning] = React.useState<boolean>(false);\n const textToExecute = React.useMemo(() => {\n const executeTextId = element.getAttribute(MARKDOWN_EXECUTE_BUTTON_ID);\n return (docContext.querySelector(\n `${rootSelector} [${MARKDOWN_SNIPPET_ID}=\"${executeTextId}\"]`,\n ) as HTMLElement).innerText;\n }, [element, rootSelector, docContext]);\n\n useEventListener(\n element,\n 'click',\n React.useCallback(() => {\n setCloudShellCommand(textToExecute);\n setShowRunning(true);\n element.setAttribute('data-executed', '');\n }, [textToExecute, element, setCloudShellCommand]),\n );\n\n return (\n <Tooltip\n reference={() => element}\n content={\n showRunning\n ? t('console-shared~Running in Web Terminal')\n : t('console-shared~Run in Web Terminal')\n }\n onShow={() => {\n element.removeAttribute('data-executed');\n }}\n onHide={() => {\n setShowRunning(false);\n }}\n />\n );\n};\n\ntype MarkdownExecuteCommandProps = {\n docContext: HTMLDocument;\n rootSelector: string;\n};\n\nconst MarkdownExecuteSnippet: React.FC<MarkdownExecuteCommandProps> = ({\n docContext,\n rootSelector,\n}) => {\n const elements = docContext.querySelectorAll(`${rootSelector} [${MARKDOWN_EXECUTE_BUTTON_ID}]`);\n const showExecuteButton = useCloudShellAvailable();\n return elements.length > 0 && showExecuteButton ? (\n <>\n {Array.from(elements).map((elm) => {\n const attributeValue = elm.getAttribute(MARKDOWN_EXECUTE_BUTTON_ID);\n return (\n <ExecuteSnippet\n key={attributeValue}\n element={elm as HTMLElement}\n rootSelector={rootSelector}\n docContext={docContext}\n />\n );\n })}\n </>\n ) : null;\n};\n\nexport default MarkdownExecuteSnippet;\n","import { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { MARKDOWN_COPY_BUTTON_ID, MARKDOWN_SNIPPET_ID } from './const';\n\nimport './showdown-extension.scss';\n\nconst useInlineCopyClipboardShowdownExtension = () => {\n const { t } = useTranslation();\n return useMemo(\n () => ({\n type: 'lang',\n regex: /`([^`](.*?)[^`])`{{copy}}/g,\n replace: (\n text: string,\n group: string,\n subGroup: string,\n groupType: string,\n groupId: string,\n ): string => {\n if (!group || !subGroup || !groupType || !groupId) return text;\n return `<b><div class=\"pf-v5-c-code-block\">\n <div class=\"pf-v5-c-code-block__header\">\n <div class=\"pf-v5-c-code-block__actions\">\n <div class=\"pf-v5-c-code-block__actions-item\">\n <button class=\"pf-v5-c-button pf-m-plain\" type=\"button\" aria-label=\"${t(\n 'console-shared~Copy to clipboard',\n )}\" ${MARKDOWN_COPY_BUTTON_ID}=\"${groupType}\">\n <i class=\"fas fa-copy\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"pf-v5-c-code-block__content\">\n <pre class=\"pf-v5-c-code-block__pre ocs-code-block__pre\">\n <code class=\"pf-v5-c-code-block__code\" \n ${MARKDOWN_SNIPPET_ID}=\"${groupType}\">${group.trim()}</code>\n </pre>\n </div>\n </div></b>`;\n },\n }),\n [t],\n );\n};\n\nexport default useInlineCopyClipboardShowdownExtension;\n","import { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport useCloudShellAvailable from '@console/webterminal-plugin/src/components/cloud-shell/useCloudShellAvailable';\nimport { MARKDOWN_COPY_BUTTON_ID, MARKDOWN_EXECUTE_BUTTON_ID, MARKDOWN_SNIPPET_ID } from './const';\n\nimport './showdown-extension.scss';\n\nconst useInlineExecuteCommandShowdownExtension = () => {\n const { t } = useTranslation();\n const showExecuteButton = useCloudShellAvailable();\n return useMemo(\n () => ({\n type: 'lang',\n regex: /`([^`](.*?)[^`])`{{execute}}/g,\n replace: (\n text: string,\n group: string,\n subGroup: string,\n groupType: string,\n groupId: string,\n ): string => {\n if (!group || !subGroup || !groupType || !groupId) return text;\n return `<div class=\"pf-v5-c-code-block\">\n <div class=\"pf-v5-c-code-block__header\">\n <div class=\"pf-v5-c-code-block__actions\">\n <div class=\"pf-v5-c-code-block__actions-item\">\n <button class=\"pf-v5-c-button pf-m-plain\" type=\"button\" aria-label=\"${t(\n 'console-shared~Copy to clipboard',\n )}\" ${MARKDOWN_COPY_BUTTON_ID}=\"${groupType}\">\n <i class=\"fas fa-copy\" aria-hidden=\"true\"></i>\n </button>\n </div>\n ${\n showExecuteButton\n ? `<div class=\"pf-v5-c-code-block__actions-item ocs-markdown-execute-snippet__action\">\n <button class=\"pf-v5-c-button pf-m-plain ocs-markdown-execute-snippet__button\" type=\"button\" aria-label=\"${t(\n 'console-shared~Run in Web Terminal',\n )}\" ${MARKDOWN_EXECUTE_BUTTON_ID}=\"${groupType}\">\n <i class=\"fas fa-play\" aria-hidden=\"true\"></i>\n <i class=\"fas fa-check\" aria-hidden=\"true\"></i>\n </button>\n </div>`\n : ''\n }\n </div>\n </div>\n <div class=\"pf-v5-c-code-block__content\">\n <pre class=\"pf-v5-c-code-block__pre pfext-code-block__pre\">\n <code class=\"pf-v5-c-code-block__code\" ${MARKDOWN_SNIPPET_ID}=\"${groupType}\">${group.trim()}</code>\n </pre>\n </div>\n </div>`;\n },\n }),\n [showExecuteButton, t],\n );\n};\n\nexport default useInlineExecuteCommandShowdownExtension;\n","import { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { MARKDOWN_COPY_BUTTON_ID, MARKDOWN_SNIPPET_ID } from './const';\n\nimport './showdown-extension.scss';\n\nconst useMultilineCopyClipboardShowdownExtension = () => {\n const { t } = useTranslation();\n return useMemo(\n () => ({\n type: 'lang',\n regex: /```[\\n]((.*?\\n)+)```{{copy}}/g,\n replace: (\n text: string,\n group: string,\n subgroup: string,\n groupType: string,\n groupId: string,\n ): string => {\n if (!group || !subgroup || !groupType || !groupId) return text;\n return `<div class=\"pf-v5-c-code-block\">\n <div class=\"pf-v5-c-code-block__header\">\n <div class=\"pf-v5-c-code-block__actions\">\n <div class=\"pf-v5-c-code-block__actions-item\">\n <button class=\"pf-v5-c-button pf-m-plain\" type=\"button\" aria-label=\"${t(\n 'console-shared~Copy to clipboard',\n )}\" ${MARKDOWN_COPY_BUTTON_ID}=\"${groupType}\">\n <i class=\"fas fa-copy\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n <div class=\"pf-v5-c-code-block__content\">\n <pre class=\"pf-v5-c-code-block__pre ocs-code-block__pre\">\n <code class=\"pf-v5-c-code-block__code\" \n ${MARKDOWN_SNIPPET_ID}=\"${groupType}\">${group}</code>\n </pre>\n </div>\n </div>`;\n },\n }),\n [t],\n );\n};\n\nexport default useMultilineCopyClipboardShowdownExtension;\n","import { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport useCloudShellAvailable from '@console/webterminal-plugin/src/components/cloud-shell/useCloudShellAvailable';\nimport { MARKDOWN_COPY_BUTTON_ID, MARKDOWN_EXECUTE_BUTTON_ID, MARKDOWN_SNIPPET_ID } from './const';\n\nimport './showdown-extension.scss';\n\nconst useMultilineExecuteCommandShowdownExtension = () => {\n const { t } = useTranslation();\n const showExecuteButton = useCloudShellAvailable();\n return useMemo(\n () => ({\n type: 'lang',\n regex: /```[\\n]\\s*((((?!```).)*?\\n)+)\\s*```{{execute}}/g,\n replace: (\n text: string,\n group: string,\n subgroup: string,\n groupType: string,\n groupId: string,\n ): string => {\n if (!group || !subgroup || !groupType || !groupId) return text;\n return `<div class=\"pf-v5-c-code-block\">\n <div class=\"pf-v5-c-code-block__header\">\n <div class=\"pf-v5-c-code-block__actions\">\n <div class=\"pf-v5-c-code-block__actions-item\">\n <button class=\"pf-v5-c-button pf-m-plain\" type=\"button\" aria-label=\"${t(\n 'console-shared~Copy to clipboard',\n )}\" ${MARKDOWN_COPY_BUTTON_ID}=\"${groupId}\">\n <i class=\"fas fa-copy\" aria-hidden=\"true\"></i>\n </button>\n </div>\n ${\n showExecuteButton\n ? `<div class=\"pf-v5-c-code-block__actions-item ocs-markdown-execute-snippet__action\">\n <button class=\"pf-v5-c-button pf-m-plain ocs-markdown-execute-snippet__button\" type=\"button\" aria-label=\"${t(\n 'console-shared~Run in Web Terminal',\n )}\" ${MARKDOWN_EXECUTE_BUTTON_ID}=\"${groupId}\">\n <i class=\"fas fa-play\" aria-hidden=\"true\"></i>\n <i class=\"fas fa-check\" aria-hidden=\"true\"></i>\n </button>\n </div>`\n : ''\n }\n </div>\n </div>\n <div class=\"pf-v5-c-code-block__content\">\n <pre class=\"pf-v5-c-code-block__pre pfext-code-block__pre\">\n <code class=\"pf-v5-c-code-block__code\" \n ${MARKDOWN_SNIPPET_ID}=\"${groupId}\">${group.trim()}</code>\n </pre>\n </div>\n </div>`;\n },\n }),\n [showExecuteButton, t],\n );\n};\n\nexport default useMultilineExecuteCommandShowdownExtension;\n","import * as React from 'react';\nimport { Menu, MenuContent, MenuList, Popper } from '@patternfly/react-core';\nimport * as _ from 'lodash';\nimport { Action, MenuOption, useSafetyFirst } from '@console/dynamic-plugin-sdk';\nimport { checkAccess } from '@console/internal/components/utils';\nimport { ActionMenuVariant } from '../types';\nimport ActionMenuContent from './ActionMenuContent';\nimport ActionMenuToggle from './ActionMenuToggle';\n\ntype ActionMenuProps = {\n actions: Action[];\n options?: MenuOption[];\n isDisabled?: boolean;\n variant?: ActionMenuVariant;\n label?: string;\n};\n\nconst ActionMenu: React.FC<ActionMenuProps> = ({\n actions,\n options,\n isDisabled,\n variant = ActionMenuVariant.KEBAB,\n label,\n}) => {\n const isKebabVariant = variant === ActionMenuVariant.KEBAB;\n const [isVisible, setVisible] = useSafetyFirst(isKebabVariant);\n const [isOpen, setIsOpen] = React.useState<boolean>(false);\n const menuRef = React.useRef<HTMLDivElement>(null);\n const toggleRef = React.useRef<HTMLButtonElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const menuOptions = options?.length > 0 ? options : actions;\n\n const hideMenu = () => {\n setIsOpen(false);\n };\n\n const handleHover = React.useCallback(() => {\n // Check access when hovering over a kebab to minimize flicker when opened.\n // This depends on `checkAccess` being memoized.\n _.each(actions, (action: Action) => {\n if (action.accessReview) {\n checkAccess(action.accessReview).catch((e) =>\n // eslint-disable-next-line no-console\n console.warn('Could not check access for action menu', e),\n );\n }\n });\n }, [actions]);\n\n // Check if any actions are visible when actions have access reviews.\n React.useEffect(() => {\n if (!actions.length) {\n setVisible(false);\n return;\n }\n // Do nothing if variant is kebab. The action menu should be visible and acces review happens on hover.\n if (isKebabVariant) return;\n\n const promises = actions.reduce((acc, action) => {\n if (action.accessReview) {\n acc.push(checkAccess(action.accessReview));\n }\n return acc;\n }, []);\n\n // Only need to resolve if all actions require access review\n if (promises.length !== actions.length) {\n setVisible(true);\n return;\n }\n Promise.all(promises)\n .then((results) => setVisible(_.some(results, 'status.allowed')))\n .catch(() => setVisible(true));\n }, [actions, isKebabVariant, setVisible]);\n\n const menu = (\n <Menu ref={menuRef} containsFlyout onSelect={hideMenu}>\n <MenuContent data-test-id=\"action-items\">\n <MenuList>\n <ActionMenuContent options={menuOptions} onClick={hideMenu} focusItem={menuOptions[0]} />\n </MenuList>\n </MenuContent>\n </Menu>\n );\n\n return (\n isVisible && (\n <div ref={containerRef}>\n <ActionMenuToggle\n isOpen={isOpen}\n isDisabled={isDisabled}\n toggleRef={toggleRef}\n toggleVariant={variant}\n toggleTitle={label}\n menuRef={menuRef}\n onToggleClick={setIsOpen}\n onToggleHover={handleHover}\n />\n <Popper\n triggerRef={toggleRef}\n popper={menu}\n placement=\"bottom-end\"\n isVisible={isOpen}\n appendTo={containerRef.current}\n />\n </div>\n )\n );\n};\n\nexport default ActionMenu;\n","export { default as QuickSearchController } from './QuickSearchController';\nexport * from './utils/quick-search-types';\nexport * from './utils/quick-search-utils';\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { DetailsRendererFunction } from './QuickSearchDetails';\nimport QuickSearchModal from './QuickSearchModal';\nimport { QuickSearchData, QuickSearchProviders } from './utils/quick-search-types';\nimport { quickSearch } from './utils/quick-search-utils';\n\ntype QuickSearchControllerProps = {\n namespace: string;\n viewContainer?: HTMLElement;\n quickSearchProviders: QuickSearchProviders;\n searchPlaceholder: string;\n allItemsLoaded: boolean;\n isOpen: boolean;\n icon?: React.ReactNode;\n limitItemCount?: number;\n disableKeyboardOpen?: boolean;\n setIsOpen: (isOpen: boolean) => void;\n detailsRenderer?: DetailsRendererFunction;\n};\n\nconst QuickSearchController: React.FC<QuickSearchControllerProps> = ({\n namespace,\n quickSearchProviders,\n searchPlaceholder,\n viewContainer,\n allItemsLoaded,\n limitItemCount,\n icon,\n isOpen,\n setIsOpen,\n disableKeyboardOpen = false,\n detailsRenderer,\n}) => {\n const { t } = useTranslation();\n\n const isLimitedList = limitItemCount > 0;\n const searchCatalog = React.useCallback(\n (searchTerm: string): QuickSearchData => {\n return quickSearchProviders.reduce(\n (acc, quickSearchProvider) => {\n const items = quickSearchProvider.loaded\n ? quickSearch(quickSearchProvider.items, searchTerm)\n : [];\n const itemCount = items.length;\n const viewAllLink =\n itemCount > 0 && isLimitedList\n ? [\n {\n label: t(quickSearchProvider.catalogLinkLabel, { itemCount }),\n to: quickSearchProvider.getCatalogURL(searchTerm, namespace),\n catalogType: quickSearchProvider.catalogType,\n },\n ]\n : [];\n const catalogItemTypes = quickSearchProvider.extensions.map((extension) => ({\n label: extension.properties.title,\n value: extension.properties.type,\n description: extension.properties.typeDescription,\n }));\n return {\n filteredItems: [...acc.filteredItems, ...items].sort((item1, item2) =>\n item1.name.localeCompare(item2.name),\n ),\n viewAllLinks: [...acc.viewAllLinks, ...viewAllLink],\n catalogItemTypes: [...acc.catalogItemTypes, ...catalogItemTypes],\n };\n },\n { filteredItems: [], viewAllLinks: [], catalogItemTypes: [] },\n );\n },\n [isLimitedList, namespace, quickSearchProviders, t],\n );\n\n React.useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n const { nodeName } = e.target as Element;\n if (nodeName === 'INPUT' || nodeName === 'TEXTAREA') {\n return;\n }\n\n if (!disableKeyboardOpen && e.code === 'Space' && e.ctrlKey) {\n e.preventDefault();\n setIsOpen(true);\n }\n };\n\n window.addEventListener('keydown', onKeyDown);\n\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n };\n }, [setIsOpen, disableKeyboardOpen]);\n\n return (\n <QuickSearchModal\n limitItemCount={limitItemCount}\n icon={icon}\n isOpen={isOpen}\n closeModal={() => setIsOpen(false)}\n namespace={namespace}\n searchPlaceholder={searchPlaceholder}\n allCatalogItemsLoaded={allItemsLoaded}\n searchCatalog={searchCatalog}\n viewContainer={viewContainer}\n detailsRenderer={detailsRenderer}\n />\n );\n};\n\nexport default QuickSearchController;\n","export { default as CatalogCategories } from './CatalogCategories';\nexport { default as CatalogEmptyState } from './CatalogEmptyState';\nexport { default as CatalogGrid } from './CatalogGrid';\nexport { default as CatalogToolbar } from './CatalogToolbar';\nexport { default as CatalogTypeSelector } from './CatalogTypeSelector';\nexport { default as CatalogView } from './CatalogView';\n","export * from './OverviewPage';\nexport * from './Markdown';\n","export * from './OverviewDetailItem';\n","import * as React from 'react';\nimport * as classNames from 'classnames';\n\nimport './OverviewDetailItem.scss';\n\nexport type OverviewDetailItemProps = {\n /** Details card title */\n title: string;\n children: React.ReactNode;\n /** Trigger skeleton loading component during the loading phase. */\n isLoading?: boolean;\n /** Value for a className */\n valueClassName?: string;\n\n error?: string;\n};\n\nexport const OverviewDetailItem: React.FC<OverviewDetailItemProps> = ({\n title,\n isLoading = false,\n children,\n error,\n valueClassName,\n}) => {\n let status: React.ReactNode;\n\n if (error) {\n status = <span className=\"text-secondary\">{error}</span>;\n } else if (isLoading) {\n status = <div className=\"skeleton-text\" />;\n } else {\n status = children;\n }\n return (\n <>\n <dt className=\"co-overview-details-card__item-title\" data-test=\"detail-item-title\">\n {title}\n </dt>\n <dd\n className={classNames('co-overview-details-card__item-value', valueClassName)}\n data-test=\"detail-item-value\"\n >\n {status}\n </dd>\n </>\n );\n};\n","export * from './MarkdownView';\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport * as React from 'react';\nimport * as cx from 'classnames';\nimport * as _ from 'lodash';\nimport * as sanitizeHtml from 'sanitize-html';\nimport { Converter, ShowdownOptions, ShowdownExtension } from 'showdown';\nimport { useForceRender, useResizeObserver } from '../../hooks';\n\nimport './MarkdownView.scss';\n\nconst tableTags = ['table', 'thead', 'tbody', 'tr', 'th', 'td'];\n\nconst markdownConvert = (\n markdown: string,\n extensions: ShowdownExtension[],\n options: ShowdownOptions = {},\n) => {\n const converter = new Converter({\n tables: true,\n openLinksInNewWindow: true,\n strikethrough: true,\n emoji: true,\n });\n\n for (const [key, value] of Object.entries(options)) {\n converter.setOption(key, value);\n }\n\n extensions && converter.addExtension(extensions);\n\n return sanitizeHtml(converter.makeHtml(markdown), {\n allowedTags: [\n 'b',\n 'i',\n 'strike',\n 's',\n 'del',\n 'em',\n 'strong',\n 'a',\n 'p',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'ul',\n 'ol',\n 'li',\n 'code',\n 'pre',\n 'button',\n 'span',\n 'div',\n ...tableTags,\n ],\n allowedAttributes: {\n a: ['href', 'target', 'rel'],\n button: ['class'],\n i: ['class'],\n div: ['class'],\n span: ['class'],\n pre: ['class'],\n code: ['class'],\n '*': ['data-*'],\n },\n allowedSchemes: ['http', 'https', 'mailto'],\n transformTags: {\n a: sanitizeHtml.simpleTransform('a', { rel: 'noopener noreferrer' }, true),\n },\n });\n};\n\nexport type MarkdownProps = {\n content?: string;\n emptyMsg: string;\n exactHeight?: boolean;\n truncateContent?: boolean;\n extensions?: ShowdownExtension[];\n renderExtension?: (contentDocument: Document, rootSelector: string) => React.ReactNode;\n inline?: boolean;\n options?: ShowdownOptions;\n theme?: string;\n updateThemeClass?: (htmlTagElement: HTMLElement, theme: string) => void;\n};\n\ntype InnerSyncMarkdownProps = Pick<\n MarkdownProps,\n 'renderExtension' | 'exactHeight' | 'theme' | 'updateThemeClass'\n> & {\n markup: string;\n isEmpty: boolean;\n};\n\nexport const MarkdownView: React.FC<MarkdownProps> = ({\n truncateContent,\n content,\n emptyMsg,\n extensions,\n renderExtension,\n exactHeight,\n inline,\n options,\n theme,\n updateThemeClass,\n}) => {\n const markup = React.useMemo(() => {\n const truncatedContent = truncateContent\n ? _.truncate(content, {\n length: 256,\n separator: ' ',\n omission: '\\u2026',\n })\n : content;\n return markdownConvert(truncatedContent || emptyMsg, extensions, options);\n }, [content, emptyMsg, extensions, options, truncateContent]);\n const innerProps: InnerSyncMarkdownProps = {\n renderExtension: extensions?.length > 0 ? renderExtension : undefined,\n exactHeight,\n markup,\n isEmpty: !content,\n theme,\n updateThemeClass,\n };\n return inline ? <InlineMarkdownView {...innerProps} /> : <IFrameMarkdownView {...innerProps} />;\n};\n\ntype RenderExtensionProps = {\n renderExtension: (contentDocument: Document, rootSelector: string) => React.ReactNode;\n selector: string;\n markup: string;\n docContext?: Document;\n};\n\nconst RenderExtension: React.FC<RenderExtensionProps> = ({\n renderExtension,\n selector,\n markup,\n docContext,\n}) => {\n const forceRender = useForceRender();\n const markupRef = React.useRef<string>(null);\n const shouldRenderExtension = React.useCallback(() => {\n if (markupRef.current === markup) {\n return true;\n }\n markupRef.current = markup;\n return false;\n }, [markup]);\n /**\n * During a render cycle where markup changes, renderExtension receives an old copy of document\n * because react is still updating the dom using dangerouslySetInnerHTML with latest markdown markup.\n * Use forceRender to delay the rendering of the extension by one render cycle.\n */\n React.useEffect(() => {\n renderExtension && forceRender();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [markup]);\n return (\n <>{shouldRenderExtension() ? renderExtension?.(docContext ?? document, selector) : null}</>\n );\n};\n\nconst InlineMarkdownView: React.FC<InnerSyncMarkdownProps> = ({\n markup,\n isEmpty,\n renderExtension,\n}) => {\n const id = React.useMemo(() => _.uniqueId('markdown'), []);\n return (\n <div className={cx('co-markdown-view', { 'is-empty': isEmpty })} id={id}>\n {/* eslint-disable-next-line react/no-danger */}\n <div dangerouslySetInnerHTML={{ __html: markup }} />\n <RenderExtension renderExtension={renderExtension} selector={`#${id}`} markup={markup} />\n </div>\n );\n};\n\nconst IFrameMarkdownView: React.FC<InnerSyncMarkdownProps> = ({\n exactHeight,\n markup,\n isEmpty,\n renderExtension,\n theme,\n updateThemeClass,\n}) => {\n const [frame, setFrame] = React.useState<HTMLIFrameElement>();\n const [frameHeight, setFrameHeight] = React.useState(0);\n const [loaded, setLoaded] = React.useState(false);\n const htmlTagElement = frame?.contentDocument?.documentElement;\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const updateDimensions = React.useCallback(\n _.debounce(() => {\n if (!frame?.contentWindow?.document?.body?.firstElementChild) {\n return;\n }\n setFrameHeight(\n frame.contentWindow.document.body.firstElementChild.scrollHeight + (exactHeight ? 0 : 15),\n );\n }, 100),\n [frame, exactHeight],\n );\n\n const onLoad = React.useCallback(() => {\n if (htmlTagElement && updateThemeClass) {\n updateThemeClass(htmlTagElement, theme);\n }\n updateDimensions();\n setLoaded(true);\n }, [htmlTagElement, theme, updateDimensions, updateThemeClass]);\n\n React.useEffect(() => {\n if (htmlTagElement && updateThemeClass) {\n updateThemeClass(htmlTagElement, theme);\n }\n }, [frame, htmlTagElement, theme, updateThemeClass]);\n\n useResizeObserver(updateDimensions, frame);\n\n // Find the app's stylesheets and inject them into the frame to ensure consistent styling.\n const filteredLinks = Array.from(document.getElementsByTagName('link')).filter((l) =>\n _.includes(l.href, 'app-bundle'),\n );\n\n const linkRefs = _.reduce(\n filteredLinks,\n (refs, link) => `${refs}\n <link rel=\"stylesheet\" href=\"${link.href}\">`,\n '',\n );\n\n const contents = `\n ${linkRefs}\n <style type=\"text/css\">\n body {\n background-color: transparent !important;\n color: ${isEmpty ? '#999' : '#333'};\n font-family: var(--pf-v5-global--FontFamily--text);\n min-width: auto !important;\n }\n table {\n display: block;\n margin-bottom: 11.5px;\n overflow-x: auto;\n }\n td,\n th {\n border-bottom: var(--pf-v5-global--BorderWidth--sm) solid var(--pf-v5-global--BorderColor--300);\n padding: 10px;\n vertical-align: top;\n }\n th {\n padding-top: 0;\n }\n </style>\n <body class=\"pf-m-redhat-font pf-v5-c-content co-iframe\"><div style=\"overflow-y: auto;\">${markup}</div></body>`;\n return (\n <>\n <iframe\n title={_.uniqueId('markdown-view')}\n sandbox=\"allow-popups allow-popups-to-escape-sandbox allow-same-origin\"\n srcDoc={contents}\n style={{ border: '0px', display: 'block', width: '100%', height: frameHeight }}\n ref={setFrame}\n onLoad={onLoad}\n />\n {loaded && frame && (\n <RenderExtension\n markup={markup}\n selector={''}\n renderExtension={renderExtension}\n docContext={frame.contentDocument}\n />\n )}\n </>\n );\n};\n","export * from './prometheus';\n","export { default as CatalogDetailsModal } from './CatalogDetailsModal';\nexport { default as CatalogDetailsPanel } from './CatalogDetailsPanel';\n","export { default as useCatalogExtensions } from './useCatalogExtensions';\nexport { default as useCatalogCategories } from './useCatalogCategories';\nexport { default as useCtaLink } from './useCtaLink';\n","import * as React from 'react';\nimport { defaultCatalogCategories } from '../../../utils/default-categories';\nimport { CatalogCategory } from '../utils/types';\n\nconst useCatalogCategories = (): CatalogCategory[] => {\n const categories = React.useMemo<CatalogCategory[]>(() => {\n try {\n const categoriesString = window.SERVER_FLAGS.developerCatalogCategories;\n if (!categoriesString) {\n return defaultCatalogCategories;\n }\n\n const categoriesArray: CatalogCategory[] = JSON.parse(categoriesString);\n\n if (!Array.isArray(categoriesArray)) {\n // eslint-disable-next-line no-console\n console.error(\n `Unexpected server flag \"developerCatalogCategories\" format. Expected array, got ${typeof categoriesArray}:`,\n categoriesArray,\n );\n return defaultCatalogCategories;\n }\n\n return categoriesArray;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Could not parse server flag \"developerCatalogCategories\":', error);\n return defaultCatalogCategories;\n }\n }, []);\n\n return categories;\n};\n\nexport default useCatalogCategories;\n","export { default as CatalogExtensionHookResolver } from './CatalogExtensionHookResolver';\nexport { default as CatalogServiceProvider } from './CatalogServiceProvider';\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport {\n CatalogExtensionHookOptions,\n CatalogItem,\n CatalogItemMetadataProviderFunction,\n} from '@console/dynamic-plugin-sdk/src/extensions';\nimport { IncompleteDataError } from '@console/dynamic-plugin-sdk/src/utils/error/http-error';\nimport useCatalogExtensions from '../hooks/useCatalogExtensions';\nimport { CatalogService } from '../utils';\nimport {\n keywordCompare,\n applyCatalogItemMetadata,\n useGetAllDisabledSubCatalogs,\n} from '../utils/catalog-utils';\nimport CatalogExtensionHookResolver from './CatalogExtensionHookResolver';\n\ntype CatalogServiceProviderProps = {\n namespace: string;\n catalogId: string;\n catalogType?: string;\n showAlreadyLoadedItemsAfter?: number;\n children: (service: CatalogService) => React.ReactNode;\n};\n\n/**\n * Return false until the given timeout time is up, then true.\n * Restarts the timer when the timeout changes.\n */\nconst useTimeout = (timeout: number) => {\n const [timeIsUp, setTimeIsUp] = React.useState(false);\n React.useEffect(() => {\n const t = timeout > 0 ? setTimeout(() => setTimeIsUp(true), timeout) : null;\n return () => clearTimeout(t);\n }, [timeout]);\n return timeIsUp;\n};\n\nconst CatalogServiceProvider: React.FC<CatalogServiceProviderProps> = ({\n namespace,\n catalogId,\n catalogType,\n showAlreadyLoadedItemsAfter = 3000,\n children,\n}) => {\n const defaultOptions: CatalogExtensionHookOptions = { namespace };\n const [\n catalogTypeExtensions,\n catalogProviderExtensions,\n catalogFilterExtensions,\n catalogBadgeProviderExtensions,\n extensionsResolved,\n ] = useCatalogExtensions(catalogId, catalogType);\n const [disabledSubCatalogs] = useGetAllDisabledSubCatalogs();\n const [extItemsMap, setExtItemsMap] = React.useState<{ [uid: string]: CatalogItem[] }>({});\n const [extItemsErrorMap, setItemsErrorMap] = React.useState<{ [uid: string]: Error }>({});\n const [metadataProviderMap, setMetadataProviderMap] = React.useState<{\n [type: string]: { [id: string]: CatalogItemMetadataProviderFunction };\n }>({});\n\n const showAlreadyLoadedItems = useTimeout(showAlreadyLoadedItemsAfter);\n\n const loaded =\n extensionsResolved &&\n (catalogProviderExtensions.length === 0 ||\n (showAlreadyLoadedItems\n ? catalogProviderExtensions.some(({ uid }) => extItemsMap[uid] || extItemsErrorMap[uid])\n : catalogProviderExtensions.every(({ uid }) => extItemsMap[uid] || extItemsErrorMap[uid])));\n\n const enabledCatalogProviderExtensions = catalogProviderExtensions.filter((item) => {\n return !disabledSubCatalogs?.includes(item?.properties?.type);\n });\n const preCatalogItems = React.useMemo(() => {\n if (!loaded) {\n return [];\n }\n\n const itemMap = _.flatten(\n enabledCatalogProviderExtensions.map((e) =>\n catalogFilterExtensions\n .filter((fe) => fe.properties.type === e.properties.type)\n .reduce((acc, ext) => acc.filter(ext.properties.filter), extItemsMap[e.uid] ?? []),\n ),\n ).reduce((acc, item) => {\n if (!item) return acc;\n acc[item.uid] = item;\n return acc;\n }, {} as { [uid: string]: CatalogItem });\n\n return _.sortBy(Object.values(itemMap), 'name');\n }, [extItemsMap, loaded, enabledCatalogProviderExtensions, catalogFilterExtensions]);\n\n const catalogItems = React.useMemo(() => {\n if (!loaded) {\n return preCatalogItems;\n }\n return applyCatalogItemMetadata(preCatalogItems, metadataProviderMap);\n }, [loaded, preCatalogItems, metadataProviderMap]);\n\n const onValueResolved = React.useCallback((items, uid) => {\n setExtItemsMap((prev) => ({ ...prev, [uid]: items }));\n }, []);\n\n const onValueError = React.useCallback((error, uid) => {\n setItemsErrorMap((prev) => ({ ...prev, [uid]: error }));\n }, []);\n\n const onMetadataValueResolved = React.useCallback((provider, uid, type) => {\n setMetadataProviderMap((prev) => ({\n ...prev,\n [type]: { ...(prev?.[type] ?? {}), [uid]: provider },\n }));\n }, []);\n\n const searchCatalog = React.useCallback(\n (query: string) => {\n return keywordCompare(query, catalogItems);\n },\n [catalogItems],\n );\n\n const catalogItemsMap = React.useMemo(() => {\n const result: { [type: string]: CatalogItem[] } = {};\n catalogProviderExtensions.forEach((e) => {\n result[e.properties.type] = [];\n });\n catalogItems.forEach((item) => {\n result[item.type].push(item);\n });\n return result;\n }, [catalogProviderExtensions, catalogItems]);\n\n const failedExtensions = [\n ...new Set(\n catalogProviderExtensions\n .filter(({ uid }) => extItemsErrorMap[uid])\n .map((e) => e.properties.title),\n ),\n ];\n\n const failedCalls = catalogProviderExtensions.filter(({ uid }) => extItemsErrorMap[uid]).length;\n const totalCalls = catalogProviderExtensions.length;\n const loadError =\n !loaded || failedCalls === 0\n ? null\n : failedCalls === totalCalls\n ? new Error('failed loading catalog data')\n : new IncompleteDataError(failedExtensions);\n\n const catalogService: CatalogService = {\n type: catalogType,\n items: catalogItems,\n itemsMap: catalogItemsMap,\n loaded,\n loadError,\n searchCatalog,\n catalogExtensions: catalogTypeExtensions,\n };\n\n return (\n <>\n {extensionsResolved &&\n catalogProviderExtensions.map((extension) => (\n <CatalogExtensionHookResolver<CatalogItem[]>\n key={extension.uid}\n id={extension.uid}\n useValue={extension.properties.provider}\n options={defaultOptions}\n onValueResolved={onValueResolved}\n onValueError={onValueError}\n />\n ))}\n {extensionsResolved &&\n catalogBadgeProviderExtensions.map((extension) => (\n <CatalogExtensionHookResolver<CatalogItemMetadataProviderFunction>\n key={extension.uid}\n id={extension.uid}\n useValue={extension.properties.provider}\n options={defaultOptions}\n onValueResolved={(value, uid) =>\n onMetadataValueResolved(value, uid, extension.properties.type)\n }\n />\n ))}\n {children(catalogService)}\n </>\n );\n};\n\nexport default CatalogServiceProvider;\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport Helmet from 'react-helmet';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation } from 'react-router-dom-v5-compat';\nimport { ResolvedExtension, CatalogItemType } from '@console/dynamic-plugin-sdk';\nimport { CatalogItem, CatalogItemAttribute } from '@console/dynamic-plugin-sdk/src/extensions';\nimport {\n PageHeading,\n skeletonCatalog,\n StatusBox,\n removeQueryArgument,\n setQueryArgument,\n} from '@console/internal/components/utils';\nimport { useQueryParams } from '../../hooks';\nimport CatalogView from './catalog-view/CatalogView';\nimport CatalogTile from './CatalogTile';\nimport CatalogDetailsModal from './details/CatalogDetailsModal';\nimport { getURLWithParams, useGetAllDisabledSubCatalogs } from './utils/catalog-utils';\nimport { determineAvailableFilters } from './utils/filter-utils';\nimport {\n CatalogCategory,\n CatalogFilters,\n CatalogQueryParams,\n CatalogService,\n CatalogStringMap,\n CatalogType,\n CatalogFilterGroupMap,\n} from './utils/types';\n\ntype CatalogControllerProps = CatalogService & {\n enableDetailsPanel?: boolean;\n hideSidebar?: boolean;\n title: string;\n description: string;\n categories?: CatalogCategory[];\n};\n\nconst CatalogController: React.FC<CatalogControllerProps> = ({\n type,\n items,\n itemsMap,\n loaded,\n loadError,\n catalogExtensions,\n enableDetailsPanel,\n title: defaultTitle,\n description: defaultDescription,\n hideSidebar,\n categories,\n}) => {\n const { t } = useTranslation();\n const { pathname } = useLocation();\n const queryParams = useQueryParams();\n const [disabledSubCatalogs] = useGetAllDisabledSubCatalogs();\n\n const typeExtension: ResolvedExtension<CatalogItemType> = React.useMemo(\n () => catalogExtensions?.find((extension) => extension.properties.type === type),\n [catalogExtensions, type],\n );\n\n const title = typeExtension?.properties?.title ?? defaultTitle;\n const getCatalogTypeDescription = () => {\n if (typeof typeExtension?.properties?.catalogDescription === 'string') {\n return typeExtension?.properties?.catalogDescription;\n }\n if (typeof typeExtension?.properties?.catalogDescription === 'function') {\n return typeExtension?.properties?.catalogDescription();\n }\n return defaultDescription;\n };\n\n const filterGroups: string[] = React.useMemo(() => {\n return (\n typeExtension?.properties.filters?.map((filter: CatalogItemAttribute) => filter.attribute) ??\n []\n );\n }, [typeExtension]);\n\n const filterGroupMap: CatalogFilterGroupMap = React.useMemo(() => {\n return (\n typeExtension?.properties.filters?.reduce((map, filter: CatalogItemAttribute) => {\n map[filter.attribute] = filter;\n return map;\n }, {}) ?? {}\n );\n }, [typeExtension]);\n\n const groupings: CatalogStringMap = React.useMemo(() => {\n return (\n typeExtension?.properties.groupings?.reduce((map, group: CatalogItemAttribute) => {\n map[group.attribute] = group.label;\n return map;\n }, {}) ?? {}\n );\n }, [typeExtension]);\n\n const breadcrumbs = React.useMemo(() => {\n const categoryParam = queryParams.get(CatalogQueryParams.CATEGORY);\n const keywordParam = queryParams.get(CatalogQueryParams.KEYWORD);\n const sortParam = queryParams.get(CatalogQueryParams.SORT_ORDER);\n const params = new URLSearchParams({\n ...(categoryParam ? { [CatalogQueryParams.CATEGORY]: categoryParam } : {}),\n ...(keywordParam ? { [CatalogQueryParams.KEYWORD]: keywordParam } : {}),\n ...(sortParam ? { [CatalogQueryParams.SORT_ORDER]: sortParam } : {}),\n });\n const crumbs = [\n {\n name: t('console-shared~Developer Catalog'),\n path: `${pathname}?${params.toString()}`,\n },\n ];\n\n if (type) {\n crumbs.push({\n name: title,\n path: `${pathname}?${CatalogQueryParams.TYPE}=${type}`,\n });\n }\n\n return crumbs;\n }, [pathname, queryParams, t, title, type]);\n\n const selectedItem = React.useMemo(() => {\n const selectedId = queryParams.get(CatalogQueryParams.SELECTED_ID);\n return items.find((it) => selectedId === it.uid);\n }, [items, queryParams]);\n\n const catalogTypes: CatalogType[] = React.useMemo(() => {\n const types = catalogExtensions\n .map((extension) => ({\n label: extension.properties.title,\n value: extension.properties.type,\n description: extension.properties.typeDescription,\n }))\n .filter((extension) => !disabledSubCatalogs?.includes(extension.value));\n\n return _.sortBy(types, ({ label }) => label.toLowerCase());\n }, [catalogExtensions, disabledSubCatalogs]);\n\n const catalogItems = React.useMemo(() => (type ? itemsMap[type] : items), [\n items,\n itemsMap,\n type,\n ]);\n\n const availableFilters: CatalogFilters = React.useMemo(\n () => determineAvailableFilters({}, catalogItems, filterGroups),\n [catalogItems, filterGroups],\n );\n\n const openDetailsPanel = React.useCallback((item: CatalogItem): void => {\n setQueryArgument(CatalogQueryParams.SELECTED_ID, item.uid);\n }, []);\n\n const closeDetailsPanel = React.useCallback((): void => {\n removeQueryArgument(CatalogQueryParams.SELECTED_ID);\n }, []);\n\n const renderTile = React.useCallback(\n (item: CatalogItem) => (\n <CatalogTile\n item={item}\n catalogTypes={catalogTypes}\n onClick={\n enableDetailsPanel\n ? openDetailsPanel\n : item.cta?.callback\n ? () => item.cta.callback()\n : null\n }\n href={\n !enableDetailsPanel\n ? item.cta?.href\n : getURLWithParams(CatalogQueryParams.SELECTED_ID, item.uid)\n }\n />\n ),\n [catalogTypes, openDetailsPanel, enableDetailsPanel],\n );\n\n return (\n <>\n <Helmet>\n <title>{title}</title>\n </Helmet>\n <div className=\"co-m-page__body\">\n <div className=\"co-catalog\">\n <PageHeading title={title} breadcrumbs={type ? breadcrumbs : null} />\n <p data-test-id=\"catalog-page-description\" className=\"co-catalog-page__description\">\n {getCatalogTypeDescription()}\n </p>\n <div className=\"co-catalog__body\">\n <StatusBox\n skeleton={skeletonCatalog}\n data={items}\n loaded={loaded}\n loadError={loadError}\n label={t('console-shared~Catalog items')}\n >\n <CatalogView\n catalogType={type}\n catalogTypes={catalogTypes}\n items={catalogItems}\n categories={categories}\n filters={availableFilters}\n filterGroups={filterGroups}\n filterGroupMap={filterGroupMap}\n groupings={groupings}\n renderTile={renderTile}\n hideSidebar={hideSidebar}\n />\n <CatalogDetailsModal item={selectedItem} onClose={closeDetailsPanel} />\n </StatusBox>\n </div>\n </div>\n </div>\n </>\n );\n};\n\nexport default CatalogController;\n","export { default as ProgressiveList } from './ProgressiveList';\nexport { default as ProgressiveListFooter } from './ProgressiveListFooter';\nexport { default as ProgressiveListItem } from './ProgressiveListItem';\n","import * as React from 'react';\nimport ProgressiveListFooter from './ProgressiveListFooter';\nimport ProgressiveListItem from './ProgressiveListItem';\n\ntype ProgressiveListProps = {\n visibleItems: string[];\n onVisibleItemChange: (item: string) => void;\n Footer: (children) => React.ReactElement;\n};\n\nconst ProgressiveList: React.FC<ProgressiveListProps> = ({\n visibleItems,\n children,\n onVisibleItemChange,\n Footer,\n}) => {\n const items: string[] = [];\n const validChildren: React.ReactNode[] = React.Children.toArray(children).filter(\n (child: React.ReactElement) => {\n const { name } = child.props;\n const validChild = child.type === ProgressiveListItem;\n const isNameInVisibleItems = visibleItems.includes(name);\n if (validChild && !isNameInVisibleItems) items.push(name);\n return validChild;\n },\n );\n return (\n <>\n {visibleItems.map((item: string) => (\n <React.Fragment key={item}>\n {validChildren.find(({ props }: React.ReactElement) => item === props.name)}\n </React.Fragment>\n ))}\n <ProgressiveListFooter Footer={Footer} items={items} onShowItem={onVisibleItemChange} />\n </>\n );\n};\n\nexport default ProgressiveList;\n","export * from './pod';\nexport * from './resource';\nexport * from './route-params';\nexport * from './tableColumn';\n","export * from './nodes';\nexport * from './pvc';\nexport * from './snapshot';\n","import { SortByDirection } from '@patternfly/react-table';\nimport { isCSRResource } from '@console/app/src/components/nodes/csr';\nimport * as UIActions from '@console/internal/actions/ui';\nimport { sortResourceByValue } from '@console/internal/components/factory/Table/sort';\nimport { NodeCertificateSigningRequestKind, NodeKind } from '@console/internal/module/k8s';\nimport { getNodeUptime } from '@console/shared/src';\nimport { getNodeMachineName, getNodeRoles } from '../selectors/node';\n\nexport const nodeMemory = (node: NodeKind): number => {\n const used = UIActions.getNodeMetric(node, 'usedMemory');\n const total = UIActions.getNodeMetric(node, 'totalMemory');\n return total === 0 ? 0 : used / total;\n};\nexport const nodeFS = (node: NodeKind): number => {\n const used = UIActions.getNodeMetric(node, 'usedStorage');\n const total = UIActions.getNodeMetric(node, 'totalStorage');\n return total === 0 ? 0 : used / total;\n};\nexport const nodeCPU = (node: NodeKind): number => Number(UIActions.getNodeMetric(node, 'cpu'));\nexport const nodePods = (node: NodeKind): number => Number(UIActions.getNodeMetric(node, 'pods'));\nexport const nodeMachine = (node: NodeKind): string => getNodeMachineName(node);\nexport const nodeInstanceType = (node: NodeKind): string =>\n node.metadata.labels?.['beta.kubernetes.io/instance-type'];\nexport const nodeZone = (node: NodeKind): string =>\n node.metadata.labels?.['topology.kubernetes.io/zone'];\nexport const nodeUptime = (node: NodeKind): string => getNodeUptime(node);\n\nexport const nodeReadiness = (node: NodeKind) => {\n const readiness = node?.status?.conditions?.find((c) => c.type === 'Ready');\n return readiness?.status;\n};\n\nexport const nodeRoles = (node: NodeKind) => {\n const roles = getNodeRoles(node);\n return roles.sort().join(', ');\n};\n\nexport const sortWithCSRResource = <D>(getter: (obj: NodeKind) => D, csrDefaultValue: D) => (\n data: (NodeKind | NodeCertificateSigningRequestKind)[],\n direction: SortByDirection,\n) => {\n return data.sort(\n sortResourceByValue<NodeKind>(direction, (obj) => {\n const val = isCSRResource(obj) ? csrDefaultValue : getter(obj);\n return val;\n }),\n );\n};\n","import * as UIActions from '@console/internal/actions/ui';\nimport { K8sResourceCommon } from '@console/internal/module/k8s';\n\nexport const pvcUsed = (pvc: K8sResourceCommon): number =>\n UIActions.getPVCMetric(pvc, 'usedCapacity');\n","import { convertToBaseValue } from '@console/internal/components/utils';\nimport { VolumeSnapshotKind } from '@console/internal/module/k8s';\n\nexport const snapshotSize = (snapshot: VolumeSnapshotKind): number => {\n const size = snapshot?.status?.restoreSize;\n return size ? convertToBaseValue(size) : 0;\n};\n\nexport const snapshotSource = (snapshot: VolumeSnapshotKind): string =>\n snapshot.spec?.source?.persistentVolumeClaimName ??\n snapshot.spec?.source?.volumeSnapshotContentName;\n","export * from './withPostFormSubmissionCallback';\nexport * from './withUserSettingsCompatibility';\nexport * from './withUserSettings';\nexport * from './withActivePerspective';\nexport * from './withTelemetry';\n","import * as React from 'react';\nimport { K8sResourceCommon } from '@console/internal/module/k8s';\nimport { usePostFormSubmitAction } from '../hooks/post-form-submit-action';\n\ntype WithPostFormSubmissionCallbackProps<R> = {\n postFormSubmissionCallback: (arg: R) => Promise<R>;\n};\n\nexport const withPostFormSubmissionCallback = <\n Props extends WithPostFormSubmissionCallbackProps<R>,\n R = K8sResourceCommon\n>(\n Component: React.ComponentType<Props>,\n): React.FC<Omit<Props, keyof WithPostFormSubmissionCallbackProps<R>>> => (props: Props) => {\n const postFormSubmissionCallback = usePostFormSubmitAction<R>();\n return <Component {...props} postFormSubmissionCallback={postFormSubmissionCallback} />;\n};\n","import * as React from 'react';\nimport { useUserSettingsCompatibility } from '../hooks';\n\nexport type WithUserSettingsCompatibilityProps<T> = {\n userSettingState: T;\n setUserSettingState: (v: T) => void;\n};\n\nexport const withUserSettingsCompatibility = <\n Props extends WithUserSettingsCompatibilityProps<T>,\n T = string\n>(\n configStorageKey: string,\n localStoragekey: string,\n defaultvalue?: T,\n sync: boolean = false,\n) => (\n WrappedComponent: React.ComponentType<Props>,\n): React.FC<Omit<Props, keyof WithUserSettingsCompatibilityProps<T>>> => {\n const Component = (props: Props) => {\n const [state, setState, loaded] = useUserSettingsCompatibility(\n configStorageKey,\n localStoragekey,\n defaultvalue,\n sync,\n );\n return loaded ? (\n <WrappedComponent {...props} userSettingState={state} setUserSettingState={setState} />\n ) : null;\n };\n Component.displayName = `withUserSettingsCompatibility(${\n WrappedComponent.displayName || WrappedComponent.name\n })`;\n return Component;\n};\n","import * as React from 'react';\nimport { useUserSettings } from '../hooks';\n\nexport type WithUserSettingsProps<T> = {\n userSettingState: T;\n setUserSettingState: (v: T) => void;\n};\n\nexport const withUserSettings = <Props extends WithUserSettingsProps<T>, T = string>(\n configStorageKey: string,\n defaultvalue?: T,\n) => (\n WrappedComponent: React.ComponentType<Props>,\n): React.FC<Omit<Props, keyof WithUserSettingsProps<T>>> => {\n const Component = (props: Props) => {\n const [state, setState, loaded] = useUserSettings(configStorageKey, defaultvalue);\n return loaded ? (\n <WrappedComponent {...props} userSettingState={state} setUserSettingState={setState} />\n ) : null;\n };\n Component.displayName = `withUserSettings(${\n WrappedComponent.displayName || WrappedComponent.name\n })`;\n return Component;\n};\n","import * as React from 'react';\nimport { PerspectiveType, useActivePerspective } from '@console/dynamic-plugin-sdk';\n\ntype WithActivePerspectiveProps = {\n activePerspective?: PerspectiveType;\n setActivePerspective?: React.Dispatch<React.SetStateAction<PerspectiveType>>;\n};\n\nexport const withActivePerspective = <Props extends WithActivePerspectiveProps>(\n Component: React.ComponentType<Props>,\n): React.FC<Omit<Props, keyof WithActivePerspectiveProps>> => (props: Props) => {\n const [activePerspective, setActivePerspective] = useActivePerspective();\n return (\n <Component\n {...props}\n activePerspective={activePerspective}\n setActivePerspective={setActivePerspective}\n />\n );\n};\n","import * as React from 'react';\nimport { useTelemetry } from '../hooks';\n\ntype WithTelemetryProps = {\n fireTelementryEvent: (eventType: string, properties: any) => void;\n};\n\nexport const withTelemetry = <Props extends WithTelemetryProps>(\n WrappedComponent: React.ComponentType<Props>,\n): React.FC<Omit<Props, keyof WithTelemetryProps>> => {\n const Component = (props: Props) => {\n const fireTelemetryEvent = useTelemetry();\n return <WrappedComponent {...props} fireTelemetryEvent={fireTelemetryEvent} />;\n };\n Component.displayName = `withTelemetry(${WrappedComponent.displayName || WrappedComponent.name})`;\n return Component;\n};\n","import {\n referenceForGroupVersionKind,\n referenceForModel,\n WatchK8sResources,\n} from '@console/internal/module/k8s';\nimport { ServiceBindingModel } from '@console/service-binding-plugin/src/models';\nimport { getBindableServicesList } from './fetch-bindable-services-utils';\n\nexport const getBindableServiceResources = (namespace: string): WatchK8sResources<any> => {\n const resources = {\n serviceBindingRequests: {\n namespace,\n kind: referenceForModel(ServiceBindingModel),\n isList: true,\n optional: true,\n prop: 'serviceBindingRequests',\n },\n ...getBindableServicesList().reduce(\n (acc, { group, version, kind }) => ({\n [kind]: {\n namespace,\n kind: referenceForGroupVersionKind(group)(version)(kind),\n isList: true,\n optional: true,\n prop: kind,\n },\n ...acc,\n }),\n {},\n ),\n };\n return resources;\n};\n","import { K8sKind } from '@console/internal/module/k8s';\n\nexport const BindableServicesModel: K8sKind = {\n apiGroup: 'binding.operators.coreos.com',\n apiVersion: 'v1alpha1',\n kind: 'BindableKinds',\n plural: 'bindablekinds',\n label: 'BindableKinds',\n // t('devconsole~BindableKinds')\n labelKey: 'BindableKinds',\n labelPlural: 'devconsole~BindableKinds',\n labelPluralKey: 'devconsole~BindableKinds',\n abbr: 'BK',\n crd: true,\n namespaced: false,\n};\n","import { K8sKind } from '@console/internal/module/k8s';\n\nexport const GitOpsServiceModel: K8sKind = {\n apiGroup: 'pipelines.openshift.io',\n apiVersion: 'v1alpha1',\n kind: 'GitopsService',\n id: 'gitopsservice',\n plural: 'gitopsservices',\n label: 'Gitops Service',\n labelPlural: 'Gitops Services',\n abbr: 'GS',\n namespaced: false,\n crd: true,\n};\n","export const NODE_STATUS_STARTING_MAINTENANCE = 'starting maintenance';\nexport const NODE_STATUS_UNDER_MAINTENANCE = 'under maintenance';\nexport const NODE_STATUS_STOPPING_MAINTENANCE = 'stopping maintenance';\n\n// t('metal3-plugin~Starting maintenance')\n// t('metal3-plugin~Under maintenance')\n// t('metal3-plugin~Stopping maintenance')\n\nexport const NODE_STATUS_TITLE_KEYS = {\n [NODE_STATUS_STARTING_MAINTENANCE]: 'metal3-plugin~Starting maintenance',\n [NODE_STATUS_UNDER_MAINTENANCE]: 'metal3-plugin~Under maintenance',\n [NODE_STATUS_STOPPING_MAINTENANCE]: 'metal3-plugin~Stopping maintenance',\n};\n","import * as _ from 'lodash';\nimport { K8sResourceKind } from '@console/internal/module/k8s';\n\nexport const getNodeMaintenanceNodeName = (nodeMaintenance: K8sResourceKind): string =>\n _.get(nodeMaintenance, 'spec.nodeName');\nexport const getNodeMaintenanceReason = (nodeMaintenance: K8sResourceKind): string =>\n _.get(nodeMaintenance, 'spec.reason');\nexport const getNodeMaintenancePhase = (nodeMaintenance: K8sResourceKind): string =>\n _.get(nodeMaintenance, 'status.phase');\nexport const getNodeMaintenanceLastError = (nodeMaintenance: K8sResourceKind): string =>\n _.get(nodeMaintenance, 'status.lastError');\nexport const getNodeMaintenancePendingPods = (nodeMaintenance: K8sResourceKind): string[] =>\n _.get(nodeMaintenance, 'status.pendingPods', []);\nexport const getNodeMaintenanceProgressPercent = (nodeMaintenance: K8sResourceKind): number => {\n if (!nodeMaintenance.status) return 0;\n const pendingPods = _.get(nodeMaintenance, 'status.pendingPods', []);\n const evictionPods = _.get(nodeMaintenance, 'status.evictionPods', 0);\n if (evictionPods === 0) return 100;\n return (Math.max(evictionPods - pendingPods.length, 0) / evictionPods) * 100;\n};\n// TODO(jtomasek): Move this into console-shared/src/selectors/common.ts\nexport const getNodeMaintenanceCreationTimestamp = <A extends K8sResourceKind = K8sResourceKind>(\n value: A,\n) => _.get(value, 'metadata.creationTimestamp') as K8sResourceKind['metadata']['creationTimestamp'];\n\nexport const findNodeMaintenance = (nodeMaintenances: K8sResourceKind[], nodeName: string) =>\n (nodeMaintenances || []).find(\n (nodeMaintenance) => getNodeMaintenanceNodeName(nodeMaintenance) === nodeName,\n );\n","import * as _ from 'lodash';\nimport { MachineKind } from '@console/internal/module/k8s';\nimport { getName } from '@console/shared/src/selectors/common';\nimport {\n HOST_POWER_STATUS_POWERED_ON,\n HOST_POWER_STATUS_POWERING_OFF,\n HOST_POWER_STATUS_POWERING_ON,\n HOST_POWER_STATUS_POWERED_OFF,\n HOST_STATUS_UNMANAGED,\n} from '../constants';\nimport {\n BareMetalHostDisk,\n BareMetalHostNIC,\n BareMetalHostCPU,\n BareMetalHostSystemVendor,\n BareMetalHostBios,\n BareMetalHostKind,\n} from '../types';\n\nconst ANNOTATION_HOST_RESTART = 'reboot.metal3.io';\n\nexport const getHostOperationalStatus = (host: BareMetalHostKind): string =>\n _.get(host, 'status.operationalStatus');\nexport const getHostErrorType = (host: BareMetalHostKind): string => host.status?.errorType;\nexport const getHostProvisioningState = (host: BareMetalHostKind): string =>\n _.get(host, 'status.provisioning.state');\nexport const getHostMachineName = (host: BareMetalHostKind): string =>\n _.get(host, 'spec.consumerRef.name');\nexport const getHostBMCAddress = (host: BareMetalHostKind): string =>\n _.get(host, 'spec.bmc.address');\nexport const getHostDisableCertificateVerification = (host: BareMetalHostKind): boolean =>\n _.get(host, 'spec.bmc.disableCertificateVerification', false);\nexport const getHostBootMACAddress = (host: BareMetalHostKind) =>\n _.get(host, 'spec') && host.spec.bootMACAddress;\nexport const isHostOnline = (host: BareMetalHostKind): boolean => _.get(host, 'spec.online', false);\nexport const getHostNICs = (host: BareMetalHostKind): BareMetalHostNIC[] =>\n _.get(host, 'status.hardware.nics', []);\nexport const getHostStorage = (host: BareMetalHostKind): BareMetalHostDisk[] =>\n _.get(host, 'status.hardware.storage', []);\nexport const getHostCPU = (host: BareMetalHostKind): BareMetalHostCPU =>\n _.get(host, 'status.hardware.cpu', {});\nexport const getHostRAMMiB = (host: BareMetalHostKind): number =>\n _.get(host, 'status.hardware.ramMebibytes');\nexport const getHostErrorMessage = (host: BareMetalHostKind): string =>\n _.get(host, 'status.errorMessage');\nexport const getHostDescription = (host: BareMetalHostKind): string =>\n _.get(host, 'spec.description', '');\nexport const isHostPoweredOn = (host: BareMetalHostKind): boolean =>\n _.get(host, 'status.poweredOn', false);\nexport const hasRebootAnnotation = (host: BareMetalHostKind): string =>\n Object.keys(host?.metadata?.annotations || {}).find(\n (annotation) => annotation === ANNOTATION_HOST_RESTART,\n );\nexport const getPoweroffAnnotation = (host: BareMetalHostKind): string =>\n Object.keys(host?.metadata?.annotations || {}).find((annotation) =>\n annotation.startsWith(`${ANNOTATION_HOST_RESTART}/`),\n );\nexport const isHostScheduledForRestart = (host: BareMetalHostKind) =>\n !!hasRebootAnnotation(host) && isHostPoweredOn(host);\n\nexport const getHostPowerStatus = (host: BareMetalHostKind): string => {\n const isOnline = isHostOnline(host);\n const isPoweredOn = isHostPoweredOn(host);\n const poweroffAnnotation = getPoweroffAnnotation(host);\n if (isOnline && isPoweredOn && !poweroffAnnotation) return HOST_POWER_STATUS_POWERED_ON;\n if ((!isOnline || poweroffAnnotation) && isPoweredOn) return HOST_POWER_STATUS_POWERING_OFF;\n if (isOnline && !isPoweredOn && !poweroffAnnotation) return HOST_POWER_STATUS_POWERING_ON;\n return HOST_POWER_STATUS_POWERED_OFF;\n};\nexport const getHostVendorInfo = (host: BareMetalHostKind): BareMetalHostSystemVendor =>\n _.get(host, 'status.hardware.systemVendor', {});\nexport const getHostTotalStorageCapacity = (host: BareMetalHostKind): number =>\n _.reduce(\n getHostStorage(host),\n (sum: number, disk: BareMetalHostDisk): number => sum + disk.sizeBytes,\n 0,\n );\nexport const getHostBios = (host: BareMetalHostKind): BareMetalHostBios =>\n _.get(host, 'status.hardware.firmware.bios');\n\nexport const getHostMachine = (\n host: BareMetalHostKind,\n machines: MachineKind[] = [],\n): MachineKind =>\n machines.find((machine: MachineKind) => getHostMachineName(host) === getName(machine));\n\nexport const hasPowerManagement = (host: BareMetalHostKind): boolean =>\n getHostProvisioningState(host) !== HOST_STATUS_UNMANAGED;\n","import { K8sKind } from '@console/internal/module/k8s';\n\nexport const ApplicationModel: K8sKind = {\n id: 'application',\n kind: 'application',\n plural: 'applications',\n label: 'Application',\n labelPlural: 'Applications',\n abbr: 'A',\n apiGroup: '',\n apiVersion: '',\n namespaced: true,\n crd: false,\n};\n","import * as React from 'react';\nimport { isCreateResource, CreateResource, GroupVersionKind } from '@console/dynamic-plugin-sdk';\nimport { referenceForExtensionModel } from '@console/internal/module/k8s';\nimport { Extension, LoadedExtension, useExtensions } from '@console/plugin-sdk';\n\nexport const useCreateResourceExtension = (\n modelReference: GroupVersionKind,\n): LoadedExtension<CreateResource> => {\n const createResourceTypeGuard = React.useCallback(\n (e: Extension): e is CreateResource =>\n isCreateResource(e) && referenceForExtensionModel(e.properties.model) === modelReference,\n [modelReference],\n );\n const [extensionPage] = useExtensions<CreateResource>(createResourceTypeGuard);\n return extensionPage;\n};\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport StepComponent from './StepComponent';\nimport { TourContext } from './tour-context';\n\nconst GuidedTour: React.FC = () => {\n const { tourState, tour, totalSteps, onComplete } = React.useContext(TourContext);\n const { t } = useTranslation();\n if (!tour) return null;\n const { intro, steps, end } = tour;\n const { stepNumber, startTour, completedTour } = tourState;\n\n if (completedTour) {\n onComplete();\n return null;\n }\n if (startTour || stepNumber === 0)\n return (\n <StepComponent\n {...intro}\n showStepBadge={false}\n nextButtonText={t('console-app~Get started')}\n backButtonText={t('console-app~Skip tour')}\n />\n );\n if (stepNumber > totalSteps)\n return (\n <StepComponent\n {...end}\n showClose={false}\n showStepBadge={false}\n nextButtonText={t('console-app~Okay, got it!')}\n backButtonText={t('console-app~Back')}\n />\n );\n const step = steps[stepNumber - 1];\n return (\n <StepComponent\n {...step}\n nextButtonText={t('console-app~Next')}\n backButtonText={t('console-app~Back')}\n />\n );\n};\nexport default GuidedTour;\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { TourActions } from './const';\nimport { TourContext } from './tour-context';\n\ntype GuidedTourMastheadTriggerProps = {\n className?: string;\n};\n\nconst GuidedTourMastheadTrigger: React.FC<GuidedTourMastheadTriggerProps> = React.forwardRef(\n ({ className }, ref: React.LegacyRef<HTMLButtonElement>) => {\n const { tourDispatch, tour } = React.useContext(TourContext);\n const { t } = useTranslation();\n\n if (!tour) return null;\n return (\n <button\n className={className}\n type=\"button\"\n ref={ref}\n onClick={() => tourDispatch({ type: TourActions.start })}\n >\n {t('console-app~Guided tour')}\n </button>\n );\n },\n);\n\nexport default GuidedTourMastheadTrigger;\n","import * as React from 'react';\nimport {\n Button,\n TabContent,\n TabProps,\n TabsContextProvider,\n getOUIAProps,\n OUIAProps,\n getDefaultOUIAId,\n canUseDOM,\n GenerateId,\n PickOptional,\n getUniqueId,\n isElementInView,\n formatBreakpointMods,\n} from '@patternfly/react-core';\nimport AngleLeftIcon from '@patternfly/react-icons/dist/esm/icons/angle-left-icon';\nimport AngleRightIcon from '@patternfly/react-icons/dist/esm/icons/angle-right-icon';\nimport { css } from '@patternfly/react-styles';\nimport buttonStyles from '@patternfly/react-styles/css/components/Button/button';\nimport styles from '@patternfly/react-styles/css/components/Tabs/tabs';\n\nexport enum TabsComponent {\n div = 'div',\n nav = 'nav',\n}\n\nexport interface TabsProps\n extends Omit<React.HTMLProps<HTMLElement | HTMLDivElement>, 'onSelect'>,\n OUIAProps {\n /** Content rendered inside the tabs component. Must be React.ReactElement<TabProps>[] */\n children: React.ReactNode;\n /** Additional classes added to the tabs */\n className?: string;\n /** Tabs background color variant */\n variant?: 'default' | 'light300';\n /** The index of the active tab */\n activeKey?: number | string;\n /** The index of the default active tab. Set this for uncontrolled Tabs */\n defaultActiveKey?: number | string;\n /** Callback to handle tab selection */\n onSelect?: (event: React.MouseEvent<HTMLElement, MouseEvent>, eventKey: number | string) => void;\n /** Uniquely identifies the tabs */\n id?: string;\n /** Enables the filled tab list layout */\n isFilled?: boolean;\n /** Enables secondary tab styling */\n isSecondary?: boolean;\n /** Enables box styling to the tab component */\n isBox?: boolean;\n /** Enables vertical tab styling */\n isVertical?: boolean;\n /** Aria-label for the left scroll button */\n leftScrollAriaLabel?: string;\n /** Aria-label for the right scroll button */\n rightScrollAriaLabel?: string;\n /** Determines what tag is used around the tabs. Use \"nav\" to define the tabs inside a navigation region */\n component?: 'div' | 'nav';\n /** Provides an accessible label for the tabs. Labels should be unique for each set of tabs that are present on a page. When component is set to nav, this prop should be defined to differentiate the tabs from other navigation regions on the page. */\n 'aria-label'?: string;\n /** Waits until the first \"enter\" transition to mount tab children (add them to the DOM) */\n mountOnEnter?: boolean;\n /** Unmounts tab children (removes them from the DOM) when they are no longer visible */\n unmountOnExit?: boolean;\n /** Flag indicates that the tabs should use page insets. */\n usePageInsets?: boolean;\n /** Insets at various breakpoints. */\n inset?: {\n default?: 'insetNone' | 'insetSm' | 'insetMd' | 'insetLg' | 'insetXl' | 'inset2xl';\n sm?: 'insetNone' | 'insetSm' | 'insetMd' | 'insetLg' | 'insetXl' | 'inset2xl';\n md?: 'insetNone' | 'insetSm' | 'insetMd' | 'insetLg' | 'insetXl' | 'inset2xl';\n lg?: 'insetNone' | 'insetSm' | 'insetMd' | 'insetLg' | 'insetXl' | 'inset2xl';\n xl?: 'insetNone' | 'insetSm' | 'insetMd' | 'insetLg' | 'insetXl' | 'inset2xl';\n '2xl'?: 'insetNone' | 'insetSm' | 'insetMd' | 'insetLg' | 'insetXl' | 'inset2xl';\n };\n /** Enable expandable vertical tabs at various breakpoints. (isVertical should be set to true for this to work) */\n expandable?: {\n default?: 'expandable' | 'nonExpandable';\n sm?: 'expandable' | 'nonExpandable';\n md?: 'expandable' | 'nonExpandable';\n lg?: 'expandable' | 'nonExpandable';\n xl?: 'expandable' | 'nonExpandable';\n '2xl'?: 'expandable' | 'nonExpandable';\n };\n /** Flag to indicate if the vertical tabs are expanded */\n isExpanded?: boolean;\n /** Flag indicating the default expanded state for uncontrolled expand/collapse of */\n defaultIsExpanded?: boolean;\n /** Text that appears in the expandable toggle */\n toggleText?: string;\n /** Aria-label for the left expandable toggle */\n toggleAriaLabel?: string;\n /** Callback function to toggle the expandable tabs. */\n onToggle?: (isExpanded: boolean) => void;\n}\n\nconst variantStyle = {\n default: '',\n light300: styles.modifiers.colorSchemeLight_300,\n};\n\ninterface TabsState {\n showScrollButtons: boolean;\n disableLeftScrollButton: boolean;\n disableRightScrollButton: boolean;\n shownKeys: (string | number)[];\n uncontrolledActiveKey: number | string;\n uncontrolledIsExpandedLocal: boolean;\n ouiaStateId: string;\n}\n\nexport class Tabs extends React.Component<TabsProps, TabsState> {\n static displayName = 'Tabs';\n\n tabList = React.createRef<HTMLUListElement>();\n\n constructor(props: TabsProps) {\n super(props);\n this.state = {\n showScrollButtons: false,\n disableLeftScrollButton: true,\n disableRightScrollButton: true,\n shownKeys:\n this.props.defaultActiveKey !== undefined\n ? [this.props.defaultActiveKey]\n : [this.props.activeKey], // only for mountOnEnter case\n uncontrolledActiveKey: this.props.defaultActiveKey,\n uncontrolledIsExpandedLocal: this.props.defaultIsExpanded,\n ouiaStateId: getDefaultOUIAId(Tabs.displayName),\n };\n\n if (this.props.isVertical && this.props.expandable !== undefined) {\n if (!this.props.toggleAriaLabel && !this.props.toggleText) {\n // eslint-disable-next-line no-console\n console.error(\n 'Tabs:',\n 'toggleAriaLabel or the toggleText prop is required to make the toggle button accessible',\n );\n }\n }\n }\n\n scrollTimeout: NodeJS.Timeout = null;\n\n static defaultProps: PickOptional<TabsProps> = {\n activeKey: 0,\n onSelect: () => undefined as any,\n isFilled: false,\n isSecondary: false,\n isVertical: false,\n isBox: false,\n leftScrollAriaLabel: 'Scroll left',\n rightScrollAriaLabel: 'Scroll right',\n component: TabsComponent.div,\n mountOnEnter: false,\n unmountOnExit: false,\n ouiaSafe: true,\n variant: 'default',\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onToggle: (isExpanded): void => undefined,\n };\n\n handleTabClick(\n event: React.MouseEvent<HTMLElement, MouseEvent>,\n eventKey: number | string,\n tabContentRef: React.RefObject<any>,\n ) {\n const { shownKeys } = this.state;\n const { onSelect, defaultActiveKey } = this.props;\n // if defaultActiveKey Tabs are uncontrolled, set new active key internally\n if (defaultActiveKey !== undefined) {\n this.setState({\n uncontrolledActiveKey: eventKey,\n });\n } else {\n onSelect(event, eventKey);\n }\n\n // process any tab content sections outside of the component\n if (tabContentRef) {\n React.Children.toArray(this.props.children)\n .map((child) => child as React.ReactElement<TabProps>)\n .filter(\n (child) => child.props && child.props.tabContentRef && child.props.tabContentRef.current,\n )\n .forEach((child) => (child.props.tabContentRef.current.hidden = true));\n // most recently selected tabContent\n if (tabContentRef.current) {\n tabContentRef.current.hidden = false;\n }\n }\n if (this.props.mountOnEnter) {\n this.setState({\n shownKeys: shownKeys.concat(eventKey),\n });\n }\n }\n\n handleScrollButtons = () => {\n // add debounce to the scroll event\n clearTimeout(this.scrollTimeout);\n this.scrollTimeout = setTimeout(() => {\n const container = this.tabList.current;\n let disableLeftScrollButton = true;\n let disableRightScrollButton = true;\n let showScrollButtons = false;\n\n if (container && !this.props.isVertical) {\n // get first element and check if it is in view\n const overflowOnLeft = !isElementInView(\n container,\n container.firstChild as HTMLElement,\n false,\n );\n\n // get last element and check if it is in view\n const overflowOnRight = !isElementInView(\n container,\n container.lastChild as HTMLElement,\n false,\n );\n\n showScrollButtons = overflowOnLeft || overflowOnRight;\n\n disableLeftScrollButton = !overflowOnLeft;\n disableRightScrollButton = !overflowOnRight;\n }\n this.setState({\n showScrollButtons,\n disableLeftScrollButton,\n disableRightScrollButton,\n });\n }, 100);\n };\n\n scrollLeft = () => {\n // find first Element that is fully in view on the left, then scroll to the element before it\n if (this.tabList.current) {\n const container = this.tabList.current;\n const childrenArr = Array.from(container.children);\n let firstElementInView: any;\n let lastElementOutOfView: any;\n let i;\n for (i = 0; i < childrenArr.length && !firstElementInView; i++) {\n if (isElementInView(container, childrenArr[i] as HTMLElement, false)) {\n firstElementInView = childrenArr[i];\n lastElementOutOfView = childrenArr[i - 1];\n }\n }\n if (lastElementOutOfView) {\n container.scrollLeft -= lastElementOutOfView.scrollWidth;\n }\n }\n };\n\n scrollRight = () => {\n // find last Element that is fully in view on the right, then scroll to the element after it\n if (this.tabList.current) {\n const container = this.tabList.current as any;\n const childrenArr = Array.from(container.children);\n let lastElementInView: any;\n let firstElementOutOfView: any;\n for (let i = childrenArr.length - 1; i >= 0 && !lastElementInView; i--) {\n if (isElementInView(container, childrenArr[i] as HTMLElement, false)) {\n lastElementInView = childrenArr[i];\n firstElementOutOfView = childrenArr[i + 1];\n }\n }\n if (firstElementOutOfView) {\n container.scrollLeft += firstElementOutOfView.scrollWidth;\n }\n }\n };\n\n componentDidMount() {\n if (!this.props.isVertical) {\n if (canUseDOM) {\n window.addEventListener('resize', this.handleScrollButtons, false);\n }\n // call the handle resize function to check if scroll buttons should be shown\n this.handleScrollButtons();\n }\n }\n\n componentWillUnmount() {\n if (!this.props.isVertical) {\n if (canUseDOM) {\n window.removeEventListener('resize', this.handleScrollButtons, false);\n }\n }\n clearTimeout(this.scrollTimeout);\n }\n\n componentDidUpdate(prevProps: TabsProps) {\n const { activeKey, mountOnEnter } = this.props;\n const { shownKeys } = this.state;\n if (prevProps.activeKey !== activeKey && mountOnEnter && shownKeys.indexOf(activeKey) < 0) {\n // eslint-disable-next-line\n this.setState({\n shownKeys: shownKeys.concat(activeKey),\n });\n }\n }\n\n render() {\n const {\n className,\n children,\n activeKey,\n defaultActiveKey,\n id,\n isFilled,\n isSecondary,\n isVertical,\n isBox,\n leftScrollAriaLabel,\n rightScrollAriaLabel,\n 'aria-label': ariaLabel,\n component,\n ouiaId,\n ouiaSafe,\n mountOnEnter,\n unmountOnExit,\n usePageInsets,\n inset,\n variant,\n expandable,\n isExpanded,\n defaultIsExpanded,\n toggleText,\n toggleAriaLabel,\n onToggle,\n ...props\n } = this.props;\n const {\n showScrollButtons,\n disableLeftScrollButton,\n disableRightScrollButton,\n shownKeys,\n uncontrolledActiveKey,\n uncontrolledIsExpandedLocal,\n } = this.state;\n const filteredChildren = (React.Children.toArray(children) as React.ReactElement<TabProps>[])\n .filter(Boolean)\n .filter((child) => !child.props.isHidden);\n\n const uniqueId = id || getUniqueId();\n const Component: any = component === TabsComponent.nav ? 'nav' : 'div';\n const localActiveKey = defaultActiveKey !== undefined ? uncontrolledActiveKey : activeKey;\n\n const isExpandedLocal =\n defaultIsExpanded !== undefined ? uncontrolledIsExpandedLocal : isExpanded;\n /* Uncontrolled expandable tabs */\n const toggleTabs = (newValue: boolean) => {\n if (isExpanded === undefined) {\n this.setState({ uncontrolledIsExpandedLocal: newValue });\n } else {\n onToggle(newValue);\n }\n };\n\n return (\n <TabsContextProvider\n value={{\n variant,\n mountOnEnter,\n unmountOnExit,\n localActiveKey,\n uniqueId,\n handleTabClick: (...args) => this.handleTabClick(...args),\n }}\n >\n <Component\n aria-label={ariaLabel}\n className={css(\n styles.tabs,\n isFilled && styles.modifiers.fill,\n isSecondary && styles.modifiers.secondary,\n isVertical && styles.modifiers.vertical,\n isVertical && expandable && formatBreakpointMods(expandable, styles),\n isVertical && expandable && isExpandedLocal && styles.modifiers.expanded,\n isBox && styles.modifiers.box,\n showScrollButtons && !isVertical && styles.modifiers.scrollable,\n usePageInsets && styles.modifiers.pageInsets,\n formatBreakpointMods(inset, styles),\n variantStyle[variant],\n className,\n )}\n {...getOUIAProps(\n Tabs.displayName,\n ouiaId !== undefined ? ouiaId : this.state.ouiaStateId,\n ouiaSafe,\n )}\n id={id && id}\n {...props}\n >\n {expandable && isVertical && (\n <GenerateId>\n {(randomId) => (\n <div className={css(styles.tabsToggle)}>\n <div className={css(styles.tabsToggleButton)}>\n <Button\n onClick={() => toggleTabs(!isExpandedLocal)}\n variant=\"plain\"\n aria-label={toggleAriaLabel}\n aria-expanded={isExpandedLocal}\n id={`${randomId}-button`}\n aria-labelledby={`${randomId}-text ${randomId}-button`}\n >\n <span className={css(styles.tabsToggleIcon)}>\n <AngleRightIcon arian-hidden=\"true\" />\n </span>\n {toggleText && (\n <span className={css('pf-v5-c-tabs__toggle-text')} id={`${randomId}-text`}>\n {toggleText}\n </span>\n )}\n </Button>\n </div>\n </div>\n )}\n </GenerateId>\n )}\n <Button\n className={css(\n styles.tabsScrollButton,\n isSecondary && buttonStyles.modifiers.secondary,\n )}\n aria-label={leftScrollAriaLabel}\n onClick={this.scrollLeft}\n disabled={disableLeftScrollButton}\n aria-hidden={disableLeftScrollButton}\n >\n <AngleLeftIcon />\n </Button>\n <ul\n className={css(styles.tabsList)}\n ref={this.tabList}\n onScroll={this.handleScrollButtons}\n >\n {filteredChildren}\n </ul>\n <Button\n className={css(\n styles.tabsScrollButton,\n isSecondary && buttonStyles.modifiers.secondary,\n )}\n aria-label={rightScrollAriaLabel}\n onClick={this.scrollRight}\n disabled={disableRightScrollButton}\n aria-hidden={disableRightScrollButton}\n >\n <AngleRightIcon />\n </Button>\n </Component>\n {filteredChildren\n .filter(\n (child) =>\n child.props.children &&\n !(unmountOnExit && child.props.eventKey !== localActiveKey) &&\n !(mountOnEnter && shownKeys.indexOf(child.props.eventKey) === -1),\n )\n .map((child) => (\n <TabContent\n key={child.props.eventKey}\n activeKey={localActiveKey}\n child={child}\n id={child.props.id || uniqueId}\n ouiaId={child.props.ouiaId}\n />\n ))}\n </TabsContextProvider>\n );\n }\n}\n","import * as React from 'react';\nimport { useSafetyFirst } from '@console/dynamic-plugin-sdk';\nimport { getTerminalInstalledNamespace } from './cloud-shell-utils';\n\nconst useCloudShellNamespace = (): [string, string] => {\n const [terminalNamespace, setTerminalNamespace] = useSafetyFirst<string>(undefined);\n const [fetchError, setFetchError] = useSafetyFirst<string>(undefined);\n React.useEffect(() => {\n const fetchNamespace = async () => {\n try {\n if (!terminalNamespace) {\n const namespaceRequest = await getTerminalInstalledNamespace();\n const namespace = await namespaceRequest.text();\n setTerminalNamespace(namespace);\n }\n } catch (e) {\n const errorMessage = await e.response.text();\n setFetchError(errorMessage);\n }\n };\n fetchNamespace();\n }, [setFetchError, setTerminalNamespace, terminalNamespace]);\n\n return [terminalNamespace, fetchError];\n};\n\nexport default useCloudShellNamespace;\n","import * as React from 'react';\nimport { useNavigate } from 'react-router-dom-v5-compat';\nimport { PerspectiveType } from '@console/dynamic-plugin-sdk';\nimport { usePerspectiveExtension, usePerspectives, useTelemetry } from '@console/shared';\nimport { ACM_PERSPECTIVE_ID } from '../../consts';\nimport { usePreferredPerspective } from '../user-preferences';\nimport { useLastPerspective } from './useLastPerspective';\n\nexport const useValuesForPerspectiveContext = (): [\n PerspectiveType,\n (newPerspective: string, next?: string) => void,\n boolean,\n] => {\n const navigate = useNavigate();\n const fireTelemetryEvent = useTelemetry();\n const perspectiveExtensions = usePerspectives();\n const [lastPerspective, setLastPerspective, lastPerspectiveLoaded] = useLastPerspective();\n const [preferredPerspective, , preferredPerspectiveLoaded] = usePreferredPerspective();\n const [activePerspective, setActivePerspective] = React.useState('');\n const loaded = lastPerspectiveLoaded && preferredPerspectiveLoaded;\n const latestPerspective = loaded && (preferredPerspective || lastPerspective);\n const acmPerspectiveExtension = usePerspectiveExtension(ACM_PERSPECTIVE_ID);\n const existingPerspective = activePerspective || latestPerspective;\n const perspective =\n !!acmPerspectiveExtension && !existingPerspective ? ACM_PERSPECTIVE_ID : existingPerspective;\n const isValidPerspective =\n loaded && perspectiveExtensions.some((p) => p.properties.id === perspective);\n\n const setPerspective = (newPerspective: string, next?: string) => {\n setLastPerspective(newPerspective);\n setActivePerspective(newPerspective);\n // Navigate to next or root and let the default page determine where to go to next\n navigate(next || '/');\n fireTelemetryEvent('Perspective Changed', { perspective: newPerspective });\n // eslint-disable-next-line no-console\n console.log('DEBUG: setting perspective', newPerspective, next);\n };\n\n return [isValidPerspective ? perspective : undefined, setPerspective, loaded];\n};\n","export { default as PerspectiveDropdown } from './PerspectiveDropdown';\nexport * from './usePreferredPerspective';\n","import * as React from 'react';\nimport { Skeleton } from '@patternfly/react-core';\nimport {\n SelectOption as SelectOptionDeprecated,\n Select as SelectDeprecated,\n SelectVariant as SelectVariantDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { useTranslation } from 'react-i18next';\nimport { usePerspectives } from '@console/shared/src';\nimport { useTelemetry } from '@console/shared/src/hooks/useTelemetry';\nimport {\n PREFERRED_PERSPECTIVE_USER_SETTING_KEY,\n usePreferredPerspective,\n} from './usePreferredPerspective';\n\nconst PerspectiveDropdown: React.FC = () => {\n // resources and calls to hooks\n const { t } = useTranslation();\n const fireTelemetryEvent = useTelemetry();\n const perspectiveExtensions = usePerspectives();\n const allPerspectives = perspectiveExtensions.map((extension) => extension.properties);\n const [\n preferredPerspective,\n setPreferredPerspective,\n preferredPerspectiveLoaded,\n ] = usePreferredPerspective();\n const [dropdownOpen, setDropdownOpen] = React.useState(false);\n const loaded: boolean = preferredPerspectiveLoaded;\n const lastViewedLabel: string = t('console-app~Last viewed');\n\n const selectOptions: JSX.Element[] = React.useMemo(() => {\n const lastPerspectiveOption = (\n <SelectOptionDeprecated key={'lastViewed'} value={lastViewedLabel} />\n );\n const allPerspectiveOptions = allPerspectives\n .sort((currPerspective, nextPerspective) => {\n const { name: currPerspectiveName } = currPerspective;\n const { name: nextPerspectiveName } = nextPerspective;\n if (currPerspectiveName === nextPerspectiveName) {\n return 0;\n }\n return currPerspectiveName > nextPerspectiveName ? 1 : -1;\n })\n .map(({ name }) => <SelectOptionDeprecated key={name} value={name} />);\n return [lastPerspectiveOption, ...allPerspectiveOptions];\n }, [allPerspectives, lastViewedLabel]);\n\n // utils and callbacks\n const getDropdownLabelForValue = (): string =>\n preferredPerspective\n ? allPerspectives.find((perspective) => perspective.id === preferredPerspective)?.name ??\n lastViewedLabel\n : lastViewedLabel;\n const getDropdownValueForLabel = (selectedLabel: string): string =>\n selectedLabel === lastViewedLabel\n ? null\n : allPerspectives.find((perspective) => perspective.name === selectedLabel)?.id;\n const onToggle = (_event, isOpen: boolean) => setDropdownOpen(isOpen);\n const onSelect = (_, selection) => {\n const selectedValue = getDropdownValueForLabel(selection);\n selectedValue !== preferredPerspective && setPreferredPerspective(selectedValue);\n setDropdownOpen(false);\n fireTelemetryEvent('User Preference Changed', {\n property: PREFERRED_PERSPECTIVE_USER_SETTING_KEY,\n value: selectedValue,\n });\n };\n\n return loaded ? (\n <SelectDeprecated\n variant={SelectVariantDeprecated.single}\n isOpen={dropdownOpen}\n selections={getDropdownLabelForValue()}\n toggleId={'console.preferredPerspective'}\n onToggle={onToggle}\n onSelect={onSelect}\n placeholderText={t('console-app~Select a perspective')}\n data-test={'dropdown console.preferredPerspective'}\n maxHeight={300}\n >\n {selectOptions}\n </SelectDeprecated>\n ) : (\n <Skeleton\n height=\"30px\"\n width=\"100%\"\n data-test={'dropdown skeleton console.preferredPerspective'}\n />\n );\n};\n\nexport default PerspectiveDropdown;\n","import * as React from 'react';\nimport { Skeleton, Checkbox } from '@patternfly/react-core';\nimport {\n SelectOption as SelectOptionDeprecated,\n Select as SelectDeprecated,\n SelectVariant as SelectVariantDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { useTranslation } from 'react-i18next';\nimport { useTelemetry } from '@console/shared/src/hooks/useTelemetry';\nimport { supportedLocales } from './const';\nimport { useLanguage } from './useLanguage';\nimport { PREFERRED_LANGUAGE_USER_SETTING_KEY, usePreferredLanguage } from './usePreferredLanguage';\n\nimport './LanguageDropdown.scss';\n\nconst LanguageDropdown: React.FC = () => {\n const { t } = useTranslation();\n const fireTelemetryEvent = useTelemetry();\n const [preferredLanguage, setPreferredLanguage, preferredLanguageLoaded] = usePreferredLanguage();\n const [dropdownOpen, setDropdownOpen] = React.useState(false);\n const selectOptions: JSX.Element[] = React.useMemo(\n () =>\n Object.keys(supportedLocales).map((lang) => (\n <SelectOptionDeprecated key={lang} value={lang}>\n {supportedLocales[lang]}\n </SelectOptionDeprecated>\n )),\n [],\n );\n\n const [isUsingDefault, setIsUsingDefault] = React.useState<boolean>(!preferredLanguage);\n const checkboxLabel: string = t('console-app~Use the default browser language setting.');\n\n const onToggle = (_event, isOpen: boolean) => setDropdownOpen(isOpen);\n const onSelect = (_, selection: string) => {\n if (selection !== preferredLanguage) {\n setPreferredLanguage(selection);\n fireTelemetryEvent('User Preference Changed', {\n property: PREFERRED_LANGUAGE_USER_SETTING_KEY,\n value: 'custom',\n });\n }\n setDropdownOpen(false);\n };\n\n const onUsingDefault = (_event, checked: boolean) => {\n setIsUsingDefault(checked);\n fireTelemetryEvent('User Preference Changed', {\n property: PREFERRED_LANGUAGE_USER_SETTING_KEY,\n value: checked,\n });\n if (checked) {\n setPreferredLanguage(null);\n }\n };\n\n useLanguage(preferredLanguage, preferredLanguageLoaded); // sync the preferred language with local storage and set the console language\n\n React.useEffect(() => {\n if (preferredLanguageLoaded) {\n setIsUsingDefault(!preferredLanguage);\n }\n // run this hook only after resources have loaded\n // to set the using default language checkbox when the form loads\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [preferredLanguageLoaded]);\n\n return preferredLanguageLoaded ? (\n <>\n <Checkbox\n id=\"default-language-checkbox\"\n label={checkboxLabel}\n isChecked={isUsingDefault}\n data-checked-state={isUsingDefault}\n onChange={onUsingDefault}\n aria-label={checkboxLabel}\n data-test=\"checkbox console.preferredLanguage\"\n className=\"co-language-dropdown__system-default-checkbox\"\n />\n <SelectDeprecated\n variant={SelectVariantDeprecated.single}\n isOpen={dropdownOpen}\n selections={preferredLanguage}\n toggleId={'console.preferredLanguage'}\n onToggle={onToggle}\n onSelect={onSelect}\n placeholderText={t('console-app~Select a language')}\n aria-label={t('console-app~Select a language')}\n data-test=\"dropdown console.preferredLanguage\"\n maxHeight={300}\n isDisabled={isUsingDefault}\n >\n {selectOptions}\n </SelectDeprecated>\n </>\n ) : (\n <>\n <Skeleton\n height=\"15px\"\n width=\"100%\"\n data-test=\"checkbox skeleton console.preferredLanguage\"\n className=\"co-language-dropdown__system-default-checkbox\"\n />\n <Skeleton\n height=\"30px\"\n width=\"100%\"\n data-test=\"dropdown skeleton console.preferredLanguage\"\n />\n </>\n );\n};\n\nexport default LanguageDropdown;\n","import { useUserSettings } from '@console/shared';\n\n// duplicated in openshift/lightspeed-operator, so be mindful of changing\nconst PREFERRED_LIGHTSPEED_USER_SETTING_KEY: string = 'console.hideLightspeedButton';\n\nexport const useHideLightspeed = (): [boolean, boolean] => {\n const [hideLightspeed, , hideLightspeedLoaded] = useUserSettings<boolean>(\n PREFERRED_LIGHTSPEED_USER_SETTING_KEY,\n false,\n true,\n );\n return [hideLightspeed, hideLightspeedLoaded];\n};\n","/* eslint-disable */\nimport {\n ActivityItemProps,\n ActivityBodyProps,\n RecentEventsBodyProps,\n OngoingActivityBodyProps,\n AlertsBodyProps,\n AlertItemProps,\n HealthItemProps,\n ResourceInventoryItemProps,\n DetailsBodyProps,\n UtilizationItemProps,\n UtilizationBodyProps,\n UtilizationDurationDropdownProps,\n UseUtilizationDuration,\n VirtualizedGridProps,\n LazyActionMenuProps,\n UseDashboardResources,\n QuickStartsLoaderProps,\n UseURLPoll,\n UseLastNamespace,\n} from './internal-types';\nimport { UseUserSettings } from '../extensions';\n\nexport const ActivityItem: React.FC<ActivityItemProps> = require('@console/shared/src/components/dashboard/activity-card/ActivityItem')\n .default;\nexport const ActivityBody: React.FC<ActivityBodyProps> = require('@console/shared/src/components/dashboard/activity-card/ActivityBody')\n .default;\nexport const RecentEventsBody: React.FC<RecentEventsBodyProps> = require('@console/shared/src/components/dashboard/activity-card/ActivityBody')\n .RecentEventsBody;\nexport const OngoingActivityBody: React.FC<OngoingActivityBodyProps> = require('@console/shared/src/components/dashboard/activity-card/ActivityBody')\n .OngoingActivityBody;\nexport const AlertsBody: React.FC<AlertsBodyProps> = require('@console/shared/src/components/dashboard/status-card/AlertsBody')\n .default;\nexport const AlertItem: React.FC<AlertItemProps> = require('@console/shared/src/components/dashboard/status-card/AlertItem')\n .default;\nexport const HealthItem: React.FC<HealthItemProps> = require('@console/shared/src/components/dashboard/status-card/HealthItem')\n .default;\nexport const HealthBody: React.FC = require('@console/shared/src/components/dashboard/status-card/HealthBody')\n .default;\nexport const ResourceInventoryItem: React.FC<ResourceInventoryItemProps> = require('@console/shared/src/components/dashboard/inventory-card/InventoryItem')\n .ResourceInventoryItem;\nexport const DetailsBody: React.FC<DetailsBodyProps> = require('@console/shared/src/components/dashboard/details-card/DetailsBody')\n .default;\nexport const UtilizationItem: React.FC<UtilizationItemProps> = require('@console/shared/src/components/dashboard/utilization-card/UtilizationItem')\n .default;\nexport const UtilizationBody: React.FC<UtilizationBodyProps> = require('@console/shared/src/components/dashboard/utilization-card/UtilizationBody')\n .default;\nexport const UtilizationDurationDropdown: React.FC<UtilizationDurationDropdownProps> = require('@console/shared/src/components/dashboard/utilization-card/UtilizationDurationDropdown')\n .UtilizationDurationDropdown;\nexport const VirtualizedGrid: React.FC<VirtualizedGridProps> = require('@console/shared/src/components/virtualized-grid/VirtualizedGrid')\n .default;\nexport const LazyActionMenu: React.FC<LazyActionMenuProps> = require('@console/shared/src/components/actions/LazyActionMenu')\n .default;\nexport const QuickStartsLoader: React.FC<QuickStartsLoaderProps> = require('@console/app/src/components/quick-starts/loader/QuickStartsLoader')\n .default;\n\nexport const useUtilizationDuration: UseUtilizationDuration = require('@console/shared/src/hooks/useUtilizationDuration')\n .useUtilizationDuration;\nexport const ServicesList = require('@console/internal/components/service').ServicesList;\nexport const useDashboardResources: UseDashboardResources = require('@console/shared/src/hooks/useDashboardResources')\n .useDashboardResources;\n// useUserSettings is deprecated and is now exposed in dynamic plugin SDK.\nexport const useUserSettings: UseUserSettings = require('@console/shared/src/hooks/useUserSettings')\n .useUserSettings;\nexport const useURLPoll: UseURLPoll = require('@console/internal/components/utils/url-poll-hook')\n .useURLPoll;\nexport const useLastNamespace: UseLastNamespace = require('@console/app/src/components/detect-namespace/useLastNamespace')\n .useLastNamespace;\n","import * as React from 'react';\nimport {\n Alert,\n Button,\n List,\n ListItem,\n Page,\n PageSection,\n Stack,\n StackItem,\n Text,\n Title,\n Tooltip,\n} from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { useHideLightspeed } from '@console/app/src/components/user-preferences/lightspeed';\nimport { k8sGetResource } from '@console/dynamic-plugin-sdk/src/utils/k8s';\nimport { history } from '@console/internal/components/utils';\nimport { ConsolePluginModel } from '@console/internal/models';\nimport { FLAGS, useTelemetry } from '@console/shared';\nimport { useFlag } from '@console/shared/src/hooks/flag';\nimport './Lightspeed.scss';\n\nconst getLightspeedInstallationStatus = async () => {\n try {\n await k8sGetResource({\n model: ConsolePluginModel,\n name: 'lightspeed-console-plugin',\n });\n return true;\n } catch (err) {\n if (err.response.status !== 404) {\n // eslint-disable-next-line no-console\n console.log(err.message);\n }\n return false;\n }\n};\n\nexport const lightspeedOperatorURL =\n '/operatorhub/all-namespaces?keyword=lightspeed&details-item=lightspeed-operator-redhat-operators-openshift-marketplace';\n\nconst Lightspeed: React.FC = () => {\n const { t } = useTranslation();\n const [hideLightspeed] = useHideLightspeed();\n const [isReady, setIsReady] = React.useState(false);\n const [lightspeedIsInstalled, setLightspeedIsInstalled] = React.useState(false);\n const [isOpen, setIsOpen] = React.useState(false);\n const fireTelemetryEvent = useTelemetry();\n const canListPackageManifest = useFlag(FLAGS.CAN_LIST_PACKAGE_MANIFEST);\n const canListOperatorGroup = useFlag(FLAGS.CAN_LIST_OPERATOR_GROUP);\n const canInstallLightspeed = canListPackageManifest && canListOperatorGroup;\n\n React.useEffect(() => {\n const checkIfLightspeedIsInstalled = async () => {\n if (await getLightspeedInstallationStatus()) {\n setLightspeedIsInstalled(true);\n }\n setIsReady(true);\n };\n checkIfLightspeedIsInstalled();\n }, [isReady]);\n\n const onPopoverButtonClick = () => {\n setIsOpen(!isOpen);\n fireTelemetryEvent('Console capability LightspeedButton clicked');\n };\n const onInstallClick = () => {\n setIsOpen(false);\n history.push(lightspeedOperatorURL);\n fireTelemetryEvent('Console capability LightspeedButton Get started button clicked');\n };\n const onDismissClick = () => {\n setIsOpen(false);\n history.push(\n '/user-preferences/general?spotlight=[data-test=\"console.hideLightspeedButton%20field\"]',\n );\n };\n\n const title = t('console-app~Red Hat OpenShift Lightspeed');\n const button = (\n <Button\n variant=\"link\"\n className=\"lightspeed__popover-button\"\n onClick={onPopoverButtonClick}\n aria-label={title}\n />\n );\n\n if (hideLightspeed || !isReady || lightspeedIsInstalled) {\n return null;\n }\n\n return isOpen ? (\n <>\n <div className=\"lightspeed__popover lightspeed__popover--collapsed\">\n <Page>\n <PageSection variant=\"light\" isFilled>\n <Stack hasGutter>\n <StackItem>\n <div className=\"lightspeed__welcome-logo\" />\n <Title headingLevel=\"h1\" className=\"pf-v5-u-mb-sm\">\n {t('console-app~Meet OpenShift Lightspeed')}\n </Title>\n <Text className=\"pf-v5-u-color-200 pf-v5-u-font-size-lg pf-v5-u-mb-md\">\n {t(\n \"console-app~Unlock possibilities and enhance productivity with the AI-powered assistant's expert guidance in your OpenShift web console.\",\n )}\n </Text>\n </StackItem>\n <StackItem isFilled>\n <Title headingLevel=\"h2\" className=\"pf-v5-u-mb-md\">\n {t('console-app~Benefits:')}\n </Title>\n <List isPlain isBordered className=\"pf-v5-u-color-200 pf-v5-u-ml-sm\">\n <ListItem>\n {t('console-app~Get fast answers to questions you have related to OpenShift')}\n </ListItem>\n <ListItem>\n {t(\n \"console-app~Quickly troubleshoot with OpenShift Lightspeed's extensive knowledge\",\n )}\n </ListItem>\n <ListItem>\n {t(\n 'console-app~Understand your cluster resources, such as the number of pods running on a particular namespace',\n )}\n </ListItem>\n <ListItem>\n {t(\n 'console-app~Free up your IT teams so that you can drive greater innovation',\n )}\n </ListItem>\n </List>\n </StackItem>\n {canInstallLightspeed ? (\n <StackItem className=\"pf-v5-u-text-align-center\">\n <Button variant=\"primary\" size=\"lg\" onClick={onInstallClick}>\n {t('console-app~Get started in OperatorHub')}\n </Button>\n </StackItem>\n ) : (\n <StackItem>\n <Alert\n variant=\"info\"\n isInline\n title={t('console-app~Must have administrator access')}\n >\n <Text>\n {t(\n 'console-app~Contact your administrator and ask them to instal Red Hat OpenShift Lightspeed.',\n )}\n </Text>\n </Alert>\n </StackItem>\n )}\n <StackItem className=\"pf-v5-u-text-align-center\">\n <Button variant=\"link\" onClick={onDismissClick}>\n {t(\"console-app~Don't show again\")}\n </Button>\n </StackItem>\n </Stack>\n </PageSection>\n </Page>\n </div>\n {button}\n </>\n ) : (\n <Tooltip content={title}>{button}</Tooltip>\n );\n};\nexport default Lightspeed;\n","import * as React from 'react';\nimport { Extension, LoadedExtension } from '@console/dynamic-plugin-sdk/src/types';\nimport { isTranslatableString, translateExtensionDeep } from './extension-i18n';\nimport useTranslationExt from './useTranslationExt';\n\n/**\n * `translateExtensionDeep` mutates the extension for translations. We need to store a\n * semi-permanent mapping of the translation keys values.\n *\n * Structured as: { [extension.UID]: { [propertyPathToTranslation]: translationKey } }\n */\nconst translationKeyMap: Record<string, Record<string, string>> = {};\n\nconst useTranslatedExtensions = <E extends Extension>(\n extensions: LoadedExtension<E>[],\n): typeof extensions => {\n const { t } = useTranslationExt();\n\n React.useMemo(\n // Mutate \"extensions\" parameter only if changed (i.e. a flag-enabled or translations changed)\n () =>\n extensions.forEach((e) => {\n const UID = e.uid;\n translateExtensionDeep(\n e,\n (value, path): value is string => {\n let translatableString = value;\n if (translationKeyMap[UID]?.[path]) {\n translatableString = translationKeyMap[UID][path];\n }\n return isTranslatableString(translatableString);\n },\n (value, key, obj, path) => {\n if (!translationKeyMap[UID]) {\n translationKeyMap[UID] = {};\n }\n if (!translationKeyMap[UID][path]) {\n translationKeyMap[UID][path] = value;\n }\n // TODO: Fix mutation of extension - mirrors work done in translateExtension\n // @see translateExtension()\n obj[key] = t(translationKeyMap[UID][path]);\n },\n );\n }),\n [t, extensions],\n );\n\n return extensions;\n};\n\nexport default useTranslatedExtensions;\n","import * as React from 'react';\nimport { TFunction } from 'i18next';\nimport { Namespace, useTranslation, UseTranslationOptions } from 'react-i18next';\nimport { isTranslatableString, getTranslationKey } from './extension-i18n';\n\n/**\n * Extends i18next `useTranslation` hook and overrides the `t` function.\n *\n * Translatable strings in Console application must use the `%key%` pattern.\n */\nconst useTranslationExt = (ns?: Namespace, options?: UseTranslationOptions) => {\n const result = useTranslation(ns, options);\n const { t } = result;\n const cb: TFunction = React.useCallback(\n (value: string) => (isTranslatableString(value) ? t(getTranslationKey(value)) : value),\n [t],\n );\n return { ...result, t: cb };\n};\n\nexport default useTranslationExt;\n","import * as _ from 'lodash';\nimport { plural } from 'pluralize';\nimport { Dispatch } from 'react-redux';\nimport { DiscoveryResources, K8sModel } from '../../../api/common-types';\nimport { consoleFetchJSON } from '../../../utils/fetch/console-fetch';\nimport { k8sBasePath } from '../../../utils/k8s/k8s';\nimport { kindToAbbr } from '../../../utils/k8s/k8s-get-resource';\nimport { getResourcesInFlight, receivedResources } from '../actions/k8s';\nimport { APIResourceList, InitApiDiscovery } from './api-discovery-types';\nimport { cacheResources, getCachedResources } from './discovery-cache';\n\nconst POLLs = {};\nconst apiDiscovery = 'apiDiscovery';\nconst API_DISCOVERY_POLL_INTERVAL = 60_000;\n\nconst pluralizeKind = (kind: string): string => {\n // Use startCase to separate words so the last can be pluralized but remove spaces so as not to humanize\n const pluralized = plural(_.startCase(kind)).replace(/\\s+/g, '');\n // Handle special cases like DB -> DBs (instead of DBS).\n if (pluralized === `${kind}S`) {\n return `${kind}s`;\n }\n return pluralized;\n};\n\nconst defineModels = (list: APIResourceList): K8sModel[] => {\n const groupVersionParts = list.groupVersion.split('/');\n const apiGroup = groupVersionParts.length > 1 ? groupVersionParts[0] : null;\n const apiVersion = groupVersionParts.length > 1 ? groupVersionParts[1] : list.groupVersion;\n return list.resources\n .filter(({ name }) => !name.includes('/'))\n .map(({ name, singularName, namespaced, kind, verbs, shortNames }) => {\n return {\n kind,\n namespaced,\n verbs,\n shortNames,\n label: kind,\n plural: name,\n apiVersion,\n abbr: kindToAbbr(kind),\n ...(apiGroup ? { apiGroup } : {}),\n labelPlural: pluralizeKind(kind),\n path: name,\n id: singularName,\n crd: true,\n };\n });\n};\n\nconst getResources = async (): Promise<DiscoveryResources> => {\n const apiResourceData = await consoleFetchJSON(`${k8sBasePath}/apis`);\n const groupVersionMap = apiResourceData.groups.reduce(\n (acc, { name, versions, preferredVersion: { version } }) => {\n acc[name] = {\n versions: _.map(versions, 'version'),\n preferredVersion: version,\n };\n return acc;\n },\n {},\n );\n const all: Promise<APIResourceList>[] = _.flatten(\n apiResourceData.groups.map((group) =>\n group.versions.map((version) => `/apis/${version.groupVersion}`),\n ),\n )\n .concat(['/api/v1'])\n .map((p) => consoleFetchJSON(`api/kubernetes${p}`).catch((err) => err));\n\n return Promise.all(all).then((data) => {\n const resourceSet = new Set<string>();\n const namespacedSet = new Set<string>();\n data.forEach(\n (d) =>\n d.resources &&\n d.resources.forEach(({ namespaced, name }) => {\n resourceSet.add(name);\n namespaced && namespacedSet.add(name);\n }),\n );\n const allResources = [...resourceSet].sort();\n\n const safeResources = [];\n const adminResources = [];\n const models = _.flatten(data.filter((d) => d.resources).map(defineModels));\n const coreResources = new Set([\n 'roles',\n 'rolebindings',\n 'clusterroles',\n 'clusterrolebindings',\n 'thirdpartyresources',\n 'nodes',\n 'secrets',\n ]);\n allResources.forEach((r) =>\n coreResources.has(r.split('/')[0]) ? adminResources.push(r) : safeResources.push(r),\n );\n const configResources = _.filter(\n models,\n (m) => m.apiGroup === 'config.openshift.io' && m.kind !== 'ClusterOperator',\n );\n const clusterOperatorConfigResources = _.filter(\n models,\n (m) => m.apiGroup === 'operator.openshift.io',\n );\n\n return {\n allResources,\n safeResources,\n adminResources,\n configResources,\n clusterOperatorConfigResources,\n namespacedSet,\n models,\n groupVersionMap,\n };\n });\n};\n\nconst updateResources = () => (dispatch: Dispatch) => {\n dispatch(getResourcesInFlight());\n\n getResources()\n .then((resources) => {\n // Cache the resources whenever discovery completes to improve console load times.\n cacheResources(resources);\n dispatch(receivedResources(resources));\n })\n // eslint-disable-next-line no-console\n .catch((err) => console.error('Fetching resource failed:', err));\n};\n\nconst startAPIDiscovery = () => (dispatch) => {\n // eslint-disable-next-line no-console\n console.log('API discovery method: Polling');\n // Poll API discovery every 30 seconds since we can't watch CRDs\n dispatch(updateResources());\n if (POLLs[apiDiscovery]) {\n clearTimeout(POLLs[apiDiscovery]);\n delete POLLs[apiDiscovery];\n }\n POLLs[apiDiscovery] = setTimeout(\n () => dispatch(startAPIDiscovery()),\n API_DISCOVERY_POLL_INTERVAL,\n );\n};\n\nexport const initApiDiscovery: InitApiDiscovery = (storeInstance) => {\n getCachedResources()\n .then((resources) => {\n if (resources) {\n storeInstance.dispatch(receivedResources(resources));\n }\n // Still perform discovery to refresh the cache.\n storeInstance.dispatch(startAPIDiscovery());\n })\n .catch(() => storeInstance.dispatch(startAPIDiscovery()));\n};\n","const abbrBlacklist = ['ASS'];\n\n/**\n * @deprecated - This is SDK internal function for resource-icon purposes, use Console version instead.\n * Provides an abbreviation string for given kind with respect to abbrBlacklist.\n * @param kind Kind for which the abbreviation is generated.\n * @returns Abbreviation string for given kind.\n * TODO: Use in resource-icon component once it is being migrated to the SDK.\n */\nexport const kindToAbbr = (kind) => {\n const abbrKind = (kind.replace(/[^A-Z]/g, '') || kind.toUpperCase()).slice(0, 4);\n return abbrBlacklist.includes(abbrKind) ? abbrKind.slice(0, -1) : abbrKind;\n};\n","import * as React from 'react';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useStore } from 'react-redux';\nimport { applyMiddleware, combineReducers, createStore, compose, Store } from 'redux';\nimport thunk from 'redux-thunk';\nimport { SDKReducers } from './redux';\nimport { SDKStoreState } from './redux-types';\nimport storeHandler from './storeHandler';\n\nconst composeEnhancers =\n (process.env.NODE_ENV !== 'production' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || compose;\n\n/**\n * `useReduxStore` will provide the store instance if present or else create one along with info if the context was present.\n *\n * @example\n * ```ts\n * function Component () {\n * const {store, storeContextPresent} = useReduxStore()\n * return ...\n * }\n * ```\n */\nexport const useReduxStore = (): { store: Store<any>; storeContextPresent: boolean } => {\n const storeContext = useStore();\n const [storeContextPresent, setStoreContextPresent] = React.useState(false);\n const store = React.useMemo(() => {\n // check if store exists and if not create it\n if (storeContext) {\n setStoreContextPresent(true);\n storeHandler.setStore(storeContext);\n } else {\n // eslint-disable-next-line no-console\n console.log('Creating the SDK redux store');\n setStoreContextPresent(false);\n const storeInstance = createStore(\n combineReducers<SDKStoreState>(SDKReducers),\n {},\n composeEnhancers(applyMiddleware(thunk)),\n );\n storeHandler.setStore(storeInstance);\n }\n return storeHandler.getStore();\n }, [storeContext]);\n\n return { store, storeContextPresent };\n};\n","import { Map as ImmutableMap, fromJS } from 'immutable';\nimport * as _ from 'lodash';\nimport { K8sModel } from '../../../api/common-types';\nimport { getReferenceForModel } from '../../../utils/k8s/k8s-ref';\nimport { getNamespacedResources, allModels } from '../../../utils/k8s/k8s-utils';\nimport { K8sState } from '../../redux-types';\nimport { ActionType, K8sAction } from '../actions/k8s';\nimport { getK8sDataById } from './k8sSelector';\n\nconst getQN: (obj) => string = (obj) => {\n const { name, namespace } = obj.metadata;\n // Name + namespace is not unique for PackageManifest resources, so include the catalog source.\n // TODO: We should be able to remove this when the upstream OLM bug is fixed:\n // https://bugzilla.redhat.com/show_bug.cgi?id=1814822\n if (obj.apiVersion === 'packages.operators.coreos.com/v1' && obj.kind === 'PackageManifest') {\n return `(${obj.status?.catalogSource})-${name}`;\n }\n return (namespace ? `(${namespace})-` : '') + name;\n};\n\nconst moreRecent = (a, b) => {\n const metaA = a.get('metadata').toJSON();\n const metaB = b.get('metadata').toJSON();\n if (metaA.uid !== metaB.uid) {\n return new Date(metaA.creationTimestamp) > new Date(metaB.creationTimestamp);\n }\n return parseInt(metaA.resourceVersion, 10) > parseInt(metaB.resourceVersion, 10);\n};\n\nconst removeFromList = (list, resource) => {\n const qualifiedName = getQN(resource);\n // eslint-disable-next-line no-console\n console.log(`deleting ${qualifiedName}`);\n return list.delete(qualifiedName);\n};\n\nconst updateList = (list: ImmutableMap<string, any>, nextJS) => {\n const qualifiedName = getQN(nextJS);\n const current = list.get(qualifiedName);\n const next = fromJS(nextJS);\n\n if (!current) {\n return list.set(qualifiedName, next);\n }\n\n if (!moreRecent(next, current)) {\n return list;\n }\n\n // TODO: (kans) only store the data for things we display ...\n // and then only do this comparison for the same stuff!\n if (\n current\n .deleteIn(['metadata', 'resourceVersion'])\n .equals(next.deleteIn(['metadata', 'resourceVersion']))\n ) {\n // If the only thing that differs is resource version, don't fire an update.\n return list;\n }\n\n return list.set(qualifiedName, next);\n};\n\nconst loadList = (oldList, resources) => {\n const existingKeys = new Set(oldList.keys());\n return oldList.withMutations((list) => {\n (resources || []).forEach((r) => {\n const qualifiedName = getQN(r);\n existingKeys.delete(qualifiedName);\n const next = fromJS(r);\n const current = list.get(qualifiedName);\n if (!current || moreRecent(next, current)) {\n list.set(qualifiedName, next);\n }\n });\n existingKeys.forEach((k) => {\n const r = list.get(k);\n const metadata = r.get('metadata').toJSON();\n if (!metadata.deletionTimestamp) {\n // eslint-disable-next-line no-console\n console.warn(`${metadata.namespace}-${metadata.name} is gone with no deletion timestamp!`);\n }\n list.delete(k);\n });\n });\n};\n\nconst sdkK8sReducers = (state: K8sState, action: K8sAction): K8sState => {\n if (!state) {\n return fromJS({\n RESOURCES: {\n // Loaded k8s models (CRDs), might also be empty on a cluster without any CRD!\n models: ImmutableMap<string, K8sModel>(),\n // Indicates whether a loading is 'in flight' (in progress), could jump back and forth.\n inFlight: false,\n // Indicates whether a some data was ever loaded successfully, changes just once to true.\n loaded: false,\n },\n });\n }\n\n let newList;\n switch (action.type) {\n case ActionType.GetResourcesInFlight:\n return state.setIn(['RESOURCES', 'inFlight'], true);\n\n case ActionType.ReceivedResources:\n return (\n action.payload.resources.models\n .filter((model) => !state.getIn(['RESOURCES', 'models']).has(getReferenceForModel(model)))\n .filter((model) => {\n const existingModel = state.getIn(['RESOURCES', 'models', model.kind]);\n return (\n !existingModel || getReferenceForModel(existingModel) !== getReferenceForModel(model)\n );\n })\n .map((model) => {\n model.namespaced\n ? getNamespacedResources().add(getReferenceForModel(model))\n : getNamespacedResources().delete(getReferenceForModel(model));\n return model;\n })\n .reduce((prevState, newModel) => {\n // FIXME: Need to use `kind` as model reference for legacy components accessing k8s primitives\n const [modelRef, model] = allModels().findEntry(\n (staticModel) => getReferenceForModel(staticModel) === getReferenceForModel(newModel),\n ) || [getReferenceForModel(newModel), newModel];\n // Verbs and short names are not part of the static model definitions, so use the values found during discovery.\n return prevState.updateIn(['RESOURCES', 'models'], (models) =>\n models.set(modelRef, {\n ...model,\n verbs: newModel.verbs,\n shortNames: newModel.shortNames,\n }),\n );\n }, state)\n // TODO: Determine where these are used and implement filtering in that component instead of storing in Redux\n .setIn(['RESOURCES', 'allResources'], action.payload.resources.allResources)\n .setIn(['RESOURCES', 'safeResources'], action.payload.resources.safeResources)\n .setIn(['RESOURCES', 'adminResources'], action.payload.resources.adminResources)\n .setIn(['RESOURCES', 'configResources'], action.payload.resources.configResources)\n .setIn(\n ['RESOURCES', 'clusterOperatorConfigResources'],\n action.payload.resources.clusterOperatorConfigResources,\n )\n .setIn(['RESOURCES', 'namespacedSet'], action.payload.resources.namespacedSet)\n .setIn(['RESOURCES', 'groupToVersionMap'], action.payload.resources.groupVersionMap)\n .setIn(['RESOURCES', 'inFlight'], false)\n .setIn(['RESOURCES', 'loaded'], true)\n );\n\n case ActionType.StartWatchK8sObject:\n return state.set(\n action.payload.id,\n ImmutableMap({\n loadError: '',\n loaded: false,\n data: {},\n }),\n );\n\n case ActionType.StartWatchK8sList:\n if (getK8sDataById(state, action.payload.id)) {\n return state;\n }\n\n // We mergeDeep instead of overwriting state because it's possible to add filters before load/watching\n return state.mergeDeep({\n [action.payload.id]: {\n loadError: '',\n // has the data set been loaded successfully\n loaded: false,\n // Canonical data\n data: ImmutableMap(),\n // client side filters to be applied externally (ie, we keep all data intact)\n filters: ImmutableMap(),\n // The name of an element in the list that has been \"selected\"\n selected: null,\n },\n });\n\n case ActionType.ModifyObject: {\n const { k8sObjects, id } = action.payload;\n let currentJS = getK8sDataById(state, id) || {};\n // getIn can return JS object or Immutable object\n if (currentJS.toJSON) {\n currentJS = currentJS.toJSON();\n currentJS.metadata.resourceVersion = k8sObjects.metadata.resourceVersion;\n if (_.isEqual(currentJS, k8sObjects)) {\n // If the only thing that differs is resource version, don't fire an update.\n return state;\n }\n }\n return state.mergeIn([id], {\n loadError: '',\n loaded: true,\n data: k8sObjects,\n });\n }\n\n case ActionType.StopWatchK8s:\n return state.delete(action.payload.id);\n\n case ActionType.Errored:\n if (!getK8sDataById(state, action.payload.id)) {\n return state;\n }\n /* Don't overwrite data or loaded state if there was an error. Better to\n * keep stale data around than to suddenly have it disappear on a user.\n */\n return state.setIn([action.payload.id, 'loadError'], action.payload.k8sObjects);\n\n case ActionType.Loaded:\n if (!getK8sDataById(state, action.payload.id)) {\n return state;\n }\n // eslint-disable-next-line no-console\n console.info(`loaded ${action.payload.id}`);\n // eslint-disable-next-line no-param-reassign\n state = state.mergeDeep({\n [action.payload.id]: { loaded: true, loadError: '' },\n });\n newList = loadList(getK8sDataById(state, action.payload.id), action.payload.k8sObjects);\n break;\n\n case ActionType.UpdateListFromWS:\n newList = getK8sDataById(state, action.payload.id);\n // k8sObjects is an array of k8s WS Events\n for (const { type, object } of action.payload.k8sObjects) {\n switch (type) {\n case 'DELETED':\n newList = removeFromList(newList, object);\n break;\n case 'ADDED':\n case 'MODIFIED':\n newList = updateList(newList, object);\n break;\n default:\n // possible `ERROR` type or other\n // eslint-disable-next-line no-console\n console.warn(`unknown websocket action: ${type}`);\n // console.warn(`unknown websocket action: ${type} (${_.get(event, 'object.message')})`);\n }\n }\n break;\n\n case ActionType.BulkAddToList:\n if (!getK8sDataById(state, action.payload.id)) {\n return state;\n }\n newList = getK8sDataById(state, action.payload.id);\n newList = newList.merge(\n action.payload.k8sObjects.reduce(\n (map, obj) => map.set(getQN(obj), fromJS(obj)),\n ImmutableMap(),\n ),\n );\n break;\n case ActionType.FilterList:\n return state.setIn([action.payload.id, 'filters', action.payload.name], action.payload.value);\n default:\n return state;\n }\n return state.setIn([action.payload.id, 'data'], newList);\n};\n\nexport default sdkK8sReducers;\n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"URLQuery\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fetchURL\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"url\"}}}],\"directives\":[]}]}}],\"loc\":{\"start\":0,\"end\":56}};\n doc.loc.source = {\"body\":\"query URLQuery($url: String!) {\\n fetchURL(url: $url)\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n\n module.exports = doc;\n \n module.exports[\"URLQuery\"] = oneQuery(doc, \"URLQuery\");\n \n","import * as React from 'react';\nimport { Checkbox, Skeleton } from '@patternfly/react-core';\nimport {\n UserPreferenceCheckboxField as CheckboxFieldType,\n UserPreferenceCheckboxFieldValue,\n} from '@console/dynamic-plugin-sdk/src';\nimport { useTelemetry } from '@console/shared/src/hooks/useTelemetry';\nimport { useUserSettings } from '@console/shared/src/hooks/useUserSettings';\nimport { UserPreferenceFieldProps } from './types';\n\nimport './UserPreferenceField.scss';\n\ntype UserPreferenceCheckboxFieldProps = UserPreferenceFieldProps<CheckboxFieldType>;\n\nconst UserPreferenceCheckboxField: React.FC<UserPreferenceCheckboxFieldProps> = ({\n id,\n label,\n userSettingsKey,\n trueValue,\n falseValue,\n defaultValue,\n description,\n}) => {\n // resources and calls to hooks\n const [\n currentUserPreferenceValue,\n setCurrentUserPreferenceValue,\n currentUserPreferenceValueLoaded,\n ] = useUserSettings<UserPreferenceCheckboxFieldValue>(userSettingsKey);\n const fireTelemetryEvent = useTelemetry();\n\n const loaded: boolean = currentUserPreferenceValueLoaded;\n\n if (defaultValue && loaded && !currentUserPreferenceValue) {\n setCurrentUserPreferenceValue(defaultValue);\n }\n\n // utils and callbacks\n const onChange = (_event, checked: boolean) => {\n const checkedValue: UserPreferenceCheckboxFieldValue = checked ? trueValue : falseValue;\n checkedValue !== currentUserPreferenceValue && setCurrentUserPreferenceValue(checkedValue);\n fireTelemetryEvent('User Preference Changed', {\n property: userSettingsKey,\n value: checkedValue,\n });\n };\n\n return loaded ? (\n <>\n {description && (\n <div className=\"co-help-text co-user-preference-field--description\">{description}</div>\n )}\n <Checkbox\n id={id}\n label={label}\n isChecked={currentUserPreferenceValue === trueValue}\n data-checked-state={currentUserPreferenceValue === trueValue}\n onChange={onChange}\n data-test={`checkbox ${id}`}\n />\n </>\n ) : (\n <Skeleton height=\"30px\" width=\"100%\" data-test={`dropdown skeleton ${id}`} />\n );\n};\nexport default UserPreferenceCheckboxField;\n","import * as React from 'react';\nimport { deseralizeData, seralizeData } from '../utils/user-settings';\n\nexport const useUserSettingsLocalStorage = <T>(\n storageKey: string,\n userSettingsKey: string,\n defaultValue: T,\n sync = false,\n session = false, // use sessionStorage if set to `true`\n): [T, React.Dispatch<React.SetStateAction<T>>] => {\n // Mount status for safty state updates\n const mounted = React.useRef(true);\n React.useEffect(() => () => (mounted.current = false), []);\n\n const storage = session ? sessionStorage : localStorage;\n const keyRef = React.useRef(userSettingsKey);\n const defaultValueRef = React.useRef(defaultValue);\n const [data, setData] = React.useState(() => {\n const valueInStorage =\n storage.getItem(storageKey) !== null && deseralizeData(storage.getItem(storageKey));\n return valueInStorage?.hasOwnProperty(keyRef.current) &&\n valueInStorage[keyRef.current] !== undefined\n ? valueInStorage[keyRef.current]\n : defaultValueRef.current;\n });\n const dataRef = React.useRef<T>(data);\n dataRef.current = data;\n\n const storageUpdated = React.useCallback(\n (event: StorageEvent) => {\n if (mounted.current && event.storageArea === storage && event.key === storageKey) {\n const configMapData = deseralizeData(event.newValue);\n const newData = configMapData?.[keyRef.current];\n\n if (newData !== undefined && seralizeData(newData) !== seralizeData(dataRef.current)) {\n setData(newData);\n }\n }\n },\n [storageKey, storage],\n );\n\n React.useEffect(() => {\n if (sync) {\n window.addEventListener('storage', storageUpdated);\n }\n return () => {\n if (sync) {\n window.removeEventListener('storage', storageUpdated);\n }\n };\n }, [storageUpdated, sync]);\n\n const updateData = React.useCallback<React.Dispatch<React.SetStateAction<T>>>(\n (action: React.SetStateAction<T>) => {\n const previousData = dataRef.current;\n const newState =\n typeof action === 'function' ? (action as (prevState: T) => T)(previousData) : action;\n const configMapData = deseralizeData(storage.getItem(storageKey)) ?? {};\n if (\n newState !== undefined &&\n seralizeData(newState) !== seralizeData(configMapData?.[keyRef.current])\n ) {\n if (mounted.current) {\n setData(newState);\n }\n\n // Trigger update also when unmounted\n const dataToUpdate = {\n ...configMapData,\n ...{\n [keyRef.current]: newState,\n },\n };\n const newValue = seralizeData(dataToUpdate);\n\n // create a storage event to dispatch locally since browser windows do not fire the\n // storage event if the change originated from the current window\n const event = new StorageEvent('storage', {\n storageArea: storage,\n key: storageKey,\n newValue,\n oldValue: storage.getItem(storageKey),\n url: window.location.toString(),\n });\n\n try {\n // update storage\n storage.setItem(storageKey, newValue);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`Error while updating local storage for key ${storageKey}`, err);\n }\n\n // dispatch storage event\n window.dispatchEvent(event);\n }\n },\n [storageKey, storage],\n );\n\n return [data, updateData];\n};\n","import * as React from 'react';\nimport { UserPreferenceCustomField as CustomFieldType } from '@console/dynamic-plugin-sdk/src';\nimport { ErrorBoundaryInline } from '@console/shared/src/components/error';\nimport { UserPreferenceFieldProps } from './types';\n\ntype UserPreferenceCustomFieldProps = UserPreferenceFieldProps<CustomFieldType>;\n\nconst UserPreferenceCustomField: React.FC<UserPreferenceCustomFieldProps> = ({\n component: CustomComponent,\n props: customComponentProps,\n}) =>\n CustomComponent ? (\n <ErrorBoundaryInline>\n <CustomComponent {...customComponentProps} />\n </ErrorBoundaryInline>\n ) : null;\nexport default UserPreferenceCustomField;\n","import * as React from 'react';\nimport { Skeleton } from '@patternfly/react-core';\nimport {\n Select as SelectDeprecated,\n SelectOption as SelectOptionDeprecated,\n SelectVariant as SelectVariantDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { useTranslation } from 'react-i18next';\nimport { UserPreferenceDropdownField as DropdownFieldType } from '@console/dynamic-plugin-sdk/src';\nimport { useTelemetry, useUserSettings } from '@console/shared';\nimport { UserPreferenceFieldProps } from './types';\n\nimport './UserPreferenceField.scss';\n\ntype UserPreferenceDropdownFieldProps = UserPreferenceFieldProps<DropdownFieldType>;\n\nconst UserPreferenceDropdownField: React.FC<UserPreferenceDropdownFieldProps> = ({\n id,\n userSettingsKey,\n defaultValue,\n options,\n description,\n}) => {\n // resources and calls to hooks\n const { t } = useTranslation();\n const fireTelemetryEvent = useTelemetry();\n const [\n currentUserPreferenceValue,\n setCurrentUserPreferenceValue,\n currentUserPreferenceValueLoaded,\n ] = useUserSettings<string>(userSettingsKey);\n const [dropdownOpen, setDropdownOpen] = React.useState(false);\n const selectOptions: JSX.Element[] = React.useMemo(\n () =>\n options.map((dropdownOption, index) => {\n const key = `${dropdownOption.label}${index}`;\n return (\n <SelectOptionDeprecated\n key={key}\n value={dropdownOption.label}\n description={dropdownOption?.description}\n />\n );\n }),\n [options],\n );\n const loaded: boolean = currentUserPreferenceValueLoaded;\n\n const isCurrentUserPreferenceValuePresentInOptions = options.find(\n (option) => option.value === currentUserPreferenceValue,\n );\n\n if (\n (defaultValue && loaded && !currentUserPreferenceValue) ||\n (defaultValue && loaded && !isCurrentUserPreferenceValuePresentInOptions)\n ) {\n setCurrentUserPreferenceValue(defaultValue);\n }\n\n // utils and callbacks\n const getDropdownValueFromLabel = (searchLabel: string): string =>\n options.find((option) => option.label === searchLabel)?.value;\n const getDropdownLabelFromValue = (searchValue: string): string =>\n options.find((option) => option.value === searchValue)?.label;\n const onToggle = (_event, isOpen: boolean) => setDropdownOpen(isOpen);\n const onSelect = (_, selection) => {\n const selectedValue = getDropdownValueFromLabel(selection);\n selectedValue !== currentUserPreferenceValue && setCurrentUserPreferenceValue(selectedValue);\n setDropdownOpen(false);\n fireTelemetryEvent('User Preference Changed', {\n property: userSettingsKey,\n value: selectedValue,\n });\n };\n\n return loaded ? (\n <>\n {description && (\n <div className=\"co-help-text co-user-preference-field--description\">{description}</div>\n )}\n <SelectDeprecated\n toggleId={id}\n variant={SelectVariantDeprecated.single}\n isOpen={dropdownOpen}\n selections={getDropdownLabelFromValue(currentUserPreferenceValue)}\n onToggle={onToggle}\n onSelect={onSelect}\n placeholderText={t('console-app~Select an option')}\n data-test={`dropdown ${id}`}\n >\n {selectOptions}\n </SelectDeprecated>\n </>\n ) : (\n <Skeleton height=\"30px\" width=\"100%\" data-test={`dropdown skeleton ${id}`} />\n );\n};\nexport default UserPreferenceDropdownField;\n","import * as React from 'react';\nimport { LineBuffer } from './line-buffer';\n\nconst useToggleLineBuffer = (bufferSize: number | null) => {\n const buffer = React.useRef(null);\n React.useEffect(() => {\n buffer.current = new LineBuffer(bufferSize);\n }, [bufferSize]);\n\n return buffer;\n};\n\nexport default useToggleLineBuffer;\n","import * as _ from 'lodash-es';\n\n// React's \"isRequired\" means that not only must key exist, but the *value* must be truthy too! This doesn't fly with NSs\nexport const namespaceProptype = function (\n props: { namespace: string },\n propName: string,\n componentName: string,\n) {\n if (!props.hasOwnProperty('namespace')) {\n throw new Error(`${componentName}: \"namespace\" is a required prop`);\n }\n if (propName !== 'namespace') {\n return;\n }\n if (props.namespace !== undefined && !_.isString(props.namespace)) {\n throw new Error(`${componentName}: \"namespace\" must be a string`);\n }\n};\n","import * as React from 'react';\nimport { FLAGS } from '@console/shared/src/constants';\nimport { Area } from '@console/internal/components/graphs/area';\nimport { humanizeDecimalBytesPerSec } from '@console/internal/components/utils';\nimport { connectToFlags, WithFlagsProps } from '../../reducers/connectToFlags';\nimport { useTranslation } from 'react-i18next';\nimport { K8sResourceKind } from '@console/internal/module/k8s';\nimport { Grid, GridItem, Card, CardBody, CardHeader, CardTitle } from '@patternfly/react-core';\nimport Dashboard from '@console/shared/src/components/dashboard/Dashboard';\n\n// TODO Update to use QueryBrowser for each graph\nexport const RouteMetrics = connectToFlags<RouteMetricsProps>(FLAGS.CAN_GET_NS)(\n ({ obj, flags }: RouteMetricsProps) => {\n const { t } = useTranslation();\n if (!flags[FLAGS.CAN_GET_NS]) {\n return null;\n }\n const namespaceRouteQuery = `{exported_namespace=\"${obj.metadata.namespace}\",route=\"${obj.metadata.name}\"}[5m]`;\n return (\n <Dashboard className=\"resource-metrics-dashboard\">\n <Grid hasGutter>\n <GridItem xl={6} lg={12}>\n <Card className=\"resource-metrics-dashboard__card\">\n <CardHeader>\n <CardTitle>{t('public~Traffic in')}</CardTitle>\n </CardHeader>\n <CardBody className=\"resource-metrics-dashboard__card-body\">\n <Area\n humanize={humanizeDecimalBytesPerSec}\n query={`sum without (instance,exported_pod,exported_service,pod,server) (irate(haproxy_server_bytes_in_total${namespaceRouteQuery}))`}\n />\n </CardBody>\n </Card>\n </GridItem>\n <GridItem xl={6} lg={12}>\n <Card className=\"resource-metrics-dashboard__card\">\n <CardHeader>\n <CardTitle>{t('public~Traffic out')}</CardTitle>\n </CardHeader>\n <CardBody className=\"resource-metrics-dashboard__card-body\">\n <Area\n humanize={humanizeDecimalBytesPerSec}\n query={`sum without (instance,exported_pod,exported_service,pod,server) (irate(haproxy_server_bytes_out_total${namespaceRouteQuery}))`}\n />\n </CardBody>\n </Card>\n </GridItem>\n <GridItem xl={6} lg={12}>\n <Card className=\"resource-metrics-dashboard__card\">\n <CardHeader>\n <CardTitle>{t('public~Connection rate')}</CardTitle>\n </CardHeader>\n <CardBody className=\"resource-metrics-dashboard__card-body\">\n <Area\n query={`sum without (instance,exported_pod,exported_service,pod,server) (irate(haproxy_backend_connections_total${namespaceRouteQuery}))`}\n />\n </CardBody>\n </Card>\n </GridItem>\n </Grid>\n </Dashboard>\n );\n },\n);\n\nexport type RouteMetricsProps = {\n obj: K8sResourceKind;\n} & WithFlagsProps;\n","module.exports = __webpack_public_path__ + \"assets/public/imgs/restricted-sign.svg\";","// Keys for special 'group by' options\n// Should not be valid label keys to avoid conflicts. https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-set\nexport enum OverviewSpecialGroup {\n GROUP_BY_APPLICATION = '#GROUP_BY_APPLICATION#',\n GROUP_BY_RESOURCE = '#GROUP_BY_RESOURCE#',\n}\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport * as fuzzy from 'fuzzysearch';\nimport { useNavigate } from 'react-router-dom-v5-compat';\n\nimport { K8sKind, k8sList, k8sPatch, K8sResourceKind } from '../../module/k8s';\nimport { DeploymentModel, DeploymentConfigModel, StatefulSetModel } from '../../models';\nimport { createModalLauncher, ModalTitle, ModalBody, ModalSubmitFooter } from '../factory/modal';\nimport { Dropdown, ResourceIcon, ResourceName, resourcePathFromModel } from '../utils';\nimport { RadioInput } from '../radio';\n/* eslint-disable import/named */\nimport { Trans, useTranslation } from 'react-i18next';\n\nconst workloadResourceModels = [DeploymentModel, DeploymentConfigModel, StatefulSetModel];\nconst getContainers = (workload: K8sResourceKind) =>\n _.get(workload, 'spec.template.spec.containers') || [];\n\nexport const AddSecretToWorkloadModal: React.FC<AddSecretToWorkloadModalProps> = (props) => {\n const { namespace, secretName } = props;\n const { t } = useTranslation();\n const navigate = useNavigate();\n\n const [inProgress, setInProgress] = React.useState(false);\n const [errorMessage, setErrorMessage] = React.useState('');\n const [workloadOptions, setWorkloadOptions] = React.useState({});\n const [workloadsByUID, setWorkloadsByUID] = React.useState({});\n const [selectedWorkloadUID, setSelectedWorkloadUID] = React.useState('');\n const [addAs, setAddAs] = React.useState('environment');\n const [prefix, setPrefix] = React.useState('');\n const [mountPath, setMountPath] = React.useState('');\n\n React.useEffect(() => {\n const opts = { ns: namespace };\n\n Promise.all(\n workloadResourceModels.map((model) => {\n return k8sList(model, opts)\n .catch((err) => {\n setErrorMessage(err.message);\n return [];\n })\n .then((res: K8sResourceKind[]): WorkloadItem[] => res.map((obj) => ({ model, obj })));\n }),\n ).then((responses) => {\n // TODO: Group by kind.\n const allItems: WorkloadItem[] = _.flatten(responses);\n const workloadsByUid = _.keyBy(allItems, 'obj.metadata.uid');\n const sortedItems = _.orderBy(allItems, ['obj.metadata.name', 'model.kind'], ['asc', 'asc']);\n const options = _.reduce(\n sortedItems,\n (list, item) => {\n const { name, uid } = item.obj.metadata;\n list[uid] = <ResourceName kind={item.model.kind} name={name} />;\n return list;\n },\n {},\n );\n setWorkloadOptions(options);\n setWorkloadsByUID(workloadsByUid);\n });\n }, [namespace]);\n\n const autocompleteFilter = (text, item) => {\n return fuzzy(text, item.props.name);\n };\n\n const onWorkloadChange = (selected: string) => {\n setSelectedWorkloadUID(selected);\n };\n\n const onAddAsChange: React.ReactEventHandler<HTMLInputElement> = (event) => {\n setAddAs(event.currentTarget.value);\n };\n\n const getEnvPatches = (obj) => {\n const envFrom = {\n secretRef: {\n name: secretName,\n },\n prefix,\n };\n\n // Add `envFrom` to all containers.\n // TODO: Let use the user pick the container.\n const containers = getContainers(obj);\n const patches = containers.map((container, i) => {\n // Create the array if it doesn't exist. Append to the array otherwise.\n const containerPatch = _.isEmpty(container.envFrom)\n ? { op: 'add', path: `/spec/template/spec/containers/${i}/envFrom`, value: [envFrom] }\n : { op: 'add', path: `/spec/template/spec/containers/${i}/envFrom/-`, value: envFrom };\n return containerPatch;\n });\n\n return patches;\n };\n\n const getVolumePatches = (obj) => {\n const mount = {\n name: secretName,\n readOnly: true,\n mountPath,\n };\n\n // Add a volume mount to all containers.\n // TODO: Let use the user pick the container.\n const containers = getContainers(obj);\n const patches = containers.map((container, i) => {\n // Create the array if it doesn't exist. Append to the array otherwise.\n const containerPatch = _.isEmpty(container.volumeMounts)\n ? { op: 'add', path: `/spec/template/spec/containers/${i}/volumeMounts`, value: [mount] }\n : { op: 'add', path: `/spec/template/spec/containers/${i}/volumeMounts/-`, value: mount };\n return containerPatch;\n });\n\n const volume = {\n name: secretName,\n secret: { secretName },\n };\n const existingVolumes = _.get(obj, 'spec.template.spec.volumes');\n\n // Create the array if it doesn't exist. Append to the array otherwise.\n const volumePatch = _.isEmpty(existingVolumes)\n ? { op: 'add', path: '/spec/template/spec/volumes', value: [volume] }\n : { op: 'add', path: '/spec/template/spec/volumes/-', value: volume };\n return [...patches, volumePatch];\n };\n\n const getPatches = (obj) => {\n return addAs === 'environment' ? getEnvPatches(obj) : getVolumePatches(obj);\n };\n\n const submit = (event: React.FormEvent<EventTarget>) => {\n event.preventDefault();\n\n if (!selectedWorkloadUID) {\n setErrorMessage('You must select a workload.');\n return;\n }\n\n setInProgress(true);\n setErrorMessage('');\n\n const workload = workloadsByUID[selectedWorkloadUID];\n const { model, obj } = workload;\n const patches = getPatches(obj);\n k8sPatch(model, obj, patches)\n .then(() => {\n setInProgress(false);\n props.close();\n const { name, namespace: ns } = obj.metadata;\n navigate(resourcePathFromModel(model, name, ns));\n })\n .catch(({ message: err }) => {\n setInProgress(false);\n setErrorMessage(err);\n });\n };\n\n const addAsEnvironment = addAs === 'environment';\n const addAsVolume = addAs === 'volume';\n const selectWorkloadPlaceholder = t('public~Select a workload');\n\n return (\n <form\n onSubmit={submit}\n name=\"co-add-secret-to-workload\"\n className=\"co-add-secret-to-workload modal-content\"\n >\n <ModalTitle>{t('public~Add secret to workload')}</ModalTitle>\n <ModalBody>\n <p className=\"modal-paragraph\">\n <Trans t={t} ns=\"public\">\n Add all values from <ResourceIcon kind=\"Secret\" />\n {{ secretName }} to a workload as environment variables or a volume.\n </Trans>\n </p>\n <div className=\"form-group\">\n <label\n className=\"control-label co-required\"\n htmlFor=\"co-add-secret-to-workload__workload\"\n >\n {t('public~Add this secret to workload')}\n </label>\n <Dropdown\n items={workloadOptions}\n selectedKey={selectedWorkloadUID}\n title={selectWorkloadPlaceholder}\n onChange={onWorkloadChange}\n autocompleteFilter={autocompleteFilter}\n autocompletePlaceholder={selectWorkloadPlaceholder}\n id=\"co-add-secret-to-workload__workload\"\n data-test=\"add-secret-to-workload-button\"\n />\n </div>\n <fieldset>\n <legend className=\"co-legend co-required\">{t('public~Add secret as')}</legend>\n <RadioInput\n title={t('public~Environment variables')}\n name=\"co-add-secret-to-workload__add-as\"\n id=\"co-add-secret-to-workload__envvars\"\n value=\"environment\"\n onChange={onAddAsChange}\n checked={addAsEnvironment}\n />\n {addAsEnvironment && (\n <div className=\"co-m-radio-desc\">\n <div className=\"form-group\">\n <label htmlFor=\"co-add-secret-to-workload__prefix\">{t('public~Prefix')}</label>\n <input\n className=\"pf-v5-c-form-control\"\n name=\"prefix\"\n id=\"co-add-secret-to-workload__prefix\"\n data-test=\"add-secret-to-workload-prefix\"\n placeholder=\"(optional)\"\n type=\"text\"\n onChange={(e) => setPrefix(e.currentTarget.value)}\n />\n </div>\n </div>\n )}\n <RadioInput\n title={t('public~Volume')}\n name=\"co-add-secret-to-workload__add-as\"\n id=\"co-add-secret-to-workload__volume\"\n value=\"volume\"\n onChange={onAddAsChange}\n checked={addAsVolume}\n />\n {addAsVolume && (\n <div className=\"co-m-radio-desc\">\n <div className=\"form-group\">\n <label htmlFor=\"co-add-secret-to-workload__mountpath\" className=\"co-required\">\n {t('public~Mount path')}\n </label>\n <input\n className=\"pf-v5-c-form-control\"\n name=\"mountPath\"\n id=\"co-add-secret-to-workload__mountpath\"\n data-test=\"add-secret-to-workload-mountpath\"\n type=\"text\"\n onChange={(e) => setMountPath(e.currentTarget.value)}\n required\n />\n </div>\n </div>\n )}\n </fieldset>\n </ModalBody>\n <ModalSubmitFooter\n errorMessage={errorMessage}\n inProgress={inProgress}\n submitText={t('public~Save')}\n cancel={props.cancel}\n />\n </form>\n );\n};\n\nexport const configureAddSecretToWorkloadModal = createModalLauncher<AddSecretToWorkloadModalProps>(\n AddSecretToWorkloadModal,\n);\n\ntype WorkloadItem = {\n model: K8sKind;\n obj: K8sResourceKind;\n};\n\nexport type AddSecretToWorkloadModalProps = {\n cancel: () => void;\n close: () => void;\n secretName: string;\n namespace: string;\n blocking?: boolean;\n};\n\nexport type AddSecretToWorkloadModalState = {\n inProgress: boolean;\n errorMessage: string;\n workloadOptions: {\n [uid: string]: React.ReactNode;\n };\n workloadsByUID: {\n [uid: string]: WorkloadItem;\n };\n selectedWorkloadUID: string;\n addAs: string;\n prefix: string;\n mountPath: string;\n};\n","import { ALL_NAMESPACES_KEY } from '@console/shared/src/constants';\nimport { checkNamespaceExists } from './checkNamespaceExists';\n\nexport const getValueForNamespace = async (\n preferredNamespace: string,\n lastNamespace: string,\n useProjects: boolean,\n): Promise<string> => {\n if (await checkNamespaceExists(preferredNamespace, useProjects)) {\n return preferredNamespace;\n }\n if (await checkNamespaceExists(lastNamespace, useProjects)) {\n return lastNamespace;\n }\n return ALL_NAMESPACES_KEY;\n};\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport useMirroredLocalState, { UseMirroredLocalStateReturn } from './useMirroredLocalState';\nimport { setOrRemoveQueryArgument } from './utils';\n\n/**\n * Handles a state management hack-fix around the row filters dropdown.\n * Fixes https://bugzilla.redhat.com/show_bug.cgi?id=2070720\n * TODO: Refactor FilterToolbar to use proper state management: https://issues.redhat.com/browse/CONSOLE-3147\n *\n * This is a hack fix due to the violation in state management in FilterToolbar. This hook should\n * be deleted once proper React state management has been implemented.\n */\nconst useRowFilterFix = (\n params: URLSearchParams,\n filters: { [key: string]: string[] },\n filterKeys: { [key: string]: string },\n defaultSelections: string[],\n): UseMirroredLocalStateReturn<string[]> => {\n const syncRowFilterParams = React.useCallback(\n (selected) => {\n _.forIn(filters, (value, key) => {\n const recognized = _.filter(selected, (item) => value.includes(item));\n setOrRemoveQueryArgument(filterKeys[key], recognized.join(','));\n });\n },\n [filters, filterKeys],\n );\n\n const selectedRowFilters = _.flatMap(filterKeys, (f) => params.get(f)?.split(',') ?? []);\n\n return useMirroredLocalState<string[]>({\n externalChangeHandler: syncRowFilterParams,\n externalState: selectedRowFilters,\n defaultState: defaultSelections,\n });\n};\n\nexport default useRowFilterFix;\n","import * as React from 'react';\nimport useMirroredLocalState, { UseMirroredLocalStateReturn } from './useMirroredLocalState';\nimport { setOrRemoveQueryArgument } from './utils';\n\n/**\n * Handles a state management hack-fix around the label filters auto complete field.\n * Fixes https://bugzilla.redhat.com/show_bug.cgi?id=2070720\n * TODO: Refactor FilterToolbar to use proper state management: https://issues.redhat.com/browse/CONSOLE-3147\n *\n * This is a hack fix due to the violation in state management in FilterToolbar. This hook should\n * be deleted once proper React state management has been implemented.\n */\nconst useLabelSelectorFix = (\n params: URLSearchParams,\n labelFilterQueryArgumentKey: string,\n): UseMirroredLocalStateReturn<string[]> => {\n const syncSearchParams = React.useCallback(\n (values: string[]) => {\n setOrRemoveQueryArgument(labelFilterQueryArgumentKey, values.join(','));\n },\n [labelFilterQueryArgumentKey],\n );\n\n const labelFilters = params.get(labelFilterQueryArgumentKey)?.split(',') ?? [];\n\n return useMirroredLocalState<string[]>({\n externalState: labelFilters,\n externalChangeHandler: syncSearchParams,\n defaultState: [],\n });\n};\n\nexport default useLabelSelectorFix;\n","import { useDeepCompareMemoize } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/useDeepCompareMemoize';\nimport { useState, useMemo, useCallback } from 'react';\nimport { setOrRemoveQueryArgument } from './utils';\nimport { RowSearchFilter } from '@console/dynamic-plugin-sdk/src/extensions/console-types';\n\n/**\n * Handles a state management hack-fix around the label filters auto complete field.\n * Fixes https://bugzilla.redhat.com/show_bug.cgi?id=2070720\n * TODO: Refactor FilterToolbar to use proper state management: https://issues.redhat.com/browse/CONSOLE-3147\n *\n * This is a hack fix due to the violation in state management in FilterToolbar. This hook should\n * be deleted once proper React state management has been implemented.\n */\nconst useSearchFilters = (searchFilters: RowSearchFilter[], uniqueFilterName: string) => {\n const searchFiltersObject = useMemo(\n () =>\n (searchFilters || []).reduce((acc, filter) => {\n acc[filter?.type] = filter;\n return acc;\n }, {} as { [key: string]: RowSearchFilter }),\n [searchFilters],\n );\n\n const queryParams = useDeepCompareMemoize(new URLSearchParams(location.search));\n\n const searchFiltersValues: { [filterName: string]: string } = useMemo(\n () =>\n (searchFilters || []).reduce((acc, filter) => {\n const queryKey = uniqueFilterName ? `${uniqueFilterName}-${filter?.type}` : filter?.type;\n const queryValue = queryParams.get(queryKey);\n\n if (queryValue) {\n acc[filter?.type] = queryValue;\n }\n return acc;\n }, {}),\n [queryParams, uniqueFilterName, searchFilters],\n );\n\n const [searchFiltersState, setSearchFiltersState] = useState(searchFiltersValues);\n\n const changeSearchFiltersState = useCallback(\n (filterName: string, value: string) => {\n setSearchFiltersState((state) => ({\n ...state,\n [filterName]: value,\n }));\n setTimeout(\n () =>\n setOrRemoveQueryArgument(\n uniqueFilterName ? `${uniqueFilterName}-${filterName}` : filterName,\n value,\n ),\n 0,\n );\n },\n [setSearchFiltersState, uniqueFilterName],\n );\n\n const flushSearchFiltersState = useCallback(() => {\n setSearchFiltersState({});\n }, []);\n\n return {\n searchFiltersObject,\n searchFiltersState,\n changeSearchFiltersState,\n flushSearchFiltersState,\n };\n};\n\nexport default useSearchFilters;\n","import { K8sGroupVersionKind, K8sModel } from '@console/dynamic-plugin-sdk';\n\nconst resourcesToOmit: K8sGroupVersionKind[] = [\n {\n group: 'config.openshift.io',\n version: 'v1',\n kind: 'APIServer',\n },\n {\n group: 'config.openshift.io',\n version: 'v1',\n kind: 'Authentication',\n },\n {\n group: 'config.openshift.io',\n version: 'v1',\n kind: 'OAuth',\n },\n {\n group: 'config.openshift.io',\n version: 'v1',\n kind: 'FeatureGate',\n },\n {\n group: 'config.openshift.io',\n version: 'v1',\n kind: 'Scheduler',\n },\n {\n group: 'config.openshift.io',\n version: 'v1',\n kind: 'Network',\n },\n {\n group: 'config.openshift.io',\n version: 'v1',\n kind: 'Proxy',\n },\n {\n group: 'config.openshift.io',\n version: 'v1',\n kind: 'DNS',\n },\n];\n\nconst matchModel = (toMatchWith: K8sGroupVersionKind) => (model: K8sGroupVersionKind): boolean =>\n model.group === toMatchWith.group &&\n model.version === toMatchWith.version &&\n model.kind === toMatchWith.kind;\n\nconst filterNonUpgradableResources = (model: K8sModel): boolean => {\n return !resourcesToOmit.find(\n matchModel({ group: model.apiGroup, version: model.apiVersion, kind: model.kind }),\n );\n};\n\nexport default filterNonUpgradableResources;\n","import * as React from 'react';\nimport { Location } from 'react-router-dom-v5-compat';\nimport { DetailsPageBreadCrumbsHook } from '@console/plugin-sdk';\nimport { K8sKind } from '@console/internal/module/k8s';\n\ntype DetailsBreadcrumbResolverType = {\n useBreadcrumbs: DetailsPageBreadCrumbsHook;\n onBreadcrumbsResolved: (\n breadcrumbs: ({ name: string; path: string } | { name: string; path: Location })[],\n ) => void;\n kind: K8sKind;\n urlMatch: any;\n};\n\nconst DetailsBreadcrumbResolver: React.FC<DetailsBreadcrumbResolverType> = ({\n useBreadcrumbs,\n onBreadcrumbsResolved,\n kind,\n urlMatch,\n}) => {\n const breadcrumbs = useBreadcrumbs(kind, urlMatch);\n React.useEffect(() => {\n if (breadcrumbs?.length > 0) {\n onBreadcrumbsResolved(breadcrumbs);\n }\n }, [breadcrumbs, onBreadcrumbsResolved]);\n return null;\n};\n\nexport default DetailsBreadcrumbResolver;\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as classNames from 'classnames';\nimport { sortable } from '@patternfly/react-table';\nimport { DetailsPage, ListPage, Table, TableData } from './factory';\nimport {\n Kebab,\n SectionHeading,\n LabelList,\n ResourceKebab,\n ResourceIcon,\n detailsPage,\n EmptyBox,\n navFactory,\n ResourceLink,\n ResourceSummary,\n} from './utils';\n\nconst menuActions = Kebab.factory.common;\n\nexport const ingressValidHosts = (ingress) =>\n _.map(_.get(ingress, 'spec.rules', []), 'host').filter(_.isString);\n\nconst getPort = (service) => service?.port?.number || service?.port?.name;\n\nconst getHosts = (ingress) => {\n const hosts = ingressValidHosts(ingress);\n\n if (hosts.length) {\n const hostsStr = hosts.join(', ');\n return (\n <div className=\"co-truncate co-select-to-copy\" title={hostsStr}>\n {hostsStr}\n </div>\n );\n }\n\n return <div className=\"text-muted\">No hosts</div>;\n};\n\nconst TLSCert = ({ ingress }) => {\n const { t } = useTranslation();\n if (!_.has(ingress.spec, 'tls')) {\n return (\n <div>\n <span>{t('public~Not configured')}</span>\n </div>\n );\n }\n\n const certs = _.map(ingress.spec.tls, 'secretName');\n\n return (\n <div>\n <ResourceIcon kind=\"Secret\" />\n <span>{certs.join(', ')}</span>\n </div>\n );\n};\n\nconst tableColumnClasses = [\n '',\n '',\n 'pf-m-hidden pf-m-visible-on-md',\n 'pf-m-hidden pf-m-visible-on-lg',\n Kebab.columnClass,\n];\n\nconst kind = 'Ingress';\n\nconst IngressTableRow = ({ obj: ingress }) => {\n return (\n <>\n <TableData className={tableColumnClasses[0]}>\n <ResourceLink\n kind={kind}\n name={ingress.metadata.name}\n namespace={ingress.metadata.namespace}\n />\n </TableData>\n <TableData\n className={classNames(tableColumnClasses[1], 'co-break-word')}\n columnID=\"namespace\"\n >\n <ResourceLink kind=\"Namespace\" name={ingress.metadata.namespace} />\n </TableData>\n <TableData className={tableColumnClasses[2]}>\n <LabelList kind={kind} labels={ingress.metadata.labels} />\n </TableData>\n <TableData className={tableColumnClasses[3]}>{getHosts(ingress)}</TableData>\n <TableData className={tableColumnClasses[4]}>\n <ResourceKebab actions={menuActions} kind={kind} resource={ingress} />\n </TableData>\n </>\n );\n};\n\nconst RulesHeader = () => {\n const { t } = useTranslation();\n return (\n <div className=\"row co-m-table-grid__head\">\n <div className=\"col-xs-6 col-sm-4 col-md-2\">{t('public~Host')}</div>\n <div className=\"col-xs-6 col-sm-4 col-md-2\">{t('public~Path')}</div>\n <div className=\"col-md-3 hidden-sm hidden-xs\">{t('public~Path type')}</div>\n <div className=\"col-sm-4 col-md-2 hidden-xs\">{t('public~Service')}</div>\n <div className=\"col-md-2 hidden-sm hidden-xs\">{t('public~Service port')}</div>\n </div>\n );\n};\n\nconst RulesRow = ({ rule, namespace }) => {\n return (\n <div className=\"row co-resource-list__item\">\n <div className=\"col-xs-6 col-sm-4 col-md-2 co-break-word\">\n <div>{rule.host}</div>\n </div>\n <div className=\"col-xs-6 col-sm-4 col-md-2 co-break-word\">\n <div>{rule.path}</div>\n </div>\n <div className=\"col-md-3 hidden-sm hidden-xs co-break-word\">\n <div>{rule.pathType}</div>\n </div>\n <div className=\"col-sm-4 col-md-2 hidden-xs\">\n {rule.serviceName ? (\n <ResourceLink kind=\"Service\" name={rule.serviceName} namespace={namespace} />\n ) : (\n '-'\n )}\n </div>\n <div className=\"col-xs-2 hidden-sm hidden-xs\">\n <div>{rule.servicePort || '-'}</div>\n </div>\n </div>\n );\n};\n\nconst RulesRows = (props) => {\n const { t } = useTranslation();\n const rules = [];\n\n if (_.has(props.spec, 'rules')) {\n _.forEach(props.spec.rules, (rule) => {\n const paths = _.get(rule, 'http.paths');\n if (_.isEmpty(paths)) {\n rules.push({\n host: rule.host || '*',\n path: '*',\n serviceName: props.spec?.defaultBackend?.service?.name,\n servicePort: getPort(props.spec?.defaultBackend?.service),\n });\n } else {\n _.forEach(paths, (path) => {\n rules.push({\n host: rule.host || '*',\n path: path.path || '*',\n pathType: path.pathType,\n serviceName: path.backend.service?.name,\n servicePort: getPort(path.backend.service),\n });\n });\n }\n });\n\n const rows = _.map(rules, (rule) => {\n return <RulesRow rule={rule} key={rule.serviceName} namespace={props.namespace} />;\n });\n\n return <div className=\"co-m-table-grid__body\"> {rows} </div>;\n }\n\n return <EmptyBox label={t('public~Rules')} />;\n};\n\nconst Details = ({ obj: ingress }) => {\n const { t } = useTranslation();\n return (\n <>\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Ingress details')} />\n <ResourceSummary resource={ingress}>\n <dt>{t('public~TLS certificate')}</dt>\n <dd>\n <TLSCert ingress={ingress} />\n </dd>\n </ResourceSummary>\n </div>\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Ingress rules')} />\n <p className=\"co-m-pane__explanation\">\n {t(\n 'public~These rules are handled by a routing layer (Ingress Controller) which is updated as the rules are modified. The Ingress controller implementation defines how headers and other metadata are forwarded or manipulated',\n )}\n </p>\n <div className=\"co-m-table-grid co-m-table-grid--bordered\">\n <RulesHeader />\n <RulesRows spec={ingress.spec} namespace={ingress.metadata.namespace} />\n </div>\n </div>\n </>\n );\n};\nconst IngressesDetailsPage = (props) => (\n <DetailsPage\n {...props}\n menuActions={menuActions}\n pages={[navFactory.details(detailsPage(Details)), navFactory.editYaml()]}\n />\n);\nconst IngressesList = (props) => {\n const { t } = useTranslation();\n const IngressTableHeader = () => {\n return [\n {\n title: t('public~Name'),\n sortField: 'metadata.name',\n transforms: [sortable],\n props: { className: tableColumnClasses[0] },\n },\n {\n title: t('public~Namespace'),\n sortField: 'metadata.namespace',\n transforms: [sortable],\n props: { className: tableColumnClasses[1] },\n id: 'namespace',\n },\n {\n title: t('public~Labels'),\n sortField: 'metadata.labels',\n transforms: [sortable],\n props: { className: tableColumnClasses[2] },\n },\n {\n title: t('public~Hosts'),\n sortFunc: 'ingressValidHosts',\n transforms: [sortable],\n props: { className: tableColumnClasses[3] },\n },\n {\n title: '',\n props: { className: tableColumnClasses[4] },\n },\n ];\n };\n return (\n <Table\n {...props}\n aria-label={t('public~Ingresses')}\n Header={IngressTableHeader}\n Row={IngressTableRow}\n virtualize\n />\n );\n};\nconst IngressesPage = (props) => (\n <ListPage ListComponent={IngressesList} canCreate={true} {...props} />\n);\n\nexport { IngressesList, IngressesPage, IngressesDetailsPage };\n","import * as React from 'react';\nimport * as _ from 'lodash';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useSelector } from 'react-redux';\nimport { createSelectorCreator, defaultMemoize } from 'reselect';\nimport { SortByDirection } from '@patternfly/react-table';\nimport { useDeepCompareMemoize } from '@console/shared';\nimport { RowFilter } from '@console/dynamic-plugin-sdk';\nimport { useExactSearch } from '@console/app/src/components/user-preferences/search';\n\nimport { RootState } from '../../redux';\nimport { tableFilters } from './table-filters';\nimport { Filter } from './table';\n\nexport const getFilteredRows = <D = any>(\n filters: Filter[],\n rowFilters: RowFilter[],\n objects: D[],\n exactSearch?: boolean,\n) => {\n if (_.isEmpty(filters)) {\n return objects;\n }\n\n const allTableFilters = {\n ...tableFilters(exactSearch),\n ...(rowFilters || [])\n .filter((f) => f.type && _.isFunction(f.filter))\n .reduce((acc, f) => ({ ...acc, [f.type]: f.filter }), {}),\n };\n let filteredObjects = objects;\n _.each(filters, (value, name) => {\n const filter = allTableFilters[name];\n if (_.isFunction(filter)) {\n filteredObjects = _.filter(filteredObjects, (o) => filter(value, o));\n }\n });\n\n return filteredObjects;\n};\n\ntype UseTableDataProps<D = any, C = any> = {\n reduxID: string;\n reduxIDs: string[];\n defaultSortFunc: string;\n defaultSortField: string;\n defaultSortOrder: SortByDirection;\n staticFilters: { key: string; value: string }[];\n filters: { key: string; value: string }[];\n rowFilters: RowFilter[];\n propData: D[];\n loaded: boolean;\n isPinned: (obj: D) => boolean;\n customData: C;\n customSorts: { [key: string]: (obj: D) => number | string };\n sorts: { [key: string]: any };\n};\n\ntype UseTableDataResult<D = any> = {\n currentSortField: string;\n currentSortFunc: string;\n currentSortOrder: SortByDirection;\n data: D[];\n listId: string;\n};\n\nexport const useTableData = ({\n reduxID,\n reduxIDs,\n defaultSortFunc,\n defaultSortField = 'metadata.name',\n defaultSortOrder = SortByDirection.asc,\n staticFilters: initStaticFilters,\n filters,\n rowFilters: initRowFilters,\n propData,\n loaded,\n isPinned,\n customData: initCustomData,\n customSorts: initCustomSorts,\n sorts: initSorts,\n}: UseTableDataProps): UseTableDataResult => {\n const [staticFilters, rowFilters, customSorts, sorts, customData] = useDeepCompareMemoize([\n initStaticFilters,\n initRowFilters,\n initCustomSorts,\n initSorts,\n initCustomData,\n ]);\n\n const [isExactSearch] = useExactSearch();\n\n const tableSelectorCreator = React.useMemo(\n () =>\n createSelectorCreator(\n defaultMemoize as any,\n (oldSortState, newSortState) => oldSortState === newSortState,\n ),\n [],\n );\n\n const listId = reduxIDs ? reduxIDs.join(',') : reduxID;\n\n const sortSelector = React.useMemo(\n () =>\n tableSelectorCreator(\n (state: RootState) => state.UI.getIn(['listSorts', listId]),\n (sortsState: any) => [\n sortsState?.get('field'),\n sortsState?.get('func'),\n sortsState?.get('orderBy'),\n ],\n ),\n [tableSelectorCreator, listId],\n );\n\n const [currentSortField, currentSortFunc, currentSortOrder = defaultSortOrder] = useSelector(\n sortSelector,\n );\n\n return React.useMemo(() => {\n const allFilters = staticFilters ? Object.assign({}, filters, ...staticFilters) : filters;\n const data = getFilteredRows(allFilters, rowFilters, propData, isExactSearch);\n\n if (loaded) {\n let sortBy: string | Function = 'metadata.name';\n const sortFunc = currentSortFunc || defaultSortFunc;\n const sortField = currentSortField || (currentSortFunc ? undefined : defaultSortField);\n if (sortField) {\n sortBy = (resource) => sorts.string(_.get(resource, sortField, ''));\n } else if (sortFunc && customSorts?.[sortFunc]) {\n // Sort resources by a function in the 'customSorts' prop\n sortBy = customSorts[sortFunc];\n } else if (sortFunc && sorts[sortFunc]) {\n // Sort resources by a function in the 'sorts' object\n sortBy = sorts[sortFunc];\n }\n\n const getSortValue = (resource) => {\n const val = _.isFunction(sortBy)\n ? sortBy(resource, customData)\n : _.get(resource, sortBy as string);\n return val ?? '';\n };\n data?.sort((a, b) => {\n const lang = navigator.languages[0] || navigator.language;\n // Use `localCompare` with `numeric: true` for a natural sort order (e.g., pv-1, pv-9, pv-10)\n const compareOpts = { numeric: true, ignorePunctuation: true };\n const aValue = getSortValue(a);\n const bValue = getSortValue(b);\n const aPinned = isPinned?.(a);\n const bPinned = isPinned?.(b);\n if (aPinned !== bPinned) {\n return aPinned ? -1 : +1;\n }\n const result: number =\n Number.isFinite(aValue) && Number.isFinite(bValue)\n ? aValue - bValue\n : `${aValue}`.localeCompare(`${bValue}`, lang, compareOpts);\n if (result !== 0) {\n return currentSortOrder === SortByDirection.asc ? result : result * -1;\n }\n\n // Use name as a secondary sort for a stable sort.\n const aName = a?.metadata?.name || '';\n const bName = b?.metadata?.name || '';\n return aName.localeCompare(bName, lang, compareOpts);\n });\n }\n\n return {\n currentSortField,\n currentSortFunc,\n currentSortOrder,\n data,\n listId,\n };\n }, [\n currentSortField,\n currentSortFunc,\n currentSortOrder,\n customData,\n customSorts,\n defaultSortField,\n defaultSortFunc,\n filters,\n isExactSearch,\n isPinned,\n listId,\n loaded,\n propData,\n rowFilters,\n sorts,\n staticFilters,\n ]);\n};\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport {\n AutoSizer,\n List as VirtualList,\n WindowScroller,\n CellMeasurer,\n CellMeasurerCache,\n} from 'react-virtualized';\nimport { CSSTransition } from 'react-transition-group';\nimport classNames from 'classnames';\n\nimport { EventKind } from '../../module/k8s';\nimport { WithScrollContainer } from './dom-utils';\n\n// Keep track of seen events so we only animate new ones.\nconst seen = new Set();\nconst timeout = { enter: 150 };\n\nconst measurementCache = new CellMeasurerCache({\n fixedWidth: true,\n});\n\nclass SysEvent extends React.Component<SysEventProps> {\n shouldComponentUpdate(nextProps: SysEventProps) {\n if (this.props.event.lastTimestamp !== nextProps.event.lastTimestamp) {\n // Timestamps can be modified because events can be combined.\n return true;\n }\n if (_.isEqual(this.props.style, nextProps.style)) {\n return false;\n }\n return true;\n }\n\n componentWillUnmount() {\n // TODO (kans): this is not correct, but don't memory leak :-/\n seen.delete(this.props.event.metadata.uid);\n }\n\n render() {\n const { EventComponent, index, style, event, className, list } = this.props;\n\n let shouldAnimate: boolean;\n const key = event.metadata.uid;\n // Only animate events if they're at the start of the list (first 6) and we haven't seen them before.\n if (!seen.has(key) && index < 6) {\n seen.add(key);\n shouldAnimate = true;\n }\n\n return (\n <div className={classNames('co-sysevent--transition', className)} style={style} role=\"row\">\n <CSSTransition\n mountOnEnter={true}\n appear={shouldAnimate}\n in\n exit={false}\n timeout={timeout}\n classNames=\"slide\"\n >\n {(status) => (\n <div className={`slide-${status}`}>\n <EventComponent event={event} list={list} cache={measurementCache} index={index} />\n </div>\n )}\n </CSSTransition>\n </div>\n );\n }\n}\n\nexport const EventStreamList: React.FC<EventStreamListProps> = ({\n events,\n className,\n EventComponent,\n}) => {\n const [list, setList] = React.useState(null);\n const onResize = React.useCallback(() => measurementCache.clearAll(), []);\n React.useEffect(() => {\n onResize();\n list?.recomputeRowHeights();\n }, [list, events, onResize]);\n const rowRenderer = React.useCallback(\n ({ index, style, key, parent }) => (\n <CellMeasurer\n cache={measurementCache}\n columnIndex={0}\n key={key}\n rowIndex={index}\n parent={parent}\n >\n {({ measure }) => (\n <SysEvent\n className={className}\n event={events[index]}\n list={list}\n EventComponent={EventComponent}\n onLoad={measure}\n onEntered={print}\n key={key}\n style={style}\n index={index}\n />\n )}\n </CellMeasurer>\n ),\n [events, className, EventComponent, list],\n );\n\n const renderVirtualizedTable = (scrollContainer) => (\n <WindowScroller scrollElement={scrollContainer}>\n {({ height, isScrolling, registerChild, onChildScroll, scrollTop }) => (\n <AutoSizer disableHeight onResize={onResize}>\n {({ width }) => (\n <div ref={registerChild}>\n <VirtualList\n autoHeight\n data={events}\n deferredMeasurementCache={measurementCache}\n height={height || 0}\n isScrolling={isScrolling}\n onScroll={onChildScroll}\n ref={setList}\n rowCount={events.length}\n rowHeight={measurementCache.rowHeight}\n rowRenderer={rowRenderer}\n scrollTop={scrollTop}\n tabIndex={null}\n width={width}\n />\n </div>\n )}\n </AutoSizer>\n )}\n </WindowScroller>\n );\n\n return events.length > 0 && <WithScrollContainer>{renderVirtualizedTable}</WithScrollContainer>;\n};\n\ntype EventStreamListProps = {\n events: EventKind[];\n EventComponent: React.ComponentType<EventComponentProps>;\n className?: string;\n};\n\nexport type EventComponentProps = {\n event: EventKind;\n list: VirtualList;\n cache: CellMeasurerCache;\n index: number;\n};\n\ntype SysEventProps = {\n EventComponent: React.ComponentType<EventComponentProps>;\n event: EventKind;\n onLoad: () => void;\n onEntered: () => void;\n style: React.CSSProperties;\n index: number;\n className?: string;\n list: VirtualList;\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\n\nimport {\n ContainerDropdown,\n getQueryArgument,\n LOG_SOURCE_RESTARTING,\n LOG_SOURCE_RUNNING,\n LOG_SOURCE_TERMINATED,\n LOG_SOURCE_WAITING,\n ResourceLog,\n setQueryArgument,\n} from './utils';\n\nconst containersToStatuses = ({ status }, containers) => {\n return _.reduce(\n containers,\n (accumulator, { name }, order) => {\n const containerStatus =\n _.find(status.containerStatuses, { name }) ||\n _.find(status.initContainerStatuses, { name });\n if (containerStatus) {\n return {\n ...accumulator,\n [name]: { ...containerStatus, order },\n };\n }\n return accumulator;\n },\n {},\n );\n};\n\nconst containerToLogSourceStatus = (container) => {\n if (!container) {\n return LOG_SOURCE_WAITING;\n }\n\n const { state, lastState } = container;\n\n if (state.waiting && !_.isEmpty(lastState)) {\n return LOG_SOURCE_RESTARTING;\n }\n\n if (state.waiting) {\n return LOG_SOURCE_WAITING;\n }\n\n if (state.terminated) {\n return LOG_SOURCE_TERMINATED;\n }\n\n return LOG_SOURCE_RUNNING;\n};\n\nexport class PodLogs extends React.Component {\n constructor(props) {\n super(props);\n this._selectContainer = this._selectContainer.bind(this);\n this.state = {\n containers: {},\n currentKey:\n getQueryArgument('container') ||\n props.obj.metadata?.annotations?.['kubectl.kubernetes.io/default-container'] ||\n '',\n initContainers: {},\n };\n }\n\n static getDerivedStateFromProps({ obj: build }, { currentKey }) {\n const newState = {};\n const containers = _.get(build, 'spec.containers', []);\n const initContainers = _.get(build, 'spec.initContainers', []);\n newState.containers = containersToStatuses(build, containers);\n newState.initContainers = containersToStatuses(build, initContainers);\n if (!currentKey) {\n const firstContainer = _.find(newState.containers, { order: 0 });\n newState.currentKey = firstContainer ? firstContainer.name : '';\n }\n return newState;\n }\n\n _selectContainer(name) {\n this.setState({ currentKey: name }, () => {\n setQueryArgument('container', this.state.currentKey);\n });\n }\n\n render() {\n const { containers, currentKey, initContainers } = this.state;\n const currentContainer = _.get(containers, currentKey) || _.get(initContainers, currentKey);\n const currentContainerStatus = containerToLogSourceStatus(currentContainer);\n const containerDropdown = (\n <ContainerDropdown\n currentKey={currentKey}\n containers={containers}\n initContainers={initContainers}\n onChange={this._selectContainer}\n />\n );\n\n return (\n <div className=\"co-m-pane__body co-m-pane__body--full-height\">\n <ResourceLog\n containerName={currentContainer ? currentContainer.name : ''}\n dropdown={containerDropdown}\n resource={this.props.obj}\n resourceStatus={currentContainerStatus}\n />\n </div>\n );\n }\n}\n","import * as React from 'react';\nimport { VirtualTableBody } from '@patternfly/react-virtualized-extension';\nimport { CellMeasurerCache, CellMeasurer } from 'react-virtualized';\nimport { Scroll } from '@patternfly/react-virtualized-extension/dist/js/components/Virtualized/types';\nimport { K8sResourceCommon, TableColumn, RowProps } from '@console/dynamic-plugin-sdk';\nimport { TableRow } from '../table';\n\ntype VirtualizedTableBodyProps<D, R = {}> = {\n Row: React.ComponentType<RowProps<D, R>>;\n data: D[];\n height: number;\n isScrolling: boolean;\n onChildScroll: (params: Scroll) => void;\n columns: TableColumn<D>[];\n scrollTop: number;\n width: number;\n rowData?: R;\n getRowId?: (obj: D) => string;\n getRowTitle?: (obj: D) => string;\n getRowClassName?: (obj: D) => string;\n};\n\nconst RowMemo = React.memo<\n RowProps<any, any> & {\n Row: React.ComponentType<RowProps<any, any>>;\n isScrolling: boolean;\n style: React.CSSProperties;\n }\n>(\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n ({ Row, isScrolling, style, ...props }) => <Row {...props} />,\n (_, nextProps) => {\n if (nextProps.isScrolling) {\n return true;\n }\n },\n);\n\nconst VirtualizedTableBody = <D extends any, R extends any = {}>({\n Row,\n height,\n isScrolling,\n onChildScroll,\n data,\n columns,\n scrollTop,\n width,\n rowData,\n getRowId,\n getRowTitle,\n getRowClassName,\n}: VirtualizedTableBodyProps<D, R>) => {\n const cellMeasurementCache = new CellMeasurerCache({\n fixedWidth: true,\n minHeight: 44,\n keyMapper: (rowIndex) => (data?.[rowIndex] as K8sResourceCommon)?.metadata?.uid || rowIndex, // TODO custom keyMapper ?\n });\n\n const activeColumnIDs = React.useMemo(() => new Set(columns.map((c) => c.id)), [columns]);\n\n const rowRenderer = ({ index, isVisible, key, style, parent }) => {\n const rowArgs: RowProps<D, R> = {\n obj: data[index],\n activeColumnIDs,\n rowData,\n };\n\n // do not render non visible elements (this excludes overscan)\n if (!isVisible) {\n return null;\n }\n return (\n <CellMeasurer\n cache={cellMeasurementCache}\n columnIndex={0}\n key={key}\n parent={parent}\n rowIndex={index}\n >\n <TableRow\n id={getRowId?.(rowArgs.obj) ?? key}\n index={index}\n trKey={key}\n style={style}\n title={getRowTitle?.(rowArgs.obj)}\n className={getRowClassName?.(rowArgs.obj)}\n >\n <RowMemo Row={Row} {...rowArgs} style={style} isScrolling={isScrolling} />\n </TableRow>\n </CellMeasurer>\n );\n };\n\n return (\n <VirtualTableBody\n autoHeight\n className=\"pf-v5-c-table pf-m-compact pf-m-border-rows pf-v5-c-virtualized pf-v5-c-window-scroller\"\n deferredMeasurementCache={cellMeasurementCache}\n rowHeight={cellMeasurementCache.rowHeight}\n height={height || 0}\n isScrolling={isScrolling}\n onScroll={onChildScroll}\n overscanRowCount={10}\n columns={columns}\n rows={data}\n rowCount={data.length}\n rowRenderer={rowRenderer}\n scrollTop={scrollTop}\n width={width}\n />\n );\n};\n\nexport default VirtualizedTableBody;\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { PodDisruptionBudgetKind } from './types';\n\nconst AvailabilityRequirement: React.FC<AvailabilityRequirementProps> = ({ pdb, replicas }) => {\n const { t } = useTranslation();\n return (\n <>\n {!_.isNil(pdb?.spec?.minAvailable)\n ? t('console-app~Min available {{minAvailable}} of {{count}} pod', {\n minAvailable: pdb.spec.minAvailable,\n count: replicas,\n })\n : t('console-app~Max unavailable {{maxUnavailable}} of {{count}} pod', {\n maxUnavailable: pdb?.spec?.maxUnavailable,\n count: replicas,\n })}\n </>\n );\n};\n\ntype AvailabilityRequirementProps = {\n pdb: PodDisruptionBudgetKind;\n replicas: number;\n};\n\nexport default AvailabilityRequirement;\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Grid, GridItem, Card, CardBody, CardHeader, CardTitle } from '@patternfly/react-core';\n\nimport Dashboard from '@console/shared/src/components/dashboard/Dashboard';\nimport { QueryBrowser } from '@console/shared/src/components/query-browser';\nimport {\n ResourceUtilizationQuery,\n useResourceMetricsQueries,\n} from '@console/shared/src/promql/resource-metrics';\nimport { K8sResourceKind } from '@console/internal/module/k8s';\n\nconst ResourceMetricsDashboardCard: React.FC<ResourceMetricsDashboardCardProps> = (props) => (\n <Card className=\"resource-metrics-dashboard__card\">\n <CardHeader>\n <CardTitle>{props.title}</CardTitle>\n </CardHeader>\n <CardBody className=\"resource-metrics-dashboard__card-body\">\n <QueryBrowser queries={props.queries} namespace={props.namespace} disableZoom hideControls />\n </CardBody>\n </Card>\n);\n\nexport const ResourceMetricsDashboard: React.FC<ResourceMetricsDashboardProps> = ({ obj }) => {\n const { t } = useTranslation();\n const queries = useResourceMetricsQueries(obj);\n return queries ? (\n <Dashboard className=\"resource-metrics-dashboard\">\n <Grid hasGutter>\n <GridItem xl={6} lg={12}>\n <ResourceMetricsDashboardCard\n namespace={obj.metadata.namespace}\n queries={queries[ResourceUtilizationQuery.MEMORY]}\n title={t('public~Memory usage')}\n />\n </GridItem>\n <GridItem xl={6} lg={12}>\n <ResourceMetricsDashboardCard\n namespace={obj.metadata.namespace}\n queries={queries[ResourceUtilizationQuery.CPU]}\n title={t('public~CPU usage')}\n />\n </GridItem>\n <GridItem xl={6} lg={12}>\n <ResourceMetricsDashboardCard\n namespace={obj.metadata.namespace}\n queries={queries[ResourceUtilizationQuery.FILESYSTEM]}\n title={t('public~Filesystem')}\n />\n </GridItem>\n <GridItem xl={6} lg={12}>\n <ResourceMetricsDashboardCard\n namespace={obj.metadata.namespace}\n queries={queries[ResourceUtilizationQuery.NETWORK_IN]}\n title={t('public~Network in')}\n />\n </GridItem>\n <GridItem xl={6} lg={12}>\n <ResourceMetricsDashboardCard\n namespace={obj.metadata.namespace}\n queries={queries[ResourceUtilizationQuery.NETWORK_OUT]}\n title={t('public~Network out')}\n />\n </GridItem>\n </Grid>\n </Dashboard>\n ) : null;\n};\n\ntype ResourceMetricsDashboardCardProps = {\n namespace?: string;\n title: string;\n queries: string[];\n};\n\ntype ResourceMetricsDashboardProps = {\n obj: K8sResourceKind;\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n LOG_SOURCE_RUNNING,\n LOG_SOURCE_TERMINATED,\n LOG_SOURCE_WAITING,\n MsgBox,\n ResourceLog,\n} from './utils';\nimport { getJenkinsLogURL, BuildPipelineLogLink } from './build-pipeline';\nimport { BuildStrategyType } from './build';\nimport { BuildPhase } from '../module/k8s/builds';\n\nconst PipelineLogMessage = ({ build }) => {\n const { t } = useTranslation();\n const logURL = getJenkinsLogURL(build);\n const message = logURL\n ? t('public~Pipeline build logs are available through Jenkins (linked below)')\n : t('public~A link to the Jenkins pipeline build logs will appear below when the build starts');\n\n const detail = (\n <>\n <p>{message}</p>\n <BuildPipelineLogLink obj={build} />\n </>\n );\n\n return <MsgBox title={t('public~See Jenkins log')} detail={detail} />;\n};\n\nconst buildPhaseToLogSourceStatus = (phase) => {\n switch (phase) {\n case BuildPhase.New:\n case BuildPhase.Pending:\n return LOG_SOURCE_WAITING;\n\n case BuildPhase.Cancelled:\n case BuildPhase.Complete:\n case BuildPhase.Error:\n case BuildPhase.Failed:\n return LOG_SOURCE_TERMINATED;\n\n default:\n return LOG_SOURCE_RUNNING;\n }\n};\n\nexport class BuildLogs extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n status: LOG_SOURCE_WAITING,\n };\n }\n\n static getDerivedStateFromProps({ obj: build }, { status: prevStatus }) {\n const phase = _.get(build, 'status.phase');\n const status = buildPhaseToLogSourceStatus(phase);\n return prevStatus !== status ? { status } : null;\n }\n\n render() {\n const { obj: build } = this.props;\n const isPipeline = _.get(build, 'spec.strategy.type') === BuildStrategyType.JenkinsPipeline;\n\n return (\n <div className=\"co-m-pane__body co-m-pane__body--full-height\">\n {isPipeline ? (\n <PipelineLogMessage build={build} />\n ) : (\n <ResourceLog resource={build} resourceStatus={this.state.status} />\n )}\n </div>\n );\n }\n}\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport {\n Action,\n ActionProvider,\n isActionProvider,\n isResourceActionProvider,\n ResourceActionProvider,\n useResolvedExtensions,\n ExtensionK8sGroupModel,\n isActionFilter,\n ActionFilter,\n} from '@console/dynamic-plugin-sdk';\nimport { referenceForExtensionModel } from '@console/internal/module/k8s';\nimport ActionsHookResolver from './ActionsHookResolver';\n\ntype ActionsLoaderProps = {\n contextId: string;\n scope: any;\n onActionsLoaded: (actions: Action[]) => void;\n onContextChange: (contextId: string, scope: any) => void;\n onLoadError: (error: any) => void;\n};\n\nconst ActionsLoader: React.FC<ActionsLoaderProps> = ({\n contextId,\n scope,\n onActionsLoaded,\n onContextChange,\n onLoadError,\n}) => {\n const [actionsMap, setActionsMap] = React.useState<{ [uid: string]: Action[] }>({});\n const [loadError, setLoadError] = React.useState<any>();\n\n const onProviderValueResolved = React.useCallback((actions: Action[], uid: string) => {\n setActionsMap((prev) => ({ ...prev, [uid]: actions }));\n }, []);\n\n const providerGuard = React.useCallback(\n (e): e is ActionProvider => isActionProvider(e) && e.properties.contextId === contextId,\n [contextId],\n );\n\n const filterGuard = React.useCallback(\n (e): e is ActionFilter => isActionFilter(e) && e.properties.contextId === contextId,\n [contextId],\n );\n\n const resourceProviderGuard = React.useCallback(\n (e): e is ResourceActionProvider =>\n isResourceActionProvider(e) &&\n referenceForExtensionModel(e.properties.model as ExtensionK8sGroupModel) === contextId,\n [contextId],\n );\n\n const [providerExtensions, providerExtensionsResolved] = useResolvedExtensions<ActionProvider>(\n providerGuard,\n );\n\n const [filterExtensions, filterExtensionsResolved] = useResolvedExtensions<ActionFilter>(\n filterGuard,\n );\n\n const [resourceProviderExtensions, resourceProviderExtensionsResolved] = useResolvedExtensions<\n ResourceActionProvider\n >(resourceProviderGuard);\n\n const allProviderExtensions = [...providerExtensions, ...resourceProviderExtensions];\n const allProviderExtensionsResolved =\n providerExtensionsResolved && resourceProviderExtensionsResolved && filterExtensionsResolved;\n\n const actionsLoaded =\n allProviderExtensionsResolved &&\n (allProviderExtensions.length === 0 ||\n allProviderExtensions.every(({ uid }) => actionsMap[uid]));\n\n const actions: Action[] = React.useMemo(() => {\n const flattenedActions = _.flatten(Object.values(actionsMap));\n return filterExtensions?.length > 0\n ? flattenedActions.filter((a) =>\n filterExtensions.some((ext) => ext.properties.filter(scope, a)),\n )\n : flattenedActions;\n }, [actionsMap, filterExtensions, scope]);\n\n React.useEffect(() => {\n if (actionsLoaded) onActionsLoaded?.(actions);\n // We do not want to run the effect every time onActionsLoaded changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [actions, actionsLoaded]);\n\n React.useEffect(() => {\n if (loadError) onLoadError(loadError);\n // We do not want to run the effect every time onLoadError changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loadError]);\n\n return (\n <>\n {allProviderExtensionsResolved &&\n allProviderExtensions.map((extension) => (\n <ActionsHookResolver\n key={extension.uid}\n useValue={extension.properties.provider}\n scope={scope}\n onValueResolved={(value) => onProviderValueResolved(value, extension.uid)}\n onContextChange={onContextChange}\n onValueError={setLoadError}\n />\n ))}\n </>\n );\n};\n\nexport default ActionsLoader;\n","import * as React from 'react';\nimport { ExtensionHook, Action } from '@console/dynamic-plugin-sdk';\n\ntype ActionsHookResolverProps = {\n scope: any;\n useValue: ExtensionHook<Action[]>;\n onValueResolved: (value: Action[]) => void;\n onContextChange: (contextId: string, scope: any) => void;\n onValueError: (error: any) => void;\n};\n\nconst ActionsHookResolver: React.FC<ActionsHookResolverProps> = ({\n useValue,\n scope,\n onValueResolved,\n onValueError,\n}) => {\n const [value, loaded, loadError] = useValue(scope);\n\n React.useEffect(() => {\n if (loaded) onValueResolved(value);\n // We do not want to run the effect every time onValueResolved changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loaded, value]);\n\n React.useEffect(() => {\n if (loadError) onValueError(loadError);\n // We do not want to run the effect every time onValueError changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loadError]);\n\n return null;\n};\n\nexport default ActionsHookResolver;\n","export const SYSTEM_ALERT_RULE_LABEL = { prometheus: 'openshift-monitoring/k8s' };\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\n\nimport { Bar } from '../../graphs';\n\nimport { CustomDataSource } from '@console/dynamic-plugin-sdk/src/extensions/dashboard-data-source';\n\nconst Label = ({ metric }) => <>{_.values(metric).join()}</>;\n\nconst BarChart: React.FC<BarChartProps> = ({ pollInterval, query, customDataSource }) => (\n <Bar\n barSpacing={5}\n barWidth={8}\n delay={pollInterval}\n LabelComponent={Label}\n noLink={true}\n query={query}\n customDataSource={customDataSource}\n />\n);\n\ntype BarChartProps = {\n pollInterval: number;\n query: string;\n namespace?: string;\n customDataSource?: CustomDataSource;\n};\nexport default BarChart;\n","import * as React from 'react';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { FormatSeriesTitle } from '@console/dynamic-plugin-sdk';\nimport { QueryBrowser } from '@console/shared/src/components/query-browser';\n\nimport { dashboardsSetEndTime, dashboardsSetTimespan } from '../../../actions/observe';\nimport { RootState } from '../../../redux';\nimport { DEFAULT_GRAPH_SAMPLES, getActivePerspective } from './monitoring-dashboard-utils';\n\nimport { CustomDataSource } from '@console/dynamic-plugin-sdk/src/extensions/dashboard-data-source';\n\ntype Props = {\n formatSeriesTitle?: FormatSeriesTitle;\n isStack: boolean;\n pollInterval: number;\n queries: string[];\n showLegend?: boolean;\n units: string;\n onZoomHandle?: (timeRange: number, endTime: number) => void;\n namespace?: string;\n customDataSource?: CustomDataSource;\n};\n\nconst Graph: React.FC<Props> = ({\n formatSeriesTitle,\n isStack,\n pollInterval,\n queries,\n showLegend,\n units,\n onZoomHandle,\n namespace,\n customDataSource,\n}) => {\n const dispatch = useDispatch();\n const activePerspective = getActivePerspective(namespace);\n const endTime = useSelector(({ observe }: RootState) =>\n observe.getIn(['dashboards', activePerspective, 'endTime']),\n );\n const timespan = useSelector(({ observe }: RootState) =>\n observe.getIn(['dashboards', activePerspective, 'timespan']),\n );\n\n const onZoom = React.useCallback(\n (from, to) => {\n dispatch(dashboardsSetEndTime(to, activePerspective));\n dispatch(dashboardsSetTimespan(to - from, activePerspective));\n onZoomHandle?.(to - from, to);\n },\n [activePerspective, dispatch, onZoomHandle],\n );\n\n return (\n <QueryBrowser\n defaultSamples={DEFAULT_GRAPH_SAMPLES}\n fixedEndTime={endTime}\n formatSeriesTitle={formatSeriesTitle}\n hideControls\n isStack={isStack}\n onZoom={onZoom}\n pollInterval={pollInterval}\n queries={queries}\n showLegend={showLegend}\n timespan={timespan}\n units={units}\n namespace={namespace}\n customDataSource={customDataSource}\n />\n );\n};\n\nexport default Graph;\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { PrometheusEndpoint, PrometheusResponse } from '@console/dynamic-plugin-sdk';\nimport { Bullseye } from '@patternfly/react-core';\n\nimport ErrorAlert from '@console/shared/src/components/alerts/error';\n\nimport { formatNumber } from '../format';\nimport { Panel } from './types';\nimport { getPrometheusURL } from '../../graphs/helpers';\nimport { LoadingInline, usePoll, useSafeFetch } from '../../utils';\n\nimport { CustomDataSource } from '@console/dynamic-plugin-sdk/src/extensions/dashboard-data-source';\n\nconst colorMap = {\n 'super-light-blue': 'blue-100',\n 'light-blue': 'blue-200',\n blue: 'blue-300',\n 'semi-dark-blue': 'blue-400',\n 'dark-blue': 'blue-500',\n\n 'super-light-green': 'green-100',\n 'light-green': 'green-200',\n green: 'green-300',\n 'semi-dark-green': 'green-400',\n 'dark-green': 'green-500',\n\n 'super-light-orange': 'orange-100',\n 'light-orange': 'orange-200',\n orange: 'orange-300',\n 'semi-dark-orange': 'orange-400',\n 'dark-orange': 'orange-500',\n\n 'super-light-purple': 'purple-100',\n 'light-purple': 'purple-200',\n purple: 'purple-300',\n 'semi-dark-purple': 'purple-400',\n 'dark-purple': 'purple-500',\n\n 'super-light-red': 'red-100',\n 'light-red': 'red-200',\n red: 'red-300',\n 'semi-dark-red': 'red-400',\n 'dark-red': 'red-500',\n\n 'super-light-yellow': 'gold-100',\n 'light-yellow': 'gold-200',\n yellow: 'gold-300',\n 'semi-dark-yellow': 'gold-400',\n 'dark-yellow': 'gold-500',\n};\n\nconst getColorCSS = (colorName: string): string =>\n colorMap[colorName] ? `var(--pf-v5-chart-color-${colorMap[colorName]})` : undefined;\n\nconst Body: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <Bullseye className=\"monitoring-dashboards__single-stat\">{children}</Bullseye>\n);\n\nconst SingleStat: React.FC<Props> = ({\n panel,\n pollInterval,\n query,\n namespace,\n customDataSource,\n}) => {\n const {\n decimals,\n format,\n options,\n postfix,\n postfixFontSize,\n prefix,\n prefixFontSize,\n valueFontSize,\n valueMaps,\n } = panel;\n\n const [error, setError] = React.useState<string>();\n const [isLoading, setIsLoading] = React.useState(true);\n const [value, setValue] = React.useState<string>();\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const safeFetch = React.useCallback(useSafeFetch(), []);\n\n const url = getPrometheusURL(\n { endpoint: PrometheusEndpoint.QUERY, query, namespace },\n customDataSource?.basePath,\n );\n\n const tick = () => {\n if (!url) {\n return;\n }\n safeFetch(url)\n .then((response: PrometheusResponse) => {\n setError(undefined);\n setIsLoading(false);\n setValue(_.get(response, 'data.result[0].value[1]'));\n })\n .catch((err) => {\n if (err.name !== 'AbortError') {\n setError(_.get(err, 'json.error', err.message));\n setIsLoading(false);\n setValue(undefined);\n }\n });\n };\n\n usePoll(tick, pollInterval, query);\n\n const filteredVMs = valueMaps?.filter((vm) => vm.op === '=');\n const valueMap =\n value === undefined\n ? filteredVMs?.find((vm) => vm.value === 'null')\n : filteredVMs?.find((vm) => vm.value === value);\n\n if (isLoading) {\n return <LoadingInline />;\n }\n if (error) {\n return <ErrorAlert message={error} />;\n }\n\n let color;\n const thresholds = options?.fieldOptions?.thresholds;\n if (thresholds && value !== undefined) {\n const thresholdIndex =\n _.sortedIndexBy(thresholds, { value: Number(value) }, (t) => Number(t.value)) - 1;\n color = getColorCSS(thresholds[thresholdIndex]?.color);\n }\n\n return (\n <Body>\n {prefix && <span style={{ color, fontSize: prefixFontSize }}>{prefix}</span>}\n <span style={{ color, fontSize: valueFontSize }}>\n {valueMap ? valueMap.text : formatNumber(value, decimals, format)}\n </span>\n {postfix && <span style={{ color, fontSize: postfixFontSize }}>{postfix}</span>}\n </Body>\n );\n};\n\ntype Props = {\n panel: Panel;\n pollInterval: number;\n query: string;\n namespace?: string;\n customDataSource?: CustomDataSource;\n};\n\nexport default SingleStat;\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { PrometheusEndpoint, PrometheusResponse } from '@console/dynamic-plugin-sdk';\nimport {\n EmptyState,\n EmptyStateBody,\n EmptyStateVariant,\n PerPageOptions,\n} from '@patternfly/react-core';\nimport { ISortBy, sortable, TableGridBreakpoint, TableVariant } from '@patternfly/react-table';\nimport {\n Table as PFTable,\n TableBody as TableBodyDeprecated,\n TableHeader as TableHeaderDeprecated,\n} from '@patternfly/react-table/deprecated';\n\nimport ErrorAlert from '@console/shared/src/components/alerts/error';\n\nimport { formatNumber } from '../format';\nimport { ColumnStyle, Panel } from './types';\nimport { getPrometheusURL } from '../../graphs/helpers';\nimport { usePoll, useSafeFetch } from '../../utils';\nimport TablePagination from '../table-pagination';\n\nimport { CustomDataSource } from '@console/dynamic-plugin-sdk/src/extensions/dashboard-data-source';\n\ntype AugmentedColumnStyle = ColumnStyle & {\n className?: string;\n};\n\n// Get the columns from the panel styles. Filters out hidden columns and orders\n// them so the label columns are displayed first.\nconst getColumns = (styles: ColumnStyle[]): AugmentedColumnStyle[] => {\n const labelColumns = [];\n const valueColumns = [];\n styles.forEach((col: ColumnStyle) => {\n // Remove hidden or regex columns.\n if (col.type === 'hidden' || col.pattern.startsWith('/') || !col.alias) {\n return;\n }\n\n if (col.pattern.startsWith('Value #')) {\n valueColumns.push(col);\n } else if (col.pattern === 'Value') {\n // Set the column to use the first group pattern because the panel has a single target\n valueColumns.push({ ...col, pattern: 'Value #A' });\n } else {\n labelColumns.push({\n ...col,\n className: 'monitoring-dashboards__label-column-header',\n });\n }\n });\n\n // Show non-value columns first.\n return [...labelColumns, ...valueColumns];\n};\n\nconst perPageOptions: PerPageOptions[] = [5, 10, 20, 50, 100].map((n) => ({\n title: n.toString(),\n value: n,\n}));\n\nconst Table: React.FC<Props> = ({ panel, pollInterval, queries, namespace, customDataSource }) => {\n const [error, setError] = React.useState();\n const [isLoading, setLoading] = React.useState(true);\n const [data, setData] = React.useState();\n const [page, setPage] = React.useState(1);\n const [perPage, setPerPage] = React.useState(5);\n const [sortBy, setSortBy] = React.useState<ISortBy>({ index: 0, direction: 'asc' });\n const onSort = (e, index: ISortBy['index'], direction: ISortBy['direction']) =>\n setSortBy({ index, direction });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const safeFetch = React.useCallback(useSafeFetch(), []);\n\n const { t } = useTranslation();\n\n const tick = () => {\n const allPromises = _.map(queries, (query) =>\n _.isEmpty(query)\n ? Promise.resolve()\n : safeFetch(\n getPrometheusURL(\n { endpoint: PrometheusEndpoint.QUERY, query, namespace },\n customDataSource?.basePath,\n ),\n ),\n );\n\n Promise.all(allPromises)\n .then((responses: PrometheusResponse[]) => {\n setError(undefined);\n setLoading(false);\n // Note: This makes the following assumptions about the data:\n // 1. The transform is `table`\n // 2. The value will be an instance vector (single value).\n // 3. The time column is hidden.\n // The Grafana implementation is much more involved. See\n // https://grafana.com/docs/grafana/latest/features/panels/table_panel/#merge-multiple-queries-per-table\n setData(\n responses.reduce((acc, response, i: number) => {\n if (response) {\n const id = panel.targets[i].refId;\n response.data.result.forEach(({ metric, value }) => {\n const tag = Object.values(metric).join('-');\n if (!acc[tag]) {\n acc[tag] = { ...metric };\n }\n acc[tag][`Value #${id}`] = value[1] || '';\n });\n }\n return acc;\n }, {} as any),\n );\n })\n .catch((err) => {\n if (err.name !== 'AbortError') {\n setError(_.get(err, 'json.error', err.message));\n setLoading(false);\n setData(undefined);\n }\n });\n };\n\n usePoll(tick, pollInterval, queries);\n if (isLoading) {\n return <div className=\"loading-skeleton--table\" />;\n }\n if (error) {\n return <ErrorAlert message={error} />;\n }\n if (_.isEmpty(panel.styles)) {\n return <ErrorAlert message={t('public~panel.styles attribute not found')} />;\n }\n if (_.isEmpty(data)) {\n return (\n <EmptyState variant={EmptyStateVariant.xs}>\n <EmptyStateBody>{t('public~No data found')}</EmptyStateBody>\n </EmptyState>\n );\n }\n\n const columns: AugmentedColumnStyle[] = getColumns(panel.styles);\n\n // Sort the data.\n const sort = (row) => {\n const { pattern, type } = columns[sortBy.index];\n const val = row[pattern];\n if (type !== 'number') {\n return val;\n }\n if (_.isNil(val)) {\n return Number.MIN_VALUE;\n }\n const num = Number(val);\n // Some columns styles claim to be numbers, but have string data. Still sort those as strings.\n return _.isFinite(num) ? num : val;\n };\n const sortedData = _.orderBy(data, [sort], [sortBy.direction]);\n const visibleData = sortedData.slice((page - 1) * perPage, page * perPage);\n\n // Format the table rows.\n const rows: string[][] = visibleData.map((values: { [key: string]: string }) => {\n return columns.reduce((acc: string[], { type, decimals = 2, pattern, unit = '' }) => {\n const value = values[pattern];\n switch (type) {\n case 'number':\n acc.push(formatNumber(value, decimals, unit));\n break;\n default:\n acc.push(value || '-');\n }\n return acc;\n }, []);\n });\n\n const headers = columns.map(({ alias: title, className }) => ({\n title,\n transforms: [sortable],\n ...(className ? { props: { className } } : {}),\n }));\n\n return (\n <>\n <div className=\"monitoring-dashboards__table-container\">\n <PFTable\n aria-label={t('public~query results table')}\n cells={headers}\n className=\"monitoring-dashboards__table\"\n gridBreakPoint={TableGridBreakpoint.none}\n onSort={onSort}\n rows={rows}\n sortBy={sortBy}\n variant={TableVariant.compact}\n >\n <TableHeaderDeprecated />\n <TableBodyDeprecated />\n </PFTable>\n </div>\n <TablePagination\n itemCount={sortedData.length}\n page={page}\n perPage={perPage}\n perPageOptions={perPageOptions}\n setPage={setPage}\n setPerPage={setPerPage}\n />\n </>\n );\n};\n\ntype Props = {\n panel: Panel;\n pollInterval: number;\n queries: string[];\n namespace?: string;\n customDataSource?: CustomDataSource;\n};\n\nexport default Table;\n","import * as _ from 'lodash';\nimport {\n formatPrometheusDuration,\n parsePrometheusDuration,\n} from '@openshift-console/plugin-shared/src/datetime/prometheus';\nimport {\n Dropdown as DropdownDeprecated,\n DropdownToggle as DropdownToggleDeprecated,\n DropdownItem as DropdownItemDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { dashboardsSetEndTime, dashboardsSetTimespan } from '../../../actions/observe';\nimport { RootState } from '../../../redux';\nimport { getQueryArgument, removeQueryArgument, setQueryArgument } from '../../utils';\nimport { useBoolean } from '../hooks/useBoolean';\nimport CustomTimeRangeModal from './custom-time-range-modal';\nimport { TimeDropdownsProps } from './types';\nimport { getActivePerspective } from './monitoring-dashboard-utils';\n\nconst CUSTOM_TIME_RANGE_KEY = 'CUSTOM_TIME_RANGE_KEY';\n\nconst TimespanDropdown: React.FC<TimeDropdownsProps> = ({ namespace }) => {\n const { t } = useTranslation();\n const activePerspective = getActivePerspective(namespace);\n\n const [isOpen, toggleIsOpen, , setClosed] = useBoolean(false);\n const [isModalOpen, , setModalOpen, setModalClosed] = useBoolean(false);\n\n const timespan = useSelector(({ observe }: RootState) =>\n observe.getIn(['dashboards', activePerspective, 'timespan']),\n );\n const endTime = useSelector(({ observe }: RootState) =>\n observe.getIn(['dashboards', activePerspective, 'endTime']),\n );\n\n const timeSpanFromParams = getQueryArgument('timeRange');\n const endTimeFromParams = getQueryArgument('endTime');\n\n const dispatch = useDispatch();\n const onChange = React.useCallback(\n (v: string) => {\n if (v === CUSTOM_TIME_RANGE_KEY) {\n setModalOpen();\n } else {\n setQueryArgument('timeRange', parsePrometheusDuration(v).toString());\n removeQueryArgument('endTime');\n dispatch(dashboardsSetTimespan(parsePrometheusDuration(v), activePerspective));\n dispatch(dashboardsSetEndTime(null, activePerspective));\n }\n },\n [activePerspective, dispatch, setModalOpen],\n );\n\n const items = {\n [CUSTOM_TIME_RANGE_KEY]: t('public~Custom time range'),\n '5m': t('public~Last {{count}} minute', { count: 5 }),\n '15m': t('public~Last {{count}} minute', { count: 15 }),\n '30m': t('public~Last {{count}} minute', { count: 30 }),\n '1h': t('public~Last {{count}} hour', { count: 1 }),\n '2h': t('public~Last {{count}} hour', { count: 2 }),\n '6h': t('public~Last {{count}} hour', { count: 6 }),\n '12h': t('public~Last {{count}} hour', { count: 12 }),\n '1d': t('public~Last {{count}} day', { count: 1 }),\n '2d': t('public~Last {{count}} day', { count: 2 }),\n '1w': t('public~Last {{count}} week', { count: 1 }),\n '2w': t('public~Last {{count}} week', { count: 2 }),\n };\n\n return (\n <>\n <CustomTimeRangeModal\n activePerspective={activePerspective}\n isOpen={isModalOpen}\n setClosed={setModalClosed}\n />\n <div className=\"form-group monitoring-dashboards__dropdown-wrap\">\n <label\n className=\"monitoring-dashboards__dropdown-title\"\n htmlFor=\"monitoring-time-range-dropdown\"\n >\n {t('public~Time range')}\n </label>\n <DropdownDeprecated\n className=\"monitoring-dashboards__variable-dropdown\"\n dropdownItems={_.map(items, (name, key) => (\n <DropdownItemDeprecated component=\"button\" key={key} onClick={() => onChange(key)}>\n {name}\n </DropdownItemDeprecated>\n ))}\n isOpen={isOpen}\n onSelect={setClosed}\n toggle={\n <DropdownToggleDeprecated\n className=\"monitoring-dashboards__dropdown-button\"\n id=\"monitoring-time-range-dropdown\"\n onToggle={toggleIsOpen}\n >\n {\n items[\n endTime || endTimeFromParams\n ? CUSTOM_TIME_RANGE_KEY\n : formatPrometheusDuration(_.toNumber(timeSpanFromParams) || timespan)\n ]\n }\n </DropdownToggleDeprecated>\n }\n />\n </div>\n </>\n );\n};\n\nexport default TimespanDropdown;\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n Button,\n DatePicker,\n Flex,\n FlexItem,\n Modal,\n ModalVariant,\n TimePicker,\n} from '@patternfly/react-core';\n\nimport { dashboardsSetEndTime, dashboardsSetTimespan } from '../../../actions/observe';\nimport { RootState } from '../../../redux';\nimport { setQueryArguments } from '../../utils';\n\nconst zeroPad = (number: number) => (number < 10 ? `0${number}` : number);\n\n// Get YYYY-MM-DD date string for a date object\nconst toISODateString = (date: Date): string =>\n `${date.getFullYear()}-${zeroPad(date.getMonth() + 1)}-${zeroPad(date.getDate())}`;\n\n// Get HH:MM time string for a date object\nconst toISOTimeString = (date: Date): string =>\n new Intl.DateTimeFormat(\n 'en',\n // TODO: TypeScript 3 doesn't allow the `hourCycle` attribute so use \"as any\" until we upgrade\n { hour: 'numeric', minute: 'numeric', hourCycle: 'h23' } as any,\n ).format(date);\n\ntype CustomTimeRangeModalProps = {\n activePerspective: string;\n isOpen: boolean;\n setClosed: () => void;\n};\n\nconst CustomTimeRangeModal: React.FC<CustomTimeRangeModalProps> = ({\n activePerspective,\n isOpen,\n setClosed,\n}) => {\n const { t } = useTranslation();\n\n const dispatch = useDispatch();\n const endTime = useSelector(({ observe }: RootState) =>\n observe.getIn(['dashboards', activePerspective, 'endTime']),\n );\n const timespan = useSelector(({ observe }: RootState) =>\n observe.getIn(['dashboards', activePerspective, 'timespan']),\n );\n\n // If a time is already set in Redux, default to that, otherwise default to a time range that\n // covers all of today\n const now = new Date();\n const defaultFrom = endTime && timespan ? new Date(endTime - timespan) : undefined;\n const [fromDate, setFromDate] = React.useState(toISODateString(defaultFrom ?? now));\n const [fromTime, setFromTime] = React.useState(\n defaultFrom ? toISOTimeString(defaultFrom) : '00:00',\n );\n const [toDate, setToDate] = React.useState(toISODateString(endTime ? new Date(endTime) : now));\n const [toTime, setToTime] = React.useState(\n endTime ? toISOTimeString(new Date(endTime)) : '23:59',\n );\n\n const submit: React.MouseEventHandler<HTMLButtonElement> = () => {\n const from = Date.parse(`${fromDate} ${fromTime}`);\n const to = Date.parse(`${toDate} ${toTime}`);\n if (_.isInteger(from) && _.isInteger(to)) {\n dispatch(dashboardsSetEndTime(to, activePerspective));\n dispatch(dashboardsSetTimespan(to - from, activePerspective));\n setQueryArguments({\n endTime: to.toString(),\n timeRange: (to - from).toString(),\n });\n setClosed();\n }\n };\n\n return (\n <Modal\n hasNoBodyWrapper\n isOpen={isOpen}\n position=\"top\"\n showClose={false}\n title={t('public~Custom time range')}\n variant={ModalVariant.small}\n >\n <Flex className=\"custom-time-range-modal\" direction={{ default: 'column' }}>\n <FlexItem spacer={{ default: 'spacerNone' }}>\n <label>{t('public~From')}</label>\n </FlexItem>\n <Flex>\n <FlexItem>\n <DatePicker onChange={(event, str) => setFromDate(str)} value={fromDate} />\n </FlexItem>\n <FlexItem>\n <TimePicker is24Hour onChange={(event, text) => setFromTime(text)} time={fromTime} />\n </FlexItem>\n </Flex>\n <FlexItem spacer={{ default: 'spacerNone' }}>\n <label>{t('public~To')}</label>\n </FlexItem>\n <Flex>\n <FlexItem>\n <DatePicker onChange={(event, str) => setToDate(str)} value={toDate} />\n </FlexItem>\n <FlexItem>\n <TimePicker is24Hour onChange={(event, text) => setToTime(text)} time={toTime} />\n </FlexItem>\n </Flex>\n <Flex className=\"custom-time-range-modal-footer\">\n <FlexItem align={{ default: 'alignRight' }}>\n <Button variant=\"secondary\" onClick={setClosed}>\n {t('public~Cancel')}\n </Button>\n </FlexItem>\n <FlexItem>\n <Button variant=\"primary\" onClick={submit}>\n {t('public~Save')}\n </Button>\n </FlexItem>\n </Flex>\n </Flex>\n </Modal>\n );\n};\n\nexport default CustomTimeRangeModal;\n","import * as React from 'react';\n\nexport const useIsVisible = (ref) => {\n const [isVisible, setIsVisible] = React.useState(false);\n const [wasEverVisible, setWasEverVisible] = React.useState(false);\n\n React.useEffect(() => {\n const callback = ([entry]) => {\n setIsVisible(entry.isIntersecting);\n if (entry.isIntersecting) {\n setWasEverVisible(true);\n }\n };\n\n const observer = new IntersectionObserver(callback);\n\n if (ref?.current) {\n observer.observe(ref.current);\n }\n\n return () => observer.disconnect();\n }, [ref, setIsVisible, setWasEverVisible]);\n\n return [isVisible, wasEverVisible];\n};\n","import * as React from 'react';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\n\nimport { useSafeFetch } from '../../utils';\nimport { useBoolean } from '../hooks/useBoolean';\nimport { Board } from './types';\n\nexport const useFetchDashboards = (namespace: string): [Board[], boolean, string] => {\n const { t } = useTranslation();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const safeFetch = React.useCallback(useSafeFetch(), []);\n const [boards, setBoards] = React.useState<Board[]>([]);\n const [error, setError] = React.useState<string>();\n const [isLoading, , , setLoaded] = useBoolean(true);\n\n React.useEffect(() => {\n safeFetch('/api/console/monitoring-dashboard-config')\n .then((response) => {\n setLoaded();\n setError(undefined);\n let items = response.items;\n if (namespace) {\n items = _.filter(\n items,\n (item) => item.metadata?.labels['console.openshift.io/odc-dashboard'] === 'true',\n );\n }\n\n const getBoardData = (item): Board => {\n try {\n return {\n data: JSON.parse(_.values(item.data)[0]),\n name: item.metadata.name,\n };\n } catch (e) {\n setError(\n t('public~Could not parse JSON data for dashboard \"{{dashboard}}\"', {\n dashboard: item.metadata.name,\n }),\n );\n return { data: undefined, name: item?.metadata?.name };\n }\n };\n\n const newBoards = _.sortBy(_.map(items, getBoardData), (v) => _.toLower(v?.data?.title));\n setBoards(newBoards);\n })\n .catch((err) => {\n setLoaded();\n if (err.name !== 'AbortError') {\n setError(_.get(err, 'json.error', err.message));\n }\n });\n }, [namespace, safeFetch, setLoaded, t]);\n\n return [boards, isLoading, error];\n};\n","import {\n GreenCheckCircleIcon,\n ListPageBody,\n PrometheusEndpoint,\n RedExclamationCircleIcon,\n RowFilter,\n RowProps,\n TableColumn,\n} from '@console/dynamic-plugin-sdk';\nimport {\n ListPageFilter,\n ListPageHeader,\n ResourceLink,\n Timestamp,\n useK8sWatchResource,\n useListPageFilter,\n VirtualizedTable,\n} from '@console/dynamic-plugin-sdk/src/lib-core';\nimport { useExactSearch } from '@console/app/src/components/user-preferences/search';\nimport {\n Alert,\n AlertActionCloseButton,\n Breadcrumb,\n BreadcrumbItem,\n Tooltip,\n} from '@patternfly/react-core';\nimport { sortable } from '@patternfly/react-table';\nimport { find, includes, isEmpty } from 'lodash-es';\nimport * as React from 'react';\nimport { Helmet } from 'react-helmet';\nimport { useTranslation } from 'react-i18next';\nimport { Routes, Route, useParams, Link } from 'react-router-dom-v5-compat';\n\nimport {\n NamespaceModel,\n ServiceModel,\n ServiceMonitorModel,\n PodModel,\n PodMonitorModel,\n} from '../../models';\nimport { K8sResourceKind, LabelSelector, referenceForModel } from '../../module/k8s';\nimport { SectionHeading } from '../utils/headings';\nimport { usePoll } from '../utils/poll-hook';\nimport { useSafeFetch } from '../utils/safe-fetch-hook';\nimport { LoadingInline, StatusBox } from '../utils/status-box';\nimport { useBoolean } from './hooks/useBoolean';\nimport { Labels } from './labels';\nimport { AlertSource, PrometheusAPIError, Target } from './types';\nimport { PROMETHEUS_BASE_PATH, targetSource } from './utils';\nimport { exactMatch, fuzzyCaseInsensitive } from '../factory/table-filters';\n\nenum MonitorType {\n ServiceMonitor = 'serviceMonitor',\n PodMonitor = 'podMonitor',\n}\n\nconst ServiceMonitorsWatchContext = React.createContext([]);\nconst ServicesWatchContext = React.createContext([]);\n\nconst PodMonitorsWatchContext = React.createContext([]);\nconst PodsWatchContext = React.createContext([]);\n\nconst PodMonitor: React.FC<{ target: Target }> = ({ target }) => {\n const { t } = useTranslation();\n\n const [podMonitors, podMonitorsLoaded, podMonitorsLoadError] = React.useContext(\n PodMonitorsWatchContext,\n );\n const [pods, podsLoaded] = React.useContext(PodsWatchContext);\n\n if (podMonitorsLoadError) {\n return (\n <>\n <RedExclamationCircleIcon /> {t('public~Error')}\n </>\n );\n }\n\n if (!podsLoaded || !podMonitorsLoaded) {\n return <LoadingInline />;\n }\n\n // First find the pod that corresponds to the target\n const pod = find(\n pods,\n ({ metadata }) =>\n metadata.name === target?.labels?.pod && metadata.namespace === target?.labels?.namespace,\n );\n\n // Now find the pod monitor that corresponds to the pod\n const podMonitor = find(\n podMonitors,\n ({ metadata, spec }) =>\n pod &&\n target.scrapePool.includes(`/${metadata.namespace}/${metadata.name}/`) &&\n ((spec.selector.matchLabels === undefined && spec.selector.matchExpressions === undefined) ||\n new LabelSelector(spec.selector).matchesLabels(pod.metadata.labels ?? {})) &&\n (spec.namespaceSelector?.matchNames === undefined ||\n includes(spec.namespaceSelector?.matchNames, pod.metadata.namespace)),\n );\n\n if (!podMonitor) {\n return <>-</>;\n }\n\n return (\n <ResourceLink\n kind={referenceForModel(PodMonitorModel)}\n name={podMonitor.metadata.name}\n namespace={podMonitor.metadata.namespace}\n />\n );\n};\n\nconst ServiceMonitor: React.FC<{ target: Target }> = ({ target }) => {\n const { t } = useTranslation();\n\n const [monitors, monitorsLoaded, monitorsLoadError] = React.useContext(\n ServiceMonitorsWatchContext,\n );\n const [services, servicesLoaded] = React.useContext(ServicesWatchContext);\n\n if (monitorsLoadError) {\n return (\n <>\n <RedExclamationCircleIcon /> {t('public~Error')}\n </>\n );\n }\n\n if (!servicesLoaded || !monitorsLoaded) {\n return <LoadingInline />;\n }\n\n // First find the service that corresponds to the target\n const service = find(\n services,\n ({ metadata }) =>\n metadata.name === target?.labels?.service && metadata.namespace === target?.labels?.namespace,\n );\n\n // Now find the service monitor that corresponds to the service\n const monitor = find(\n monitors,\n ({ metadata, spec }) =>\n service &&\n target.scrapePool.includes(`/${metadata.namespace}/${metadata.name}/`) &&\n ((spec.selector.matchLabels === undefined && spec.selector.matchExpressions === undefined) ||\n new LabelSelector(spec.selector).matchesLabels(service.metadata.labels ?? {})) &&\n (spec.namespaceSelector?.matchNames === undefined ||\n includes(spec.namespaceSelector?.matchNames, service.metadata.namespace)),\n );\n\n if (!monitor) {\n return <>-</>;\n }\n\n return (\n <ResourceLink\n kind={referenceForModel(ServiceMonitorModel)}\n name={monitor.metadata.name}\n namespace={monitor.metadata.namespace}\n />\n );\n};\n\nconst Health: React.FC<{ health: 'up' | 'down' }> = React.memo(({ health }) => {\n const { t } = useTranslation();\n\n return health === 'up' ? (\n <>\n <GreenCheckCircleIcon /> {t('public~Up')}\n </>\n ) : (\n <>\n <RedExclamationCircleIcon /> {t('public~Down')}\n </>\n );\n});\n\ntype WatchErrorAlertProps = {\n loadError: { code: number; message: string };\n title: string;\n};\n\nconst WatchErrorAlert: React.FC<WatchErrorAlertProps> = ({ loadError, title }) => {\n const [showError, , , hideError] = useBoolean(true);\n\n if (!showError) {\n return null;\n }\n\n return (\n <Alert\n className=\"co-alert\"\n title={title}\n variant=\"danger\"\n actionClose={<AlertActionCloseButton onClose={hideError} />}\n >\n {loadError.message}\n </Alert>\n );\n};\n\ntype DetailsProps = {\n loaded: boolean;\n loadError: string;\n targets: Target[];\n};\n\nconst Details: React.FC<DetailsProps> = ({ loaded, loadError, targets }) => {\n const { t } = useTranslation();\n const params = useParams();\n\n let scrapeUrl: string = '';\n let target: Target | undefined;\n if (params.scrapeUrl) {\n try {\n scrapeUrl = atob(params.scrapeUrl);\n target = find(targets, { scrapeUrl });\n } catch {\n // Leave scrapeUrl and target unset\n }\n }\n\n const isServiceMonitor: boolean =\n target && target.scrapePool.includes(MonitorType.ServiceMonitor);\n const isPodMonitor: boolean = target && target.scrapePool.includes(MonitorType.PodMonitor);\n\n const [, , serviceMonitorsLoadError] = React.useContext(ServiceMonitorsWatchContext);\n const [, , podMonitorsLoadError] = React.useContext(PodMonitorsWatchContext);\n\n return (\n <>\n <Helmet>\n <title>{t('public~Target details')}</title>\n </Helmet>\n <div className=\"pf-v5-c-page__main-breadcrumb\">\n <Breadcrumb className=\"co-breadcrumb\">\n <BreadcrumbItem>\n <Link className=\"pf-v5-c-breadcrumb__link\" to=\"/monitoring/targets\">\n {t('public~Targets')}\n </Link>\n </BreadcrumbItem>\n <BreadcrumbItem isActive>{t('public~Target details')}</BreadcrumbItem>\n </Breadcrumb>\n </div>\n <div className=\"co-m-nav-title co-m-nav-title--detail co-m-nav-title--breadcrumbs\">\n <h1 className=\"co-m-pane__heading\">\n <div className=\"co-resource-item\">{scrapeUrl}</div>\n </h1>\n </div>\n <StatusBox data={target} label=\"target\" loaded={loaded} loadError={loadError}>\n <div className=\"co-m-pane__body\">\n <SectionHeading text={t('public~Target details')} />\n {isServiceMonitor && serviceMonitorsLoadError && (\n <WatchErrorAlert\n loadError={serviceMonitorsLoadError}\n title={t('public~Error loading service monitor data')}\n />\n )}\n {isPodMonitor && podMonitorsLoadError && (\n <WatchErrorAlert\n loadError={podMonitorsLoadError}\n title={t('public~Error loading pod monitor data')}\n />\n )}\n <div className=\"co-m-pane__body-group\">\n <div className=\"row\">\n <div className=\"col-sm-6\">\n <dl className=\"co-m-pane__details\">\n <dt>{t('public~Endpoint')}</dt>\n <dd>{scrapeUrl}</dd>\n <dt>{t('public~Namespace')}</dt>\n <dd>\n <ResourceLink kind=\"Namespace\" name={target?.labels?.namespace} />\n </dd>\n <dt>{t('public~Labels')}</dt>\n <dd>\n <Labels kind=\"metricstarget\" labels={target?.labels} />\n </dd>\n <dt>{t('public~Last scrape')}</dt>\n <dd>\n <Timestamp timestamp={target?.lastScrape} />\n </dd>\n {target?.lastError && (\n <Alert className=\"co-alert\" title={t('public~Scrape failed')} variant=\"danger\">\n {target?.lastError}\n </Alert>\n )}\n </dl>\n </div>\n <div className=\"col-sm-6\">\n <dl className=\"co-m-pane__details\">\n <dt>{t('public~Status')}</dt>\n <dd>\n <Health health={target?.health} />\n </dd>\n <dt>{t('public~Monitor')}</dt>\n {isServiceMonitor && (\n <dd>\n <ServiceMonitor target={target} />\n </dd>\n )}\n {isPodMonitor && (\n <dd>\n <PodMonitor target={target} />\n </dd>\n )}\n {!isServiceMonitor && !isPodMonitor && (\n <dd>\n <>-</>\n </dd>\n )}\n </dl>\n </div>\n </div>\n </div>\n </div>\n </StatusBox>\n </>\n );\n};\n\nconst tableClasses = [\n 'pf-v5-u-w-25-on-md', // Endpoint\n 'pf-v5-u-w-16-on-md', // Monitor\n '', // Status\n 'pf-v5-u-w-16-on-md', // Namespace\n 'pf-m-hidden pf-m-visible-on-md', // Last Scrape\n 'pf-m-hidden pf-m-visible-on-md', // Scrape Duration\n];\n\nconst Row: React.FC<RowProps<Target>> = ({ obj }) => {\n const { health, labels, lastError, lastScrape, lastScrapeDuration, scrapePool, scrapeUrl } = obj;\n\n const isServiceMonitor: boolean = scrapePool?.includes(MonitorType.ServiceMonitor);\n const isPodMonitor: boolean = scrapePool?.includes(MonitorType.PodMonitor);\n\n return (\n <>\n <td className={tableClasses[0]}>\n <Link to={`./targets/${btoa(scrapeUrl)}`}>{scrapeUrl}</Link>\n </td>\n <td className={tableClasses[1]}>\n {isServiceMonitor && <ServiceMonitor target={obj} />}\n {isPodMonitor && <PodMonitor target={obj} />}\n {!isServiceMonitor && !isPodMonitor && <>-</>}\n </td>\n <td className={tableClasses[2]}>\n {health === 'up' ? (\n <Health health=\"up\" />\n ) : (\n <Tooltip content={lastError}>\n <span>\n <Health health=\"down\" />\n </span>\n </Tooltip>\n )}\n </td>\n <td className={tableClasses[3]}>\n {labels?.namespace && (\n <ResourceLink inline kind={NamespaceModel.kind} name={labels?.namespace} />\n )}\n </td>\n <td className={tableClasses[4]}>\n <Timestamp timestamp={lastScrape} />\n </td>\n <td className={tableClasses[5]}>\n {lastScrapeDuration ? `${(1000 * lastScrapeDuration).toFixed(1)} ms` : '-'}\n </td>\n </>\n );\n};\n\ntype ListProps = {\n data: Target[];\n loaded: boolean;\n loadError: string;\n unfilteredData: Target[];\n};\n\nconst List: React.FC<ListProps> = ({ data, loaded, loadError, unfilteredData }) => {\n const { t } = useTranslation();\n\n const columns = React.useMemo<TableColumn<Target>[]>(\n () => [\n {\n id: 'scrapeUrl',\n title: t('public~Endpoint'),\n sort: 'scrapeUrl',\n transforms: [sortable],\n props: { className: tableClasses[0] },\n },\n {\n id: 'monitor',\n title: t('public~Monitor'),\n props: { className: tableClasses[1] },\n },\n {\n id: 'health',\n title: t('public~Status'),\n sort: 'health',\n transforms: [sortable],\n props: { className: tableClasses[2] },\n },\n {\n id: 'namespace',\n title: t('public~Namespace'),\n sort: 'labels.namespace',\n transforms: [sortable],\n props: { className: tableClasses[3] },\n },\n {\n id: 'lastScrape',\n title: t('public~Last Scrape'),\n sort: 'lastScrape',\n transforms: [sortable],\n props: { className: tableClasses[4] },\n },\n {\n id: 'lastScrapeDuration',\n title: t('public~Scrape Duration'),\n sort: 'lastScrapeDuration',\n transforms: [sortable],\n props: { className: tableClasses[5] },\n },\n ],\n [t],\n );\n\n return (\n <VirtualizedTable<Target>\n aria-label=\"metrics targets\"\n columns={columns}\n data={data}\n loaded={loaded}\n loadError={loadError}\n Row={Row}\n unfilteredData={unfilteredData}\n />\n );\n};\n\ntype ListPageProps = {\n loaded: boolean;\n loadError: string;\n targets: Target[];\n};\n\nconst ListPage: React.FC<ListPageProps> = ({ loaded, loadError, targets }) => {\n const { t } = useTranslation();\n\n const [, , serviceMonitorsLoadError] = React.useContext(ServiceMonitorsWatchContext);\n const [, , podMonitorsLoadError] = React.useContext(PodMonitorsWatchContext);\n const [isExactSearch] = useExactSearch();\n const matchFn: Function = isExactSearch ? exactMatch : fuzzyCaseInsensitive;\n const nameFilter: RowFilter = {\n filter: (filter, target: Target) =>\n matchFn(filter.selected?.[0], target.scrapeUrl) ||\n matchFn(filter.selected?.[0], target.labels?.namespace),\n items: [],\n type: 'name',\n } as RowFilter;\n\n const rowFilters: RowFilter[] = [\n {\n filter: (filter, target: Target) =>\n filter.selected?.includes(target.health) || isEmpty(filter.selected),\n filterGroupName: t('public~Status'),\n items: [\n { id: 'up', title: t('public~Up') },\n { id: 'down', title: t('public~Down') },\n ],\n reducer: (target: Target) => target?.health,\n type: 'observe-target-health',\n },\n {\n filter: (filter, target: Target) =>\n filter.selected?.includes(targetSource(target)) || isEmpty(filter.selected),\n filterGroupName: t('public~Source'),\n items: [\n { id: AlertSource.Platform, title: t('public~Platform') },\n { id: AlertSource.User, title: t('public~User') },\n ],\n reducer: targetSource,\n type: 'observe-target-source',\n },\n ];\n\n const allFilters: RowFilter[] = [nameFilter, ...rowFilters];\n\n const [staticData, filteredData, onFilterChange] = useListPageFilter(targets, allFilters);\n\n const title = t('public~Metrics targets');\n\n return (\n <>\n <Helmet>\n <title>{title}</title>\n </Helmet>\n <ListPageHeader title={title} />\n <ListPageBody>\n {loadError && (\n <Alert\n className=\"co-alert\"\n title={t('public~Error loading latest targets data')}\n variant=\"danger\"\n >\n {loadError}\n </Alert>\n )}\n {serviceMonitorsLoadError && (\n <WatchErrorAlert\n loadError={serviceMonitorsLoadError}\n title={t('public~Error loading service monitor data')}\n />\n )}\n {podMonitorsLoadError && (\n <WatchErrorAlert\n loadError={podMonitorsLoadError}\n title={t('public~Error loading pod monitor data')}\n />\n )}\n <ListPageFilter\n data={staticData}\n labelFilter=\"observe-target-labels\"\n labelPath=\"labels\"\n loaded={loaded}\n nameFilterPlaceholder={t('public~Search by endpoint or namespace...')}\n nameFilterTitle={t('public~Text')}\n onFilterChange={onFilterChange}\n rowFilters={rowFilters}\n />\n <div className=\"row\">\n <div className=\"col-xs-12\">\n <List\n data={filteredData ?? []}\n loaded={loaded}\n loadError={loadError}\n unfilteredData={targets}\n />\n </div>\n </div>\n </ListPageBody>\n </>\n );\n};\n\nconst POLL_INTERVAL = 15 * 1000;\n\nexport const TargetsUI: React.FC<{}> = () => {\n const [error, setError] = React.useState<PrometheusAPIError>();\n const [loaded, setLoaded] = React.useState(false);\n const [targets, setTargets] = React.useState<Target[]>();\n\n const servicesWatch = useK8sWatchResource<K8sResourceKind[]>({\n isList: true,\n kind: ServiceModel.kind,\n });\n\n const monitorsWatch = useK8sWatchResource<K8sResourceKind[]>({\n isList: true,\n kind: referenceForModel(ServiceMonitorModel),\n });\n\n const podsWatch = useK8sWatchResource<K8sResourceKind[]>({\n isList: true,\n kind: PodModel.kind,\n });\n\n const podMonitorsWatch = useK8sWatchResource<K8sResourceKind[]>({\n isList: true,\n kind: referenceForModel(PodMonitorModel),\n });\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const safeFetch = React.useCallback(useSafeFetch(), []);\n\n const tick = () =>\n safeFetch(`${PROMETHEUS_BASE_PATH}/${PrometheusEndpoint.TARGETS}?state=active`)\n .then((response) => {\n setError(undefined);\n setLoaded(true);\n setTargets(response?.data?.activeTargets);\n })\n .catch((err) => {\n if (err.name !== 'AbortError') {\n setError(err);\n setLoaded(true);\n }\n });\n\n usePoll(tick, POLL_INTERVAL);\n\n const loadError = error?.json?.error || error?.message;\n\n return (\n <ServiceMonitorsWatchContext.Provider value={monitorsWatch}>\n <ServicesWatchContext.Provider value={servicesWatch}>\n <PodMonitorsWatchContext.Provider value={podMonitorsWatch}>\n <PodsWatchContext.Provider value={podsWatch}>\n <Routes>\n <Route\n path=\"/monitoring/targets\"\n element={<ListPage loaded={loaded} loadError={loadError} targets={targets} />}\n />\n <Route\n path=\"/monitoring/targets/:scrapeUrl?\"\n element={<Details loaded={loaded} loadError={loadError} targets={targets} />}\n />\n </Routes>\n </PodsWatchContext.Provider>\n </PodMonitorsWatchContext.Provider>\n </ServicesWatchContext.Provider>\n </ServiceMonitorsWatchContext.Provider>\n );\n};\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport classNames from 'classnames';\nimport { Helmet } from 'react-helmet';\nimport { Alert, Breadcrumb, BreadcrumbItem } from '@patternfly/react-core';\nimport { safeLoad } from 'js-yaml';\nimport { useTranslation } from 'react-i18next';\nimport { useLocation, Link } from 'react-router-dom-v5-compat';\nimport { breadcrumbsForGlobalConfig } from '../../cluster-settings/global-config';\n\nimport { K8sResourceKind } from '../../../module/k8s';\nimport { AsyncComponent, Firehose, StatusBox } from '../../utils';\nimport { patchAlertmanagerConfig, getAlertmanagerYAML } from './alertmanager-utils';\n\nconst EditAlertmanagerYAML = (props) => (\n <AsyncComponent\n {...props}\n loader={() => import('../../edit-yaml').then((c) => c.EditYAML)}\n create={false}\n genericYAML\n />\n);\n\nconst AlertmanagerYAMLEditor: React.FC<AlertmanagerYAMLEditorProps> = ({ obj: secret }) => {\n const [errorMsg, setErrorMsg] = React.useState<string>();\n const [successMsg, setSuccessMsg] = React.useState<string>();\n const { t } = useTranslation();\n\n const save = (yaml: string) => {\n if (_.isEmpty(yaml)) {\n setErrorMsg('Alertmanager configuration cannot be empty.');\n setSuccessMsg('');\n return;\n }\n try {\n safeLoad(yaml);\n } catch (e) {\n setErrorMsg(`Error parsing Alertmanager YAML: ${e}`);\n setSuccessMsg('');\n return;\n }\n patchAlertmanagerConfig(secret, yaml).then(\n (newSecret) => {\n setSuccessMsg(\n `${newSecret.metadata.name} has been updated to version ${newSecret.metadata.resourceVersion}`,\n );\n setErrorMsg('');\n },\n (err) => {\n setErrorMsg(err.message);\n setSuccessMsg('');\n },\n );\n };\n\n const { yaml: alertmanagerYAML, errorMessage: loadErrorMsg } = getAlertmanagerYAML(secret);\n\n if (loadErrorMsg) {\n return (\n <Alert\n isInline\n className=\"co-alert co-alert--scrollable\"\n variant=\"danger\"\n title=\"An error occurred\"\n >\n <div className=\"co-pre-line\">{loadErrorMsg}</div>\n </Alert>\n );\n }\n\n return (\n <>\n <div className=\"co-m-nav-title\">\n <p className=\"help-block\">\n {t(\n 'public~Update this YAML to configure Routes, Receivers, Groupings and other Alertmanager settings.',\n )}\n </p>\n </div>\n <EditAlertmanagerYAML onSave={save} obj={alertmanagerYAML}>\n {errorMsg && (\n <Alert\n isInline\n className=\"co-alert co-alert--scrollable\"\n variant=\"danger\"\n title=\"An error occurred\"\n >\n <div className=\"co-pre-line\">{errorMsg}</div>\n </Alert>\n )}\n {successMsg && (\n <Alert\n isInline\n className=\"co-alert\"\n variant=\"success\"\n title={successMsg}\n data-test=\"alert-success\"\n />\n )}\n </EditAlertmanagerYAML>\n </>\n );\n};\n\nconst AlertmanagerYAMLEditorWrapper: React.FC<AlertmanagerYAMLEditorWrapperProps> = React.memo(\n ({ obj, ...props }) => {\n const { t } = useTranslation();\n return (\n <>\n <Helmet>\n <title>{t('public~Alerting')}</title>\n </Helmet>\n <StatusBox {...obj}>\n <AlertmanagerYAMLEditor {...props} obj={obj.data} />\n </StatusBox>\n </>\n );\n },\n);\n\nconst AlertmanagerYAML: React.FC<{}> = () => {\n const { t } = useTranslation();\n const { pathname: url } = useLocation();\n\n const configPath = '/monitoring/alertmanagerconfig';\n const YAMLPath = '/monitoring/alertmanageryaml';\n\n const breadcrumbs = breadcrumbsForGlobalConfig('Alertmanager', configPath);\n\n return (\n <>\n <div className=\"pf-c-page__main-breadcrumb\">\n <Breadcrumb className=\"monitoring-breadcrumbs\">\n <BreadcrumbItem>\n <Link className=\"pf-c-breadcrumb__link\" to={breadcrumbs[0].path}>\n {breadcrumbs[0].name}\n </Link>\n </BreadcrumbItem>\n <BreadcrumbItem isActive>{breadcrumbs[1].name}</BreadcrumbItem>\n </Breadcrumb>\n </div>\n <div className=\"co-m-nav-title co-m-nav-title--detail co-m-nav-title--breadcrumbs\">\n <h1 className=\"co-m-pane__heading\">\n <div className=\"co-m-pane__name co-resource-item\">\n <span className=\"co-resource-item__resource-name\" data-test-id=\"resource-title\">\n {t('public~Alertmanager')}\n </span>\n </div>\n </h1>\n </div>\n <ul className=\"co-m-horizontal-nav__menu\">\n <li\n className={classNames('co-m-horizontal-nav__menu-item', {\n 'co-m-horizontal-nav-item--active': url === configPath,\n })}\n >\n <Link to={configPath} data-test-id=\"horizontal-link-details\">\n {t('public~Details')}\n </Link>\n </li>\n <li\n className={classNames('co-m-horizontal-nav__menu-item', {\n 'co-m-horizontal-nav-item--active': url === YAMLPath,\n })}\n >\n <Link to={YAMLPath} data-test-id=\"horizontal-link-yaml\">\n {t('public~YAML')}\n </Link>\n </li>\n </ul>\n <Firehose\n resources={[\n {\n kind: 'Secret',\n name: 'alertmanager-main',\n namespace: 'openshift-monitoring',\n isList: false,\n prop: 'obj',\n },\n ]}\n >\n <AlertmanagerYAMLEditorWrapper />\n </Firehose>\n </>\n );\n};\n\ntype AlertmanagerYAMLEditorWrapperProps = {\n obj?: {\n data?: K8sResourceKind;\n [key: string]: any;\n };\n};\n\ntype AlertmanagerYAMLEditorProps = {\n obj?: K8sResourceKind;\n onCancel?: () => void;\n};\n\nexport default AlertmanagerYAML;\n","module.exports = __webpack_public_path__ + \"assets/public/imgs/network-policy-samples/1-deny-other-namespaces.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/network-policy-samples/2-limit-certain-apps.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/network-policy-samples/3-allow-ingress.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/network-policy-samples/4-default-deny-all.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/network-policy-samples/5-web-allow-external.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/network-policy-samples/6-web-db-allow-all-ns.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/network-policy-samples/7-web-allow-production.svg\";","import * as React from 'react';\nimport {\n Divider,\n Menu,\n MenuContent,\n MenuSearch,\n MenuItem,\n MenuList,\n Switch,\n MenuSearchInput,\n} from '@patternfly/react-core';\nimport DropdownWithSwitchGroups, { DropdownWithSwitchGroup } from './DropdownWithSwitchGroups';\n\nconst DropdownWithSwitchMenu: React.FC<DropdownWithSwitchMenuProps> = ({\n menuRef,\n onSelect,\n options,\n selected,\n setOpen,\n switchIsChecked,\n switchIsDisabled,\n switchLabel,\n switchLabelClassName,\n switchLabelIsReversed,\n switchLabelOff,\n switchOnChange,\n}) => {\n return (\n <Menu\n activeItemId={selected}\n isScrollable\n onSelect={(event: React.MouseEvent, itemId: string) => {\n onSelect(event, itemId);\n setOpen(false);\n }}\n ref={menuRef}\n style={{ position: 'absolute' }}\n >\n <MenuContent>\n <MenuSearch>\n <MenuSearchInput>\n <Switch\n className={switchLabelClassName}\n isChecked={switchIsChecked}\n isDisabled={switchIsDisabled}\n isReversed={switchLabelIsReversed}\n label={switchLabel}\n labelOff={switchLabelOff}\n onChange={(_event, value) => switchOnChange(value)}\n data-test=\"dropdown-with-switch-switch\"\n />\n </MenuSearchInput>\n </MenuSearch>\n <Divider />\n {/* PatternFly expects Menu to contain a MenuList with a MenuItem\n see https://github.com/patternfly/patternfly-react/issues/7365\n hack to workaround this bug by adding a hidden MenuList */}\n <MenuList className=\"pf-v5-u-display-none\">\n <MenuItem> </MenuItem>\n </MenuList>\n <DropdownWithSwitchGroups options={options} selectedKey={selected} />\n </MenuContent>\n </Menu>\n );\n};\n\ntype DropdownWithSwitchMenuProps = {\n menuRef: React.MutableRefObject<HTMLDivElement>;\n onSelect: (event: React.MouseEvent, itemId: string) => void;\n options: DropdownWithSwitchGroup[];\n selected?: string;\n setOpen: (isOpen: boolean) => void;\n switchIsChecked: boolean;\n switchIsDisabled?: boolean;\n switchLabelIsReversed?: boolean;\n switchLabel?: React.ReactNode;\n switchLabelClassName?: string;\n switchLabelOff?: React.ReactNode;\n switchOnChange: (isChecked: boolean) => void;\n};\n\nexport default DropdownWithSwitchMenu;\n","import * as React from 'react';\nimport { Divider, MenuGroup, MenuItem, MenuList } from '@patternfly/react-core';\n\nconst DropdownWithSwitchGroups: React.FC<DropdownWithSwitchGroupsProps> = ({\n options,\n selectedKey,\n}) => {\n const renderedOptions = options.filter(({ items }) => items.length > 0);\n return renderedOptions.length === 0 ? null : (\n <>\n {renderedOptions.map(({ items, key, label }, i) => (\n <React.Fragment key={key}>\n {i !== 0 && <Divider />}\n <MenuGroup label={label}>\n <MenuList>\n {items.map(({ isDisabled, key: iKey, title }) => (\n <MenuItem\n itemId={iKey}\n isDisabled={isDisabled}\n isSelected={selectedKey === iKey}\n key={iKey}\n data-test={`dropdown-with-switch-menu-item-${iKey}`}\n >\n {title}\n </MenuItem>\n ))}\n </MenuList>\n </MenuGroup>\n </React.Fragment>\n ))}\n </>\n );\n};\n\nexport type DropdownWithSwitchGroup = {\n items: {\n isDisabled: boolean;\n key: string;\n title: string;\n }[];\n key: string;\n label?: string;\n};\n\ntype DropdownWithSwitchGroupsProps = {\n options: DropdownWithSwitchGroup[];\n selectedKey: string;\n};\n\nexport default DropdownWithSwitchGroups;\n","import * as React from 'react';\nimport { MenuToggle, Popper } from '@patternfly/react-core';\n\nconst DropdownWithSwitchToggle: React.FC<DropdownWithSwitchToggleProps> = ({\n isDisabled,\n isFullWidth,\n isOpen,\n label,\n menu,\n menuRef,\n onToggle,\n}) => {\n const toggleRef = React.useRef(null);\n const containerRef = React.useRef(null);\n React.useEffect(() => {\n const handleMenuKeys = (event: KeyboardEvent) => {\n if (\n event.key === 'Tab' &&\n event.target instanceof Node &&\n !menuRef.current?.contains(event.target)\n ) {\n onToggle(false);\n }\n };\n const handleMenuClick = (event: MouseEvent) => {\n if (\n menuRef.current &&\n event.target instanceof Node &&\n !menuRef.current.contains(event.target) &&\n !toggleRef.current.contains(event.target)\n ) {\n onToggle(false);\n }\n };\n window.addEventListener('keyup', handleMenuKeys);\n window.addEventListener('click', handleMenuClick);\n return () => {\n window.removeEventListener('keyup', handleMenuKeys);\n window.removeEventListener('click', handleMenuClick);\n };\n }, [menuRef, onToggle]);\n\n return (\n <div ref={containerRef}>\n <Popper\n appendTo={containerRef.current}\n direction=\"down\"\n enableFlip={false}\n isVisible={isOpen}\n popper={<>{menu}</>} // fragment is necessary to avoid a bug in PatternFly v5 Popper\n position=\"left\"\n trigger={\n <MenuToggle\n isDisabled={isDisabled}\n isFullWidth={isFullWidth}\n isExpanded={isOpen}\n onClick={() => onToggle(!isOpen)}\n ref={toggleRef}\n data-test=\"dropdown-with-switch-toggle\"\n >\n {label}\n </MenuToggle>\n }\n />\n </div>\n );\n};\n\ntype DropdownWithSwitchToggleProps = {\n isDisabled?: boolean;\n isFullWidth?: boolean;\n isOpen: boolean;\n label: string;\n menu: React.ReactElement;\n menuRef: React.RefObject<HTMLElement>;\n onToggle: (state: boolean) => void;\n};\n\nexport default DropdownWithSwitchToggle;\n","import { gridItemSpanValueShape } from '@patternfly/react-core';\nimport * as _ from 'lodash';\n\nexport const getSpans = (totalFieldCount: gridItemSpanValueShape): gridItemSpanValueShape[] => {\n const spans: gridItemSpanValueShape[] = _.fill(\n Array(totalFieldCount),\n Math.trunc(12 / totalFieldCount),\n ) as gridItemSpanValueShape[];\n\n let remainder = 12 % totalFieldCount;\n\n while (remainder--) {\n spans[remainder]++;\n }\n\n return spans;\n};\n","import * as React from 'react';\nimport { Grid, GridItem, gridItemSpanValueShape } from '@patternfly/react-core';\nimport './MultiColumnField.scss';\n\nexport interface MultiColumnFieldHeaderProps {\n headers: ({ name: string; required: boolean } | string)[];\n spans: gridItemSpanValueShape[];\n}\n\nconst MultiColumnFieldHeader: React.FC<MultiColumnFieldHeaderProps> = ({ headers, spans }) => (\n <div className=\"odc-multi-column-field__header\">\n <Grid>\n {headers.map((header, i) => (\n <GridItem span={spans[i]} key={typeof header === 'string' ? header : header.name}>\n <div className=\"odc-multi-column-field__col\">\n {typeof header === 'string' ? (\n header\n ) : (\n <>\n {header.name}\n {header.required && (\n <span\n className=\"odc-multi-column-field__header--required-label\"\n aria-hidden=\"true\"\n >\n *\n </span>\n )}\n </>\n )}\n </div>\n </GridItem>\n ))}\n </Grid>\n </div>\n);\n\nexport default MultiColumnFieldHeader;\n","import * as React from 'react';\nimport {\n Tooltip,\n Button,\n ButtonVariant,\n ButtonType,\n GridItem,\n Grid,\n gridItemSpanValueShape,\n} from '@patternfly/react-core';\nimport { MinusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/minus-circle-icon';\nimport { useTranslation } from 'react-i18next';\nimport './MultiColumnField.scss';\n\nexport interface RowRendererProps {\n fieldName: string;\n isReadOnly?: boolean;\n spans: gridItemSpanValueShape[];\n complexFields?: boolean[];\n disableDeleteRow?: boolean;\n tooltipDeleteRow?: string;\n onDelete: () => void;\n}\nexport interface MultiColumnFieldRowProps extends Omit<RowRendererProps, 'fieldName'> {\n name: string;\n rowIndex: number;\n children?: React.ReactNode;\n rowRenderer?: (row: RowRendererProps) => React.ReactNode;\n}\n\nconst DEFAULT_ROW_RENDERER = ({\n fieldName,\n complexFields,\n children,\n isReadOnly,\n spans,\n disableDeleteRow,\n tooltipDeleteRow,\n onDelete,\n}): React.ReactNode => {\n const { t } = useTranslation();\n return (\n <div className=\"odc-multi-column-field__row\" data-test={`row ${fieldName}`}>\n <Grid>\n {React.Children.map(children, (child: React.ReactElement, i) => {\n let newProps = child.props;\n if (complexFields[i]) {\n newProps = { ...newProps, namePrefix: fieldName };\n } else {\n newProps = { ...newProps, name: `${fieldName}.${child.props.name}` };\n }\n return (\n <GridItem span={spans[i]} key={fieldName}>\n <div className=\"odc-multi-column-field__col\">\n {React.cloneElement(child, newProps)}\n </div>\n </GridItem>\n );\n })}\n </Grid>\n {!isReadOnly && (\n <div className={'odc-multi-column-field__col--button'}>\n <Tooltip content={tooltipDeleteRow || t('console-shared~Remove')}>\n <Button\n data-test=\"delete-row\"\n aria-label={tooltipDeleteRow || t('console-shared~Remove')}\n variant={ButtonVariant.plain}\n type={ButtonType.button}\n isInline\n onClick={!disableDeleteRow ? onDelete : undefined}\n isAriaDisabled={disableDeleteRow}\n >\n <MinusCircleIcon />\n </Button>\n </Tooltip>\n </div>\n )}\n </div>\n );\n};\n\nconst MultiColumnFieldRow: React.FC<MultiColumnFieldRowProps> = ({\n name,\n rowIndex,\n onDelete,\n children,\n isReadOnly,\n disableDeleteRow,\n tooltipDeleteRow,\n spans,\n complexFields = [],\n rowRenderer = DEFAULT_ROW_RENDERER,\n}) => {\n const fieldName = `${name}.${rowIndex}`;\n return (\n <>\n {rowRenderer({\n fieldName,\n complexFields,\n children,\n isReadOnly,\n spans,\n disableDeleteRow,\n tooltipDeleteRow,\n onDelete,\n })}\n </>\n );\n};\n\nexport default MultiColumnFieldRow;\n","import * as React from 'react';\nimport { Card, CardBody, CardTitle } from '@patternfly/react-core';\nimport { StarIcon } from '@patternfly/react-icons/dist/esm/icons/star-icon';\nimport * as classNames from 'classnames';\nimport './SelectorCard.scss';\n\ninterface SelectorCardProps {\n title: string;\n iconUrl: string;\n name: string;\n selected?: boolean;\n recommended?: boolean;\n onChange: (name: string) => void;\n}\n\nconst SelectorCard: React.FC<SelectorCardProps> = ({\n title,\n iconUrl,\n name,\n selected,\n recommended = false,\n onChange,\n}) => {\n const classes = classNames('odc-selector-card', { 'is-selected': selected });\n return (\n <Card\n component=\"button\"\n type=\"button\"\n className={classes}\n onClick={() => onChange(name)}\n data-test={`card ${name}`}\n >\n <CardTitle>\n <img className=\"odc-selector-card__icon\" src={iconUrl} alt=\"\" />\n </CardTitle>\n <CardBody>\n <span className=\"odc-selector-card__title\">{title}</span>\n </CardBody>\n {recommended && (\n <span className=\"odc-selector-card__recommended\">\n <StarIcon />\n </span>\n )}\n </Card>\n );\n};\n\nexport default SelectorCard;\n","import * as React from 'react';\nimport { TextColumnItemProps } from './text-column-types';\nimport TextColumnItemContent from './TextColumnItemContent';\n\nconst TextColumnItem: React.FC<TextColumnItemProps> = (props) => {\n return <TextColumnItemContent {...props} previewDropRef={null} dragRef={null} opacity={1} />;\n};\nexport default TextColumnItem;\n","import * as React from 'react';\nimport { useDrag, useDrop } from 'react-dnd';\nimport withDragDropContext from '@console/internal/components/utils/drag-drop-context';\nimport { TextColumnItemProps, ItemTypes, DragItem } from './text-column-types';\nimport TextColumnItemContent from './TextColumnItemContent';\n\nconst TextColumnItemWithDnd: React.FC<TextColumnItemProps> = (props) => {\n const { idx, onChange, rowValues, arrayHelpers } = props;\n const [, drag, preview] = useDrag({\n item: { type: ItemTypes.TextColumn, id: `${ItemTypes.TextColumn}-${idx}`, idx },\n });\n const [{ opacity }, drop] = useDrop({\n accept: ItemTypes.TextColumn,\n collect: (monitor) => ({\n opacity: monitor.isOver() ? 0 : 1,\n }),\n hover(item: DragItem) {\n if (item.idx === idx) {\n return;\n }\n arrayHelpers.swap(item.idx, idx);\n if (onChange) {\n const values = [...rowValues];\n [values[idx], values[item.idx]] = [values[item.idx], values[idx]];\n onChange(values);\n }\n // monitor item updated here to avoid expensive index searches.\n item.idx = idx;\n },\n });\n\n return (\n <TextColumnItemContent\n {...props}\n dragRef={drag}\n previewDropRef={(node) => preview(drop(node))}\n opacity={opacity}\n />\n );\n};\n\nexport default withDragDropContext(TextColumnItemWithDnd);\n","import * as React from 'react';\nimport { QuickStart } from '@patternfly/quickstarts';\nimport useQuickStartPermission from '../utils/useQuickStartPermission';\n\ntype QuickStartPermissionCheckerProps = {\n quickStart: QuickStart;\n onPermissionCheck: (quickStart: QuickStart, hasPermission: boolean) => void;\n};\n\nconst QuickStartPermissionChecker: React.FC<QuickStartPermissionCheckerProps> = ({\n quickStart,\n onPermissionCheck,\n}) => {\n const [hasPermission, loaded] = useQuickStartPermission(quickStart);\n\n React.useEffect(() => {\n if (loaded) {\n onPermissionCheck(quickStart, hasPermission);\n }\n }, [hasPermission, loaded, onPermissionCheck, quickStart]);\n\n return null;\n};\n\nexport default QuickStartPermissionChecker;\n","import { QuickStart } from '@patternfly/quickstarts';\nimport { useAccessReview2 } from '@console/internal/components/utils';\n\nconst useQuickStartPermission = (quickStart: QuickStart): [boolean, boolean] => {\n const {\n spec: { accessReviewResources },\n } = quickStart;\n\n const accessReviews = [];\n const accessReviewsLoading = [];\n\n if (accessReviewResources) {\n accessReviewResources.forEach((descriptor) => {\n // access review resources for a specific quick start is going to be static so the order will not change\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const [review, loading] = useAccessReview2(descriptor);\n accessReviews.push(review);\n accessReviewsLoading.push(loading);\n });\n }\n\n const hasAccess = !accessReviewResources || accessReviews.every((review) => review);\n\n const loaded = accessReviewsLoading.every((loading) => !loading);\n\n return [loaded && hasAccess, loaded];\n};\n\nexport default useQuickStartPermission;\n","import * as React from 'react';\n\nexport const useForceUpdate = () => {\n const [, setTick] = React.useState(0);\n const update = React.useCallback(() => {\n setTick((tick) => tick + 1);\n }, []);\n return update;\n};\n","import * as React from 'react';\nimport { DraggableCore, DraggableEvent, DraggableData } from 'react-draggable';\n\nimport './DraggableCoreIFrameFix.scss';\n\nconst DraggableCoreIFrameFix: React.FC<React.ComponentProps<typeof DraggableCore>> = ({\n onStart,\n onStop,\n ...other\n}) => {\n const onStartFn =\n // rule is inconsistent with typescript return type\n // eslint-disable-next-line consistent-return\n (e: DraggableEvent, data: DraggableData): false | void => {\n document.body.classList.add('ocs-draggable-core-iframe-fix');\n if (onStart) {\n return onStart(e, data);\n }\n };\n\n const onStopFn =\n // rule is inconsistent with typescript return type\n // eslint-disable-next-line consistent-return\n (e: DraggableEvent, data: DraggableData): false | void => {\n document.body.classList.remove('ocs-draggable-core-iframe-fix');\n if (onStop) {\n return onStop(e, data);\n }\n };\n\n return <DraggableCore {...other} onStart={onStartFn} onStop={onStopFn} />;\n};\n\nexport default DraggableCoreIFrameFix;\n","import * as React from 'react';\nimport * as classNames from 'classnames';\nimport { Grid as GridComponent, GridCellProps } from 'react-virtualized';\nimport { Item, GridChildrenProps } from './types';\nimport { CellMeasurementContext } from './utils';\nimport './Grid.scss';\n\ntype GridProps = {\n height: number;\n width: number;\n scrollTop: number;\n items: Item[];\n children: (props: GridChildrenProps) => React.ReactNode;\n};\n\nconst Grid: React.FC<GridProps> = ({ height, width, scrollTop, items, children }) => {\n const {\n cache,\n cellWidth,\n cellMargin,\n className,\n overscanRowCount,\n estimatedCellHeight,\n } = React.useContext(CellMeasurementContext);\n const itemCount = items.length;\n const idealItemWidth = cellWidth + cellMargin;\n const columnCount = Math.max(1, Math.floor(width / idealItemWidth));\n const rowCount = Math.ceil(itemCount / columnCount);\n const cellRenderer = (data: GridCellProps) => children({ data, columnCount, items, rowCount });\n return (\n <GridComponent\n containerRole=\"row\"\n autoHeight\n className={classNames('ocs-grid', className)}\n tabIndex={null}\n height={height ?? 0}\n width={width}\n scrollTop={scrollTop}\n rowHeight={cache.rowHeight}\n deferredMeasurementCache={cache}\n columnWidth={idealItemWidth}\n rowCount={rowCount}\n columnCount={columnCount}\n cellRenderer={cellRenderer}\n overscanRowCount={overscanRowCount}\n estimatedRowSize={estimatedCellHeight}\n />\n );\n};\n\nexport default Grid;\n","import * as React from 'react';\nimport * as classNames from 'classnames';\nimport { Grid as GridComponent, GridCellProps } from 'react-virtualized';\nimport { Params, GroupedItems, GridChildrenProps } from './types';\nimport { getItemsAndRowCount, CellMeasurementContext } from './utils';\nimport './Grid.scss';\n\ntype GroupByFilterGridProps = {\n height: number;\n width: number;\n scrollTop: number;\n items: GroupedItems;\n children: (props: GridChildrenProps) => React.ReactNode;\n};\n\nconst GroupByFilterGrid: React.FC<GroupByFilterGridProps> = ({\n height,\n width,\n scrollTop,\n items: groupedItems,\n children,\n}) => {\n const {\n cache,\n cellWidth,\n cellMargin,\n className,\n overscanRowCount,\n headerHeight,\n estimatedCellHeight,\n } = React.useContext(CellMeasurementContext);\n const idealItemWidth = cellWidth + cellMargin;\n const columnCountEstimate = Math.max(1, Math.floor(width / idealItemWidth));\n const { items, rowCount, columnCount, headerRows } = getItemsAndRowCount(\n groupedItems,\n columnCountEstimate,\n );\n const cellRenderer = (data: GridCellProps) => children({ data, columnCount, items, rowCount });\n const getRowHeight = React.useCallback(\n ({ index }: Params): number => {\n if (headerRows.includes(index)) {\n return headerHeight;\n }\n return cache.rowHeight({ index });\n },\n [cache, headerHeight, headerRows],\n );\n return (\n <GridComponent\n autoHeight\n className={classNames('ocs-grid', className)}\n tabIndex={null}\n height={height ?? 0}\n width={width}\n scrollTop={scrollTop}\n rowHeight={getRowHeight}\n deferredMeasurementCache={cache}\n columnWidth={idealItemWidth}\n rowCount={rowCount}\n columnCount={columnCount}\n cellRenderer={cellRenderer}\n overscanRowCount={overscanRowCount}\n estimatedRowSize={estimatedCellHeight}\n />\n );\n};\n\nexport default GroupByFilterGrid;\n","import * as React from 'react';\nimport { PopperOptions } from 'popper.js';\nimport { Popper } from '../popper';\nimport './spotlight.scss';\n\ntype InteractiveSpotlightProps = {\n element: Element;\n};\n\nconst isInViewport = (elementToCheck: Element) => {\n const rect = elementToCheck.getBoundingClientRect();\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n );\n};\n\nconst popperOptions: PopperOptions = {\n modifiers: {\n preventOverflow: {\n enabled: false,\n },\n flip: {\n enabled: false,\n },\n },\n};\n\nconst InteractiveSpotlight: React.FC<InteractiveSpotlightProps> = ({ element }) => {\n const { height, width } = element.getBoundingClientRect();\n const style: React.CSSProperties = {\n height,\n width,\n };\n\n const [clicked, setClicked] = React.useState(false);\n\n React.useEffect(() => {\n if (!clicked) {\n if (!isInViewport(element)) {\n element.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });\n }\n const handleClick = () => setClicked(true);\n document.addEventListener('click', handleClick);\n return () => {\n document.removeEventListener('click', handleClick);\n };\n }\n return () => {};\n }, [element, clicked]);\n\n if (clicked) return null;\n\n return (\n <Popper reference={element} placement=\"top-start\" popperOptions={popperOptions}>\n <div className=\"ocs-spotlight ocs-spotlight__element-highlight-animate\" style={style} />\n </Popper>\n );\n};\n\nexport default InteractiveSpotlight;\n","import * as React from 'react';\nimport { useBoundingClientRect } from '../../hooks';\nimport Portal from '../popper/Portal';\nimport './spotlight.scss';\n\ntype StaticSpotlightProps = {\n element: Element | HTMLElement;\n};\n\nconst StaticSpotlight: React.FC<StaticSpotlightProps> = ({ element }) => {\n const clientRect = useBoundingClientRect(element as HTMLElement);\n const style: React.CSSProperties = clientRect\n ? {\n top: clientRect.top,\n left: clientRect.left,\n height: clientRect.height,\n width: clientRect.width,\n }\n : {};\n return clientRect ? (\n <Portal>\n <div className=\"pf-v5-c-backdrop ocs-spotlight__with-backdrop\">\n <div className=\"ocs-spotlight ocs-spotlight__element-highlight-noanimate\" style={style} />\n </div>\n </Portal>\n ) : null;\n};\n\nexport default StaticSpotlight;\n","import * as React from 'react';\nimport PopperJS, { PopperOptions } from 'popper.js';\nimport { useEventListener } from '../../hooks';\nimport Portal from './Portal';\n\ntype TippyProps = {\n placement?:\n | 'bottom-end'\n | 'bottom-start'\n | 'bottom'\n | 'left-end'\n | 'left-start'\n | 'left'\n | 'right-end'\n | 'right-start'\n | 'right'\n | 'top-end'\n | 'top-start'\n | 'top';\n reference: Element | (() => Element);\n className?: string;\n zIndex?: number;\n tippyOptions?: PopperOptions;\n onShow?: (event: Event) => void;\n onHide?: (event: Event) => void;\n};\n\nexport const Tippy: React.FC<TippyProps> = ({\n placement = 'top',\n reference,\n children,\n className,\n zIndex = 9999,\n tippyOptions,\n onShow,\n onHide,\n}) => {\n const popperInstance = React.useRef<PopperJS>(null);\n const nodeRef = React.useRef<HTMLDivElement>(null);\n const targetElement = typeof reference === 'function' ? reference() : reference;\n const [isOpen, setOpen] = React.useState(false);\n\n const popperRef = React.useCallback((instance: PopperJS) => {\n popperInstance.current = instance;\n }, []);\n\n const initialize = React.useCallback(() => {\n nodeRef.current &&\n popperRef(new PopperJS(targetElement, nodeRef.current, { placement, ...tippyOptions }));\n }, [placement, popperRef, targetElement, tippyOptions]);\n\n const destroy = React.useCallback(() => {\n popperInstance.current?.destroy();\n popperRef(null);\n }, [popperRef]);\n\n const nodeRefCallback = React.useCallback(\n (node) => {\n nodeRef.current = node;\n initialize();\n },\n [initialize],\n );\n\n const show = React.useCallback(\n (e) => {\n if (!isOpen) {\n setOpen(true);\n onShow?.(e);\n }\n },\n [setOpen, onShow, isOpen],\n );\n const hide = React.useCallback(\n (e) => {\n if (isOpen) {\n setOpen(false);\n destroy();\n onHide?.(e);\n }\n },\n [setOpen, onHide, isOpen, destroy],\n );\n\n useEventListener(targetElement, 'mouseenter', show);\n useEventListener(targetElement, 'mouseleave', hide);\n useEventListener(targetElement, 'focus', show);\n useEventListener(targetElement, 'blur', hide);\n\n React.useEffect(() => {\n return () => {\n destroy();\n };\n }, [destroy]);\n\n return isOpen ? (\n <Portal>\n <div\n ref={nodeRefCallback}\n className={className}\n style={{ zIndex, position: 'absolute', top: 0, left: 0 }}\n >\n {children}\n </div>\n </Portal>\n ) : null;\n};\n","import * as React from 'react';\nimport { Modal, ModalVariant } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { useBoundingClientRect } from '../../hooks';\nimport { DetailsRendererFunction } from './QuickSearchDetails';\nimport QuickSearchModalBody from './QuickSearchModalBody';\nimport { QuickSearchData } from './utils/quick-search-types';\nimport './QuickSearchModal.scss';\n\ninterface QuickSearchModalProps {\n isOpen: boolean;\n namespace: string;\n closeModal: () => void;\n allCatalogItemsLoaded: boolean;\n searchCatalog: (searchTerm: string) => QuickSearchData;\n searchPlaceholder: string;\n viewContainer?: HTMLElement;\n limitItemCount?: number;\n icon?: React.ReactNode;\n detailsRenderer?: DetailsRendererFunction;\n}\n\nconst QuickSearchModal: React.FC<QuickSearchModalProps> = ({\n isOpen,\n namespace,\n closeModal,\n searchCatalog,\n searchPlaceholder,\n allCatalogItemsLoaded,\n viewContainer,\n icon,\n limitItemCount,\n detailsRenderer,\n}) => {\n const { t } = useTranslation();\n const clientRect = useBoundingClientRect(viewContainer);\n const maxHeight = clientRect?.height;\n const maxWidth = clientRect?.width;\n\n return viewContainer ? (\n <Modal\n className=\"ocs-quick-search-modal\"\n variant={ModalVariant.medium}\n aria-label={t('console-shared~Quick search')}\n isOpen={isOpen}\n showClose={false}\n position=\"top\"\n positionOffset=\"15%\"\n hasNoBodyWrapper\n appendTo={viewContainer}\n >\n <QuickSearchModalBody\n allCatalogItemsLoaded={allCatalogItemsLoaded}\n searchCatalog={searchCatalog}\n searchPlaceholder={searchPlaceholder}\n namespace={namespace}\n closeModal={closeModal}\n limitItemCount={limitItemCount}\n icon={icon}\n detailsRenderer={detailsRenderer}\n maxDimension={{ maxHeight, maxWidth }}\n viewContainer={viewContainer}\n />\n </Modal>\n ) : null;\n};\n\nexport default QuickSearchModal;\n","import * as React from 'react';\nimport { ResizeDirection } from 're-resizable';\nimport { Rnd } from 'react-rnd';\nimport { CatalogItem } from '@console/dynamic-plugin-sdk';\nimport {\n getQueryArgument,\n removeQueryArgument,\n setQueryArgument,\n history,\n} from '@console/internal/components/utils';\nimport { useTelemetry } from '../../hooks/useTelemetry';\nimport { CatalogType } from '../catalog';\nimport QuickSearchBar from './QuickSearchBar';\nimport QuickSearchContent from './QuickSearchContent';\nimport { DetailsRendererFunction } from './QuickSearchDetails';\nimport { CatalogLinkData, QuickSearchData } from './utils/quick-search-types';\nimport { handleCta } from './utils/quick-search-utils';\n\nimport './QuickSearchModalBody.scss';\n\ninterface QuickSearchModalBodyProps {\n allCatalogItemsLoaded: boolean;\n searchCatalog: (searchTerm: string) => QuickSearchData;\n searchPlaceholder: string;\n namespace: string;\n closeModal: () => void;\n limitItemCount?: number;\n icon?: React.ReactNode;\n detailsRenderer?: DetailsRendererFunction;\n maxDimension?: { maxHeight: number; maxWidth: number };\n viewContainer?: HTMLElement; // pass the html container element to specify the movement boundary\n}\n\nconst QuickSearchModalBody: React.FC<QuickSearchModalBodyProps> = ({\n searchCatalog,\n namespace,\n closeModal,\n limitItemCount,\n searchPlaceholder,\n allCatalogItemsLoaded,\n icon,\n detailsRenderer,\n maxDimension,\n viewContainer,\n}) => {\n const DEFAULT_HEIGHT_WITH_NO_ITEMS = 60;\n const DEFAULT_HEIGHT_WITH_ITEMS = 483;\n const MIN_HEIGHT = 240;\n const MIN_WIDTH = 225;\n const [catalogItems, setCatalogItems] = React.useState<CatalogItem[]>(null);\n const [catalogTypes, setCatalogTypes] = React.useState<CatalogType[]>([]);\n const [isRndActive, setIsRndActive] = React.useState(false);\n const [maxHeight, setMaxHeight] = React.useState(DEFAULT_HEIGHT_WITH_NO_ITEMS);\n const [minHeight, setMinHeight] = React.useState(DEFAULT_HEIGHT_WITH_NO_ITEMS);\n const [minWidth, setMinWidth] = React.useState(MIN_WIDTH);\n const [searchTerm, setSearchTerm] = React.useState<string>(\n getQueryArgument('catalogSearch') || '',\n );\n const [selectedItemId, setSelectedItemId] = React.useState<string>('');\n const [selectedItem, setSelectedItem] = React.useState<CatalogItem>(null);\n const [viewAll, setViewAll] = React.useState<CatalogLinkData[]>(null);\n const [items, setItems] = React.useState<number>(limitItemCount);\n const [modalSize, setModalSize] = React.useState<{ height: number; width: number }>();\n const [draggableBoundary, setDraggableBoundary] = React.useState<string>(null);\n const ref = React.useRef<HTMLDivElement>();\n const fireTelemetryEvent = useTelemetry();\n const listCatalogItems = limitItemCount > 0 ? catalogItems?.slice(0, items) : catalogItems;\n\n const getModalHeight = () => {\n let height: number = DEFAULT_HEIGHT_WITH_NO_ITEMS;\n if (catalogItems?.length > 0) {\n if (modalSize?.height >= minHeight) {\n return modalSize?.height;\n }\n setModalSize({ ...modalSize, height: DEFAULT_HEIGHT_WITH_ITEMS });\n height = DEFAULT_HEIGHT_WITH_ITEMS;\n }\n return height;\n };\n\n React.useEffect(() => {\n if (viewContainer) {\n const className = viewContainer.classList;\n setDraggableBoundary(`.${className[0]}`);\n }\n }, [viewContainer]);\n\n React.useEffect(() => {\n if (catalogItems === null || catalogItems?.length === 0) {\n setMaxHeight(DEFAULT_HEIGHT_WITH_NO_ITEMS);\n setMinHeight(DEFAULT_HEIGHT_WITH_NO_ITEMS);\n setMinWidth(MIN_WIDTH);\n } else if (catalogItems?.length > 0) {\n setMaxHeight(maxDimension?.maxHeight || undefined);\n setMinHeight(MIN_HEIGHT);\n setMinWidth(MIN_WIDTH);\n }\n }, [catalogItems, maxDimension]);\n\n React.useEffect(() => {\n if (ref.current) {\n const { width, height } = ref.current.getBoundingClientRect();\n setModalSize({ width, height });\n }\n }, []);\n\n React.useEffect(() => {\n if (searchTerm) {\n const { filteredItems, viewAllLinks, catalogItemTypes } = searchCatalog(searchTerm);\n setCatalogItems(filteredItems);\n setCatalogTypes(catalogItemTypes);\n setViewAll(viewAllLinks);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchCatalog]);\n\n React.useEffect(() => {\n if (catalogItems && !selectedItemId) {\n setSelectedItemId(catalogItems[0]?.uid);\n setSelectedItem(catalogItems[0]);\n }\n }, [catalogItems, selectedItemId]);\n\n const handleDrag = () => {\n setIsRndActive(true);\n };\n\n const handleResize = (e: MouseEvent, direction: ResizeDirection, elementRef: HTMLElement) => {\n setIsRndActive(true);\n setModalSize({\n height: elementRef.offsetHeight,\n width: elementRef.offsetWidth,\n });\n };\n\n const handleResizeStop = () => {\n setTimeout(() => setIsRndActive(false), 0);\n };\n\n const onSearch = React.useCallback(\n (_event: React.FormEvent<HTMLInputElement>, value: string) => {\n setSearchTerm(value);\n if (value) {\n const { filteredItems, viewAllLinks, catalogItemTypes } = searchCatalog(value);\n setCatalogItems(filteredItems);\n setCatalogTypes(catalogItemTypes);\n setViewAll(viewAllLinks);\n setQueryArgument('catalogSearch', value);\n } else {\n setCatalogItems(null);\n removeQueryArgument('catalogSearch');\n }\n setSelectedItemId('');\n setSelectedItem(null);\n },\n [searchCatalog],\n );\n\n const onCancel = React.useCallback(() => {\n const searchInput = ref.current?.firstElementChild?.children?.[1] as HTMLInputElement;\n if (searchInput?.value) {\n document.activeElement !== searchInput && searchInput.focus();\n onSearch(null, '');\n } else {\n closeModal();\n }\n }, [closeModal, onSearch]);\n\n const getIndexOfSelectedItem = React.useCallback(\n () => listCatalogItems?.findIndex((item) => item.uid === selectedItemId),\n [listCatalogItems, selectedItemId],\n );\n\n const onEnter = React.useCallback(\n (e) => {\n const { id } = document.activeElement;\n const activeViewAllLink = viewAll?.find((link) => link.catalogType === id);\n if (activeViewAllLink) {\n history.push(activeViewAllLink.to);\n } else if (selectedItem) {\n handleCta(e, selectedItem, closeModal, fireTelemetryEvent);\n }\n },\n [closeModal, fireTelemetryEvent, selectedItem, viewAll],\n );\n\n const selectPrevious = React.useCallback(() => {\n let index = getIndexOfSelectedItem();\n if (index === 0) index = listCatalogItems?.length;\n setSelectedItemId(listCatalogItems?.[index - 1]?.uid);\n setSelectedItem(listCatalogItems?.[index - 1]);\n }, [listCatalogItems, getIndexOfSelectedItem]);\n\n const selectNext = React.useCallback(() => {\n const index = getIndexOfSelectedItem();\n setSelectedItemId(listCatalogItems?.[index + 1]?.uid);\n setSelectedItem(listCatalogItems?.[index + 1]);\n }, [listCatalogItems, getIndexOfSelectedItem]);\n\n const handleListChange = (i: number) => {\n setItems(i);\n };\n\n React.useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n switch (e.code) {\n case 'Escape': {\n e.preventDefault();\n onCancel();\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n selectPrevious();\n break;\n }\n case 'ArrowDown': {\n e.preventDefault();\n selectNext();\n break;\n }\n case 'Enter': {\n e.preventDefault();\n onEnter(e);\n break;\n }\n case 'Space': {\n if (e.ctrlKey) {\n e.preventDefault();\n closeModal();\n }\n break;\n }\n default:\n }\n };\n\n const onOutsideClick = (e: MouseEvent) => {\n const modalBody = ref.current.parentElement;\n if (!modalBody?.contains(e.target as Node) && !isRndActive) {\n closeModal();\n }\n };\n\n document.addEventListener('click', onOutsideClick);\n document.addEventListener('keydown', onKeyDown);\n\n return () => {\n document.removeEventListener('click', onOutsideClick);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [closeModal, onCancel, onEnter, selectNext, selectPrevious, isRndActive]);\n\n return (\n <Rnd\n style={{ position: 'relative' }}\n size={{ height: modalSize?.height, width: modalSize?.width }}\n onDrag={handleDrag}\n onDragStop={handleResizeStop}\n onResize={handleResize}\n maxHeight={maxHeight}\n maxWidth={maxDimension?.maxWidth || undefined}\n minHeight={minHeight}\n minWidth={minWidth}\n bounds={draggableBoundary}\n onResizeStop={handleResizeStop}\n dragHandleClassName=\"ocs-quick-search-bar\"\n cancel=\".ocs-quick-search-bar__input\"\n enableResizing={\n catalogItems === null || catalogItems?.length === 0\n ? {\n bottom: false,\n bottomLeft: false,\n bottomRight: false,\n left: true,\n right: true,\n top: false,\n topLeft: false,\n topRight: false,\n }\n : true\n }\n >\n <div\n ref={ref}\n className=\"ocs-quick-search-modal-body\"\n style={{\n height: getModalHeight(),\n }}\n >\n <QuickSearchBar\n searchTerm={searchTerm}\n searchPlaceholder={searchPlaceholder}\n onSearch={onSearch}\n showNoResults={catalogItems?.length === 0}\n itemsLoaded={allCatalogItemsLoaded}\n icon={icon}\n autoFocus\n />\n {catalogItems && selectedItem && (\n <QuickSearchContent\n catalogItems={catalogItems}\n catalogItemTypes={catalogTypes}\n viewAll={viewAll}\n searchTerm={searchTerm}\n selectedItemId={selectedItemId}\n closeModal={closeModal}\n selectedItem={selectedItem}\n namespace={namespace}\n limitItemCount={limitItemCount}\n detailsRenderer={detailsRenderer}\n onListChange={handleListChange}\n onSelect={(itemId) => {\n setSelectedItemId(itemId);\n setSelectedItem(catalogItems?.find((item) => item.uid === itemId));\n }}\n />\n )}\n </div>\n </Rnd>\n );\n};\n\nexport default QuickSearchModalBody;\n","import * as React from 'react';\nimport { InputGroup, InputGroupText, Spinner, TextInput } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport QuickSearchIcon from './QuickSearchIcon';\nimport './QuickSearchBar.scss';\n\ninterface QuickSearchBarProps {\n showNoResults: boolean;\n itemsLoaded: boolean;\n autoFocus: boolean;\n searchTerm: string;\n onSearch: (event: React.FormEvent<HTMLInputElement>, searchTerm: string) => void;\n searchPlaceholder: string;\n icon?: React.ReactNode;\n}\n\nconst QuickSearchBar: React.FC<QuickSearchBarProps> = ({\n showNoResults,\n itemsLoaded,\n autoFocus = false,\n searchTerm,\n searchPlaceholder,\n onSearch,\n icon,\n}) => {\n const { t } = useTranslation();\n const inputRef = React.useRef<HTMLInputElement>(null);\n const spanRef = React.useRef<HTMLSpanElement>(null);\n return (\n <InputGroup\n onClick={() => inputRef.current?.focus()}\n className=\"ocs-quick-search-bar\"\n data-test=\"quick-search-bar\"\n >\n <InputGroupText className=\"ocs-quick-search-bar__icon ocs-quick-search-bar__border-none\">\n {icon || <QuickSearchIcon />}\n </InputGroupText>\n <div className=\"ocs-quick-search-bar__input-wrapper\">\n {/* <span> is only used to calculate the width of input based on the text in search */}\n <span className=\"ocs-quick-search-bar__input-dummy\" ref={spanRef}>\n {searchTerm?.length >= searchPlaceholder.length\n ? searchTerm.replace(/ /g, '\\u00a0')\n : searchPlaceholder}\n </span>\n <TextInput\n type=\"text\"\n ref={inputRef}\n aria-label={t('console-shared~Quick search bar')}\n className=\"ocs-quick-search-bar__input\"\n placeholder={searchPlaceholder}\n onChange={onSearch}\n autoFocus={autoFocus}\n value={searchTerm}\n data-test=\"input\"\n style={{\n width: spanRef.current?.offsetWidth ? spanRef.current?.offsetWidth + 2 : '0px',\n }}\n />\n {itemsLoaded && showNoResults && (\n <InputGroupText\n className=\"ocs-quick-search-bar__no-results ocs-quick-search-bar__border-none\"\n data-test=\"quick-search-no-results\"\n >\n — {t('console-shared~No results')}\n </InputGroupText>\n )}\n </div>\n {!itemsLoaded && (\n <InputGroupText className=\"ocs-quick-search-bar__border-none ocs-quick-search-bar__spinner\">\n <Spinner size=\"lg\" />\n </InputGroupText>\n )}\n </InputGroup>\n );\n};\n\nexport default QuickSearchBar;\n","import * as React from 'react';\nimport { Split, SplitItem, Divider } from '@patternfly/react-core';\nimport cx from 'classnames';\nimport { CatalogItem } from '@console/dynamic-plugin-sdk';\nimport { CatalogType } from '../catalog';\nimport QuickSearchDetails, { DetailsRendererFunction } from './QuickSearchDetails';\nimport QuickSearchList from './QuickSearchList';\nimport { CatalogLinkData } from './utils/quick-search-types';\nimport './QuickSearchContent.scss';\n\ninterface QuickSearchContentProps {\n catalogItems: CatalogItem[];\n catalogItemTypes: CatalogType[];\n searchTerm: string;\n namespace: string;\n selectedItemId: string;\n selectedItem: CatalogItem;\n limitItemCount?: number;\n onSelect: (itemId: string) => void;\n viewAll?: CatalogLinkData[];\n closeModal: () => void;\n detailsRenderer?: DetailsRendererFunction;\n onListChange?: (items: number) => void;\n}\n\nconst QuickSearchContent: React.FC<QuickSearchContentProps> = ({\n catalogItems,\n catalogItemTypes,\n viewAll,\n searchTerm,\n namespace,\n selectedItem,\n selectedItemId,\n onSelect,\n closeModal,\n limitItemCount,\n detailsRenderer,\n onListChange,\n}) => {\n return (\n <Split className=\"ocs-quick-search-content\">\n <SplitItem\n className={cx('ocs-quick-search-content__list', {\n 'ocs-quick-search-content__list--overflow': catalogItems.length >= limitItemCount,\n })}\n >\n <QuickSearchList\n listItems={catalogItems}\n limitItemCount={limitItemCount}\n catalogItemTypes={catalogItemTypes}\n viewAll={viewAll}\n selectedItemId={selectedItemId}\n searchTerm={searchTerm}\n namespace={namespace}\n onSelectListItem={(_event, itemId) => onSelect(itemId)}\n closeModal={closeModal}\n onListChange={onListChange}\n />\n </SplitItem>\n <Divider component=\"div\" orientation={{ default: 'vertical' }} />\n <SplitItem className=\"ocs-quick-search-content__details\">\n <QuickSearchDetails\n detailsRenderer={detailsRenderer}\n selectedItem={selectedItem}\n closeModal={closeModal}\n />\n </SplitItem>\n </Split>\n );\n};\n\nexport default QuickSearchContent;\n","import * as React from 'react';\nimport { Button, ButtonVariant, TextContent, Title } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { CatalogItem } from '@console/dynamic-plugin-sdk/src/extensions/catalog';\nimport { useTelemetry } from '../../hooks/useTelemetry';\nimport CatalogBadges from '../catalog/CatalogBadges';\nimport { handleCta } from './utils/quick-search-utils';\n\nimport './QuickSearchDetails.scss';\n\nexport type QuickSearchDetailsRendererProps = {\n selectedItem: CatalogItem;\n closeModal: () => void;\n};\nexport type DetailsRendererFunction = (props: QuickSearchDetailsRendererProps) => React.ReactNode;\nexport interface QuickSearchDetailsProps extends QuickSearchDetailsRendererProps {\n detailsRenderer: DetailsRendererFunction;\n}\n\nconst QuickSearchDetails: React.FC<QuickSearchDetailsProps> = ({\n selectedItem,\n closeModal,\n detailsRenderer,\n}) => {\n const { t } = useTranslation();\n const fireTelemetryEvent = useTelemetry();\n\n const defaultContentRenderer: DetailsRendererFunction = (\n props: QuickSearchDetailsProps,\n ): React.ReactNode => {\n return (\n <>\n <Title headingLevel=\"h4\">{props.selectedItem.name}</Title>\n {props.selectedItem.provider && (\n <span className=\"ocs-quick-search-details__provider\">\n {t('console-shared~Provided by {{provider}}', {\n provider: props.selectedItem.provider,\n })}\n </span>\n )}\n {selectedItem.badges?.length > 0 ? (\n <CatalogBadges badges={selectedItem.badges} />\n ) : undefined}\n <Button\n variant={ButtonVariant.primary}\n className=\"ocs-quick-search-details__form-button\"\n data-test=\"create-quick-search\"\n onClick={(e) => {\n handleCta(e, props.selectedItem, props.closeModal, fireTelemetryEvent);\n }}\n >\n {props.selectedItem.cta.label}\n </Button>\n <TextContent className=\"ocs-quick-search-details__description\">\n {props.selectedItem.description}\n </TextContent>\n </>\n );\n };\n const detailsContentRenderer: DetailsRendererFunction = detailsRenderer ?? defaultContentRenderer;\n\n return (\n <div className=\"ocs-quick-search-details\">\n {detailsContentRenderer({ selectedItem, closeModal })}\n </div>\n );\n};\n\nexport default QuickSearchDetails;\n","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/3scale.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/aerogear.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/amq.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/angularjs.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/ansible.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/beaker.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/build-icon.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/camel.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/capedwarf.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/cassandra.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/clojure.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/codeigniter.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/cordova.png\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/datagrid.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/datavirt.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/debian.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/decisionserver.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/django.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/dotnet.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/drupal.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/eap.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/elastic.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/erlang.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/fedora.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/freebsd.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/git.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/github.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/gitlab.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/gitea.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/glassfish.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/grails.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/hadoop.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/haproxy.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/infinispan.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/jboss.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/jenkins.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/jetty.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/joomla.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/jruby.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/js.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/knative.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/kubevirt.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/laravel.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/load-balancer.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/mariadb.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/mediawiki.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/memcached.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/mongodb.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/mssql.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/mysql-database.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/nginx.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/nodejs.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/openliberty.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/openstack.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/other-linux.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/other-unknown.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/perl.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/phalcon.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/php.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/play.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/postgresql.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/processserver.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/python.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/quarkus.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/rabbitmq.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/rails.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/react.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/redis.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/rh-integration.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/rh-spring-boot.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/rh-tomcat.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/ruby.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/rust.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/scala.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/shadowman.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/spring.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/spring-boot.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/sso.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/stackoverflow.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/suse.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/symfony.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/tomcat.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/ubuntu.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/vertx.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/wildfly.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/windows.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/wordpress.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/xamarin.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/zend.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/logos/operator.svg\";","import * as React from 'react';\nimport {\n FilterSidePanel,\n FilterSidePanelCategory,\n FilterSidePanelCategoryItem,\n} from '@patternfly/react-catalog-view-extension';\nimport * as _ from 'lodash';\nimport { CatalogItemAttribute } from '@console/dynamic-plugin-sdk';\nimport { FieldLevelHelp } from '@console/internal/components/utils';\nimport {\n CatalogFilter,\n CatalogFilterCounts,\n CatalogFilterItem,\n CatalogFilters,\n} from '../utils/types';\n\ntype CatalogFiltersProps = {\n activeFilters: CatalogFilters;\n filterGroupCounts: CatalogFilterCounts;\n filterGroupMap: { [key: string]: CatalogItemAttribute };\n filterGroupsShowAll: { [key: string]: boolean };\n onFilterChange: (filterType: string, id: string, value: boolean) => void;\n onShowAllToggle: (groupName: string) => void;\n};\n\nconst CatalogFilters: React.FC<CatalogFiltersProps> = ({\n activeFilters,\n filterGroupCounts,\n filterGroupMap,\n filterGroupsShowAll,\n onFilterChange,\n onShowAllToggle,\n}) => {\n const sortedActiveFilters = Object.keys(activeFilters)\n .sort()\n .reduce<CatalogFilters>((acc, groupName) => {\n acc[groupName] = activeFilters[groupName];\n return acc;\n }, {});\n\n const renderFilterItem = (filter: CatalogFilterItem, filterName: string, groupName: string) => {\n const { label, active } = filter;\n const count = filterGroupCounts[groupName]?.[filterName] ?? 0;\n // TODO remove when adopting https://github.com/patternfly/patternfly-react/issues/5139\n const dummyProps = {} as any;\n return (\n <FilterSidePanelCategoryItem\n key={filterName}\n count={count}\n checked={active}\n onClick={(e: React.ChangeEvent<HTMLInputElement>) =>\n onFilterChange(groupName, filterName, e.target.checked)\n }\n data-test={`${groupName}-${_.kebabCase(filterName)}`}\n {...dummyProps}\n >\n {label}\n </FilterSidePanelCategoryItem>\n );\n };\n\n const renderFilterGroup = (filterGroup: CatalogFilter, groupName: string) => {\n const filterGroupKeys = Object.keys(filterGroup);\n if (filterGroupKeys.length > 0) {\n const sortedFilterGroup = filterGroupKeys.sort().reduce<CatalogFilter>((acc, filterName) => {\n acc[filterName] = filterGroup[filterName];\n return acc;\n }, {});\n return (\n <FilterSidePanelCategory\n key={groupName}\n title={\n <>\n {filterGroupMap[groupName].label || groupName}\n {filterGroupMap[groupName].description && (\n <FieldLevelHelp>\n <p style={{ whiteSpace: 'pre-line' }}>{filterGroupMap[groupName].description}</p>\n </FieldLevelHelp>\n )}\n </>\n }\n onShowAllToggle={() => onShowAllToggle(groupName)}\n showAll={filterGroupsShowAll[groupName] ?? false}\n data-test-group-name={groupName}\n >\n {_.map(sortedFilterGroup, (filter, filterName) =>\n renderFilterItem(filter, filterName, groupName),\n )}\n </FilterSidePanelCategory>\n );\n }\n return null;\n };\n\n return (\n <FilterSidePanel>\n {_.map(sortedActiveFilters, (filterGroup, groupName) =>\n renderFilterGroup(filterGroup, groupName),\n )}\n </FilterSidePanel>\n );\n};\n\nexport default CatalogFilters;\n","import * as React from 'react';\nimport {\n DataList,\n DataListItem,\n DataListItemRow,\n DataListItemCells,\n DataListCell,\n Split,\n SplitItem,\n Label,\n TextContent,\n Text,\n TextVariants,\n} from '@patternfly/react-core';\nimport cx from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { CatalogItem } from '@console/dynamic-plugin-sdk';\nimport { getImageForIconClass } from '@console/internal/components/catalog/catalog-item-icon';\nimport { useTelemetry } from '../../hooks';\nimport { CatalogType, getIconProps } from '../catalog';\nimport { CatalogLinkData } from './utils/quick-search-types';\nimport { handleCta } from './utils/quick-search-utils';\n\nimport './QuickSearchList.scss';\n\ninterface QuickSearchListProps {\n listItems: CatalogItem[];\n catalogItemTypes: CatalogType[];\n viewAll?: CatalogLinkData[];\n selectedItemId: string;\n searchTerm: string;\n namespace: string;\n limitItemCount?: number;\n onSelectListItem: (\n event: React.MouseEvent<Element, MouseEvent> | React.KeyboardEvent<Element>,\n itemId: string,\n ) => void;\n onListChange?: (items: number) => void;\n closeModal: () => void;\n}\n\nconst QuickSearchList: React.FC<QuickSearchListProps> = ({\n listItems,\n catalogItemTypes,\n viewAll,\n selectedItemId,\n onSelectListItem,\n closeModal,\n limitItemCount,\n onListChange,\n}) => {\n const { t } = useTranslation();\n const fireTelemetryEvent = useTelemetry();\n const [itemsCount, setItemsCount] = React.useState<number>(limitItemCount || listItems.length);\n const listHeight = document.querySelector('.ocs-quick-search-list__list')?.clientHeight || 0;\n\n const getIcon = (item: CatalogItem) => {\n const { iconImg, iconClass } = getIconProps(item);\n return (\n <img\n className=\"ocs-quick-search-list__item-icon-img\"\n src={iconClass ? getImageForIconClass(iconClass) : iconImg}\n alt={`${item.name} icon`}\n />\n );\n };\n React.useLayoutEffect(() => {\n if (selectedItemId) {\n const element = document.getElementById(selectedItemId);\n if (element) {\n element.scrollIntoView({ block: 'nearest' });\n }\n }\n }, [selectedItemId]);\n\n React.useEffect(() => {\n if (listHeight > 0 && limitItemCount > 0) {\n const rowHeight = document.querySelector('.ocs-quick-search-list__item')?.clientHeight || 0;\n const count =\n Math.floor(listHeight / rowHeight) < limitItemCount\n ? limitItemCount\n : Math.floor(listHeight / rowHeight);\n setItemsCount(count);\n onListChange?.(count);\n }\n }, [limitItemCount, listHeight, onListChange]);\n\n return (\n <div className=\"ocs-quick-search-list\">\n <DataList\n className=\"ocs-quick-search-list__list\"\n aria-label={t('console-shared~Quick search list')}\n selectedDataListItemId={selectedItemId}\n onSelectDataListItem={onSelectListItem}\n isCompact\n >\n {listItems.slice(0, itemsCount).map((item) => {\n const itemType =\n catalogItemTypes.find((type) => type.value === item.type)?.label || item.type;\n\n return (\n <DataListItem\n id={item.uid}\n key={item.uid}\n tabIndex={-1}\n className={cx('ocs-quick-search-list__item', {\n 'ocs-quick-search-list__item--highlight': item.uid === selectedItemId,\n })}\n onDoubleClick={(e: React.SyntheticEvent) => {\n handleCta(e, item, closeModal, fireTelemetryEvent);\n }}\n >\n <DataListItemRow className=\"ocs-quick-search-list__item-row\">\n <DataListItemCells\n className=\"ocs-quick-search-list__item-content\"\n dataListCells={[\n <DataListCell isIcon key={`${item.uid}-icon`}>\n <div className=\"ocs-quick-search-list__item-icon\">\n {item.icon?.node ?? getIcon(item)}\n </div>\n </DataListCell>,\n <DataListCell\n style={{ paddingTop: 'var(--pf-v5-global--spacer--sm)' }}\n width={2}\n wrapModifier=\"truncate\"\n key={`${item.uid}-name`}\n >\n <span\n className=\"ocs-quick-search-list__item-name\"\n data-test={`item-name-${item.name}-${itemType}`}\n >\n {item.name}\n </span>\n <Split style={{ alignItems: 'center' }} hasGutter>\n <SplitItem>\n <Split>\n <SplitItem>\n <Label>{itemType}</Label>\n </SplitItem>\n {item?.secondaryLabel && (\n <SplitItem className=\"ocs-quick-search-list__secondary-label\">\n {item.secondaryLabel}\n </SplitItem>\n )}\n </Split>\n </SplitItem>\n <SplitItem>\n <TextContent\n data-test={`item-name-${item.name}-${item.provider}-secondary-label`}\n >\n <Text component={TextVariants.small}>{item.provider}</Text>\n </TextContent>\n </SplitItem>\n </Split>\n </DataListCell>,\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n );\n })}\n </DataList>\n\n {viewAll?.length > 0 && (\n <div className=\"ocs-quick-search-list__all-items-link\">\n {viewAll.map((catalogLink) => (\n <Link\n id={catalogLink.catalogType}\n to={catalogLink.to}\n key={catalogLink.catalogType}\n style={{ fontSize: 'var(--pf-v5-global--FontSize--sm)' }}\n >\n {catalogLink.label}\n </Link>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default QuickSearchList;\n","import { TourDataType } from '@console/app/src/components/tour';\nimport {\n perspectiveSwitcherTourText,\n searchTourText,\n finishTourText,\n devPerspectiveTourText,\n webTerminalGuidedTourText,\n} from './GuidedTourText';\n\nconst getSelector = (id: string): string => `[data-tour-id=\"${id}\"]`;\n\nexport const getGuidedTour = (): TourDataType => ({\n intro: {\n // t('devconsole~Welcome to the Developer Perspective!')\n heading: '%devconsole~Welcome to the Developer Perspective!%',\n content: devPerspectiveTourText,\n },\n steps: [\n {\n placement: 'right',\n // t('devconsole~Perspective Switcher')\n heading: '%devconsole~Perspective Switcher%',\n content: perspectiveSwitcherTourText,\n selector: getSelector('tour-perspective-dropdown'),\n },\n {\n placement: 'right',\n // t('devconsole~Observe')\n heading: '%devconsole~Observe%',\n // t('devconsole~Monitor application metrics, create custom metrics queries and view and silence alerts in your project.')\n content:\n '%devconsole~Monitor application metrics, create custom metrics queries and view and silence alerts in your project.%',\n selector: getSelector('tour-monitoring-nav'),\n },\n {\n placement: 'right',\n // t('devconsole~Search')\n heading: '%devconsole~Search%',\n content: searchTourText,\n selector: getSelector('tour-search-nav'),\n },\n {\n flags: ['DEVWORKSPACE'],\n placement: 'bottom',\n // t('devconsole~Web Terminal')\n heading: '%devconsole~Web Terminal%',\n content: webTerminalGuidedTourText,\n selector: getSelector('tour-cloud-shell-button'),\n },\n {\n placement: 'bottom',\n // t('devconsole~Help')\n heading: '%devconsole~Help%',\n // t('devconsole~Restart this tour or access our new quick starts where you can learn more about creating or deploying an application using OpenShift Developer Console.')\n content:\n '%devconsole~Restart this tour or access our new quick starts where you can learn more about creating or deploying an application using OpenShift Developer Console.%',\n selector: getSelector('tour-help-button'),\n },\n {\n placement: 'bottom',\n // t('devconsole~User Preferences')\n heading: '%devconsole~User Preferences%',\n // t('devconsole~Set your individual console preferences including default views, language, import settings, and more.')\n content:\n '%devconsole~Set your individual console preferences including default views, language, import settings, and more.%',\n selector: getSelector('tour-user-button'),\n },\n ],\n end: {\n // t('devconsole~You’re ready to go!')\n heading: '%devconsole~You’re ready to go!%',\n content: finishTourText,\n },\n});\n","export const FLAG_OPENSHIFT_GITOPS = 'OPENSHIFT_GITOPS';\n","import i18next from 'i18next';\nimport * as _ from 'lodash';\nimport { PrometheusResponse } from '@console/internal/components/graphs';\nimport { PrometheusHealthHandler, SubsystemHealth } from '@console/plugin-sdk';\nimport { HealthState } from '@console/shared/src/components/dashboard/status-card/states';\nimport { mapMetrics, isError, isWaiting, mapConditions, errorUpload } from './mappers';\n\nconst getClusterInsightsComponentStatus = (\n responses: {\n response: PrometheusResponse;\n error: any;\n }[],\n): SubsystemHealth => {\n const [\n { response: metricsResponse, error: metricsError },\n { response: operatorStatusResponse, error: operatorStatusError },\n ] = responses;\n const conditions = mapConditions(operatorStatusResponse);\n const operatorDisabled = !!conditions.Disabled;\n\n // Unexpected error\n if (metricsError || operatorStatusError || errorUpload(conditions)) {\n return {\n state: HealthState.NOT_AVAILABLE,\n message: i18next.t('insights-plugin~Not available'),\n };\n }\n // Insights Operator is disabled\n if (operatorDisabled) {\n return {\n state: HealthState.WARNING,\n message: i18next.t('insights-plugin~Disabled'),\n };\n }\n // Initializing Insights Operator\n if (!metricsResponse || !operatorStatusResponse) {\n return {\n state: HealthState.PROGRESS,\n message: i18next.t('insights-plugin~Issues pending'),\n };\n }\n const values = mapMetrics(metricsResponse);\n // Malformed metrics values\n if (isError(values)) {\n return {\n state: HealthState.NOT_AVAILABLE,\n message: i18next.t('insights-plugin~Not available'),\n };\n }\n // Waiting for the first results\n if (!isError(values) && isWaiting(values)) {\n return {\n state: HealthState.PROGRESS,\n message: i18next.t('insights-plugin~Issues pending'),\n };\n }\n // Insights Operator has sent rules results\n const issuesNumber = Object.values(values).reduce((acc, cur) => acc + cur, 0);\n const issueStr =\n issuesNumber === 1\n ? i18next.t('insights-plugin~{{issuesNumber}} issue found', { issuesNumber })\n : i18next.t('insights-plugin~{{issuesNumber}} issues found', { issuesNumber });\n if (values.critical > 0) {\n return { state: HealthState.ERROR, message: issueStr };\n }\n if (issuesNumber > 0) {\n return { state: HealthState.WARNING, message: issueStr };\n }\n return { state: HealthState.OK, message: issueStr };\n};\n\nexport const getClusterInsightsStatus: PrometheusHealthHandler = (responses, t, cluster) => {\n // Extra state for not yet loaded cluster\n if (!_.get(cluster, 'loaded')) {\n return {\n state: HealthState.LOADING,\n };\n }\n return getClusterInsightsComponentStatus(responses);\n};\n","import { applyCodeRefSymbol } from '@console/dynamic-plugin-sdk/src/coderefs/coderef-resolver';\nimport { Plugin } from '@console/plugin-sdk';\nimport {\n TopologyComponentFactory,\n TopologyDataModelFactory,\n TopologyDisplayFilters,\n TopologyCreateConnector,\n TopologyDecoratorProvider,\n} from '@console/topology/src/extensions';\nimport {\n FLAG_CAMEL_KAMELETS,\n FLAG_KNATIVE_EVENTING,\n FLAG_KNATIVE_EVENTING_ENABLED,\n FLAG_KNATIVE_SERVING,\n FLAG_KNATIVE_SERVING_CONFIGURATION,\n FLAG_KNATIVE_SERVING_REVISION,\n FLAG_KNATIVE_SERVING_ROUTE,\n FLAG_KNATIVE_SERVING_SERVICE,\n} from '../const';\nimport {\n getKnativeEventingKameletsResources,\n getKnativeEventingResources,\n getKnativeServingResources,\n} from '../utils/get-knative-resources';\n\nconst getKnativeServingTopologyDataModel = () =>\n import('./data-transformer' /* webpackChunkName: \"serving-components\" */).then(\n (m) => m.getKnativeServingTopologyDataModel,\n );\n\nconst getKnativeEventingTopologyDataModel = () =>\n import('./data-transformer' /* webpackChunkName: \"eventing-components\" */).then(\n (m) => m.getKnativeEventingTopologyDataModel,\n );\n\nconst getKnativeKameletsTopologyDataModel = () =>\n import('./data-transformer' /* webpackChunkName: \"kamelets-components\" */).then(\n (m) => m.getKnativeKameletsTopologyDataModel,\n );\n\nconst getIsKnativeResource = () =>\n import('./isKnativeResource' /* webpackChunkName: \"knative-components\" */).then(\n (m) => m.isKnativeResource,\n );\n\nexport type TopologyConsumedExtensions =\n | TopologyComponentFactory\n | TopologyDataModelFactory\n | TopologyDisplayFilters\n | TopologyCreateConnector\n | TopologyDecoratorProvider;\n\nexport const topologyPlugin: Plugin<TopologyConsumedExtensions> = [\n {\n type: 'Topology/DataModelFactory',\n properties: {\n id: 'knative-serving-topology-model-factory',\n priority: 100,\n resources: getKnativeServingResources,\n workloadKeys: ['ksservices'],\n getDataModel: applyCodeRefSymbol(getKnativeServingTopologyDataModel),\n isResourceDepicted: applyCodeRefSymbol(getIsKnativeResource),\n },\n flags: {\n required: [\n FLAG_KNATIVE_SERVING_CONFIGURATION,\n FLAG_KNATIVE_SERVING,\n FLAG_KNATIVE_SERVING_REVISION,\n FLAG_KNATIVE_SERVING_ROUTE,\n FLAG_KNATIVE_SERVING_SERVICE,\n ],\n },\n },\n {\n type: 'Topology/DataModelFactory',\n properties: {\n id: 'knative-eventing-topology-model-factory',\n priority: 100,\n resources: getKnativeEventingResources,\n workloadKeys: ['eventingsubscription'],\n getDataModel: applyCodeRefSymbol(getKnativeEventingTopologyDataModel),\n isResourceDepicted: applyCodeRefSymbol(getIsKnativeResource),\n },\n flags: {\n required: [FLAG_KNATIVE_EVENTING, FLAG_KNATIVE_EVENTING_ENABLED],\n },\n },\n {\n type: 'Topology/DataModelFactory',\n properties: {\n id: 'knative-kamelets-topology-model-factory',\n priority: 100,\n resources: getKnativeEventingKameletsResources,\n workloadKeys: ['kameletbindings'],\n getDataModel: applyCodeRefSymbol(getKnativeKameletsTopologyDataModel),\n isResourceDepicted: applyCodeRefSymbol(getIsKnativeResource),\n },\n flags: {\n required: [FLAG_KNATIVE_EVENTING, FLAG_CAMEL_KAMELETS],\n },\n },\n];\n","import * as _ from 'lodash';\nimport { OperatorStatusPriority, GetOperatorsWithStatuses } from '@console/plugin-sdk';\nimport { getOperatorsStatus } from '@console/shared/src/components/dashboard/status-card/state-utils';\nimport {\n HealthState,\n healthStateMapping,\n} from '@console/shared/src/components/dashboard/status-card/states';\nimport { getSubscriptionStatus, getCSVStatus, subscriptionForCSV } from '../../status/csv-status';\nimport {\n ClusterServiceVersionKind,\n SubscriptionKind,\n SubscriptionState,\n ClusterServiceVersionStatus,\n} from '../../types';\n\nconst getOperatorStatus = (\n subscriptionStatus: { status: SubscriptionState; title?: string },\n csvStatus: { status: ClusterServiceVersionStatus; title?: string },\n): OperatorStatusPriority => {\n let operatorHealth: HealthState;\n switch (csvStatus.status) {\n case ClusterServiceVersionStatus.Failed:\n operatorHealth = HealthState.ERROR;\n break;\n case ClusterServiceVersionStatus.Pending:\n operatorHealth = HealthState.PROGRESS;\n break;\n case ClusterServiceVersionStatus.Unknown:\n operatorHealth = HealthState.UNKNOWN;\n break;\n default:\n operatorHealth = HealthState.OK;\n }\n if (\n operatorHealth !== HealthState.ERROR &&\n subscriptionStatus.status === SubscriptionState.SubscriptionStateUpgradePending\n ) {\n return {\n ...healthStateMapping[HealthState.UPDATING],\n title: subscriptionStatus.title,\n };\n }\n if (\n operatorHealth !== HealthState.ERROR &&\n subscriptionStatus.status === SubscriptionState.SubscriptionStateUpgradeAvailable\n ) {\n return {\n ...healthStateMapping[HealthState.UPGRADABLE],\n title: subscriptionStatus.title,\n };\n }\n return {\n ...healthStateMapping[operatorHealth],\n title: csvStatus.title,\n };\n};\n\nconst getCSVPriorityStatus = (\n csv: ClusterServiceVersionKind,\n subscriptions: SubscriptionKind[],\n): OperatorStatusPriority => {\n const subscriptionStatus = getSubscriptionStatus(subscriptionForCSV(subscriptions, csv));\n const csvStatus = getCSVStatus(csv);\n return getOperatorStatus(subscriptionStatus, csvStatus);\n};\n\nexport const getClusterServiceVersionsWithStatuses: GetOperatorsWithStatuses<ClusterServiceVersionKind> = (\n resources,\n) => {\n const grouppedOperators = _.groupBy(\n resources.clusterServiceVersions.data as ClusterServiceVersionKind[],\n (o) => o.metadata.name,\n );\n return _.values(grouppedOperators).map((operators) =>\n getOperatorsStatus<ClusterServiceVersionKind>(operators, (csv) =>\n getCSVPriorityStatus(csv, resources.subscriptions.data as SubscriptionKind[]),\n ),\n );\n};\n","import { TopologyQuadrant } from '@patternfly/react-topology/dist/esm/types';\nimport { applyCodeRefSymbol } from '@console/dynamic-plugin-sdk/src/coderefs/coderef-resolver';\nimport { Plugin } from '@console/plugin-sdk';\nimport { TopologyDecoratorProvider } from '../../../../../extensions';\nimport {\n getAlertsDecorator,\n getBuildDecorator,\n getEditDecorator,\n getUrlDecorator,\n} from './getDefaultDecorators';\n\nexport const defaultDecoratorsPlugin: Plugin<TopologyDecoratorProvider> = [\n {\n type: 'Topology/Decorator',\n properties: {\n id: 'edit-decorator',\n priority: 1000,\n quadrant: TopologyQuadrant.lowerRight,\n decorator: applyCodeRefSymbol(getEditDecorator),\n },\n },\n {\n type: 'Topology/Decorator',\n properties: {\n id: 'url-decorator',\n priority: 1000,\n quadrant: TopologyQuadrant.upperRight,\n decorator: applyCodeRefSymbol(getUrlDecorator),\n },\n },\n {\n type: 'Topology/Decorator',\n properties: {\n id: 'build-decorator',\n priority: 1000,\n quadrant: TopologyQuadrant.lowerLeft,\n decorator: applyCodeRefSymbol(getBuildDecorator),\n },\n },\n {\n type: 'Topology/Decorator',\n properties: {\n id: 'alerts-decorator',\n priority: 1000,\n quadrant: TopologyQuadrant.upperLeft,\n decorator: applyCodeRefSymbol(getAlertsDecorator),\n },\n },\n];\n","import { INCONTEXT_ACTIONS_SERVICE_BINDING } from '@console/dev-console/src/const';\nimport { applyCodeRefSymbol } from '@console/dynamic-plugin-sdk/src/coderefs/coderef-resolver';\nimport { Plugin, PostFormSubmissionAction } from '@console/plugin-sdk';\nimport { ALLOW_SERVICE_BINDING_FLAG } from '@console/service-binding-plugin/src/const';\nimport {\n TopologyComponentFactory,\n TopologyDataModelFactory,\n TopologyDisplayFilters,\n TopologyCreateConnector,\n} from '../extensions/topology';\nimport { doContextualBinding } from '../utils/connector-utils';\nimport { getCreateConnector } from './actions';\nimport {\n getOperatorWatchedResources,\n getServiceBindingWatchedResources,\n} from './operatorResources';\nimport {\n getOperatorsComponentFactory,\n getOperatorTopologyDataModel,\n getDataModelReconciler,\n getTopologyFilters,\n applyDisplayOptions,\n} from './index';\n\nexport type OperatorsTopologyConsumedExtensions =\n | TopologyComponentFactory\n | TopologyDataModelFactory\n | TopologyCreateConnector\n | TopologyDisplayFilters\n | PostFormSubmissionAction;\n\nexport const operatorsTopologyPlugin: Plugin<OperatorsTopologyConsumedExtensions> = [\n {\n type: 'Topology/ComponentFactory',\n properties: {\n getFactory: applyCodeRefSymbol(getOperatorsComponentFactory),\n },\n },\n {\n type: 'Topology/DataModelFactory',\n properties: {\n id: 'operator-topology-model-factory',\n priority: 500,\n getDataModel: applyCodeRefSymbol(getOperatorTopologyDataModel),\n resources: getOperatorWatchedResources,\n getDataModelReconciler: applyCodeRefSymbol(getDataModelReconciler),\n },\n },\n {\n type: 'Topology/DataModelFactory',\n properties: {\n id: 'service-binding-topology-model-factory',\n priority: 501,\n resources: getServiceBindingWatchedResources,\n },\n flags: {\n required: [ALLOW_SERVICE_BINDING_FLAG],\n },\n },\n {\n type: 'Topology/CreateConnector',\n properties: {\n getCreateConnector: applyCodeRefSymbol(getCreateConnector),\n },\n flags: {\n required: [ALLOW_SERVICE_BINDING_FLAG],\n },\n },\n {\n type: 'Topology/DisplayFilters',\n properties: {\n getTopologyFilters: applyCodeRefSymbol(getTopologyFilters),\n applyDisplayOptions: applyCodeRefSymbol(applyDisplayOptions),\n },\n },\n {\n type: 'PostFormSubmissionAction',\n properties: {\n type: INCONTEXT_ACTIONS_SERVICE_BINDING,\n callback: doContextualBinding,\n },\n flags: {\n required: [ALLOW_SERVICE_BINDING_FLAG],\n },\n },\n];\n","export const getCreateConnector = () =>\n import('./serviceBindings' /* webpackChunkName: \"operators-service-bindings\" */).then(\n (m) => m.getCreateConnector,\n );\n","import * as _ from 'lodash-es';\nimport { List as ImmutableList, Map as ImmutableMap } from 'immutable';\nimport { Alert, AlertStates, RuleStates, SilenceStates } from '@console/dynamic-plugin-sdk';\n\nimport { ActionType, ObserveAction } from '../actions/observe';\nimport {\n MONITORING_DASHBOARDS_DEFAULT_TIMESPAN,\n MONITORING_DASHBOARDS_VARIABLE_ALL_OPTION_KEY,\n} from '../components/monitoring/dashboards/types';\nimport { isSilenced } from '../components/monitoring/utils';\n\nexport type ObserveState = ImmutableMap<string, any>;\n\nconst newQueryBrowserQuery = (): ImmutableMap<string, any> =>\n ImmutableMap({\n id: _.uniqueId('query-browser-query'),\n isEnabled: true,\n isExpanded: true,\n });\n\nexport const silenceFiringAlerts = (firingAlerts, silences) => {\n // For each firing alert, store a list of the Silences that are silencing it\n // and set its state to show it is silenced\n _.each(firingAlerts, (a) => {\n a.silencedBy = _.filter(\n _.get(silences, 'data'),\n (s) => _.get(s, 'status.state') === SilenceStates.Active && isSilenced(a, s),\n );\n if (a.silencedBy.length) {\n a.state = AlertStates.Silenced;\n // Also set the state of Alerts in `rule.alerts`\n _.each(a.rule.alerts, (ruleAlert) => {\n if (_.some(a.silencedBy, (s) => isSilenced(ruleAlert, s))) {\n ruleAlert.state = AlertStates.Silenced;\n }\n });\n if (!_.isEmpty(a.rule.alerts) && _.every(a.rule.alerts, isSilenced)) {\n a.rule.state = RuleStates.Silenced;\n a.rule.silencedBy = _.filter(\n silences?.data,\n (s) => s.status.state === SilenceStates.Active && _.some(a.rule.alerts, isSilenced),\n );\n }\n }\n });\n};\n\nexport default (state: ObserveState, action: ObserveAction): ObserveState => {\n if (!state) {\n return ImmutableMap({\n dashboards: ImmutableMap({\n dev: ImmutableMap({\n endTime: null,\n pollInterval: 30 * 1000,\n timespan: MONITORING_DASHBOARDS_DEFAULT_TIMESPAN,\n variables: ImmutableMap(),\n }),\n admin: ImmutableMap({\n endTime: null,\n pollInterval: 30 * 1000,\n timespan: MONITORING_DASHBOARDS_DEFAULT_TIMESPAN,\n variables: ImmutableMap(),\n }),\n }),\n queryBrowser: ImmutableMap({\n metrics: [],\n pollInterval: null,\n queries: ImmutableList([newQueryBrowserQuery()]),\n timespan: MONITORING_DASHBOARDS_DEFAULT_TIMESPAN,\n }),\n });\n }\n\n const queryBrowserPatchQueryHelper = (index: number, patch: { [key: string]: unknown }) => {\n const query = state.hasIn(['queryBrowser', 'queries', index])\n ? ImmutableMap(patch)\n : newQueryBrowserQuery().merge(patch);\n return state.mergeIn(['queryBrowser', 'queries', index], query);\n };\n\n switch (action.type) {\n case ActionType.DashboardsPatchVariable:\n return state.mergeIn(\n ['dashboards', action.payload.perspective, 'variables', action.payload.key],\n ImmutableMap(action.payload.patch),\n );\n\n case ActionType.DashboardsPatchAllVariables:\n return state.setIn(\n ['dashboards', action.payload.perspective, 'variables'],\n ImmutableMap(action.payload.variables),\n );\n\n case ActionType.DashboardsClearVariables:\n return state.setIn(['dashboards', action.payload.perspective, 'variables'], ImmutableMap());\n\n case ActionType.DashboardsSetEndTime:\n return state.setIn(\n ['dashboards', action.payload.perspective, 'endTime'],\n action.payload.endTime,\n );\n\n case ActionType.DashboardsSetPollInterval:\n return state.setIn(\n ['dashboards', action.payload.perspective, 'pollInterval'],\n action.payload.pollInterval,\n );\n\n case ActionType.DashboardsSetTimespan:\n return state.setIn(\n ['dashboards', action.payload.perspective, 'timespan'],\n action.payload.timespan,\n );\n\n case ActionType.DashboardsVariableOptionsLoaded: {\n const { key, newOptions, perspective } = action.payload;\n const { options, value } = state.getIn(['dashboards', perspective, 'variables', key]).toJS();\n const patch = _.isEqual(options, newOptions)\n ? { isLoading: false }\n : {\n isLoading: false,\n options: newOptions,\n value:\n value === MONITORING_DASHBOARDS_VARIABLE_ALL_OPTION_KEY || newOptions.includes(value)\n ? value\n : perspective === 'dev' && key === 'namespace'\n ? state.get('activeNamespace')\n : newOptions[0],\n };\n return state.mergeIn(['dashboards', perspective, 'variables', key], ImmutableMap(patch));\n }\n\n case ActionType.AlertingSetRules:\n return state.set(action.payload.key, action.payload.data);\n\n case ActionType.AlertingSetData: {\n const alertsKey = action.payload.data.perspective === 'admin' ? 'alerts' : 'devAlerts';\n const alerts = action.payload.key === alertsKey ? action.payload.data : state.get(alertsKey);\n // notificationAlerts used by notification drawer and certain dashboards\n const notificationAlerts: NotificationAlerts =\n action.payload.key === 'notificationAlerts'\n ? action.payload.data\n : state.get('notificationAlerts');\n\n const silencesKey = action.payload.data.perspective === 'admin' ? 'silences' : 'devSilences';\n const silences =\n action.payload.key === silencesKey ? action.payload.data : state.get(silencesKey);\n\n const isAlertFiring = (alert) =>\n alert?.state === AlertStates.Firing || alert?.state === AlertStates.Silenced;\n const firingAlerts = _.filter(alerts?.data, isAlertFiring);\n silenceFiringAlerts(firingAlerts, silences);\n silenceFiringAlerts(_.filter(notificationAlerts?.data, isAlertFiring), silences);\n notificationAlerts.data = _.reject(notificationAlerts.data, { state: AlertStates.Silenced });\n state = state.set(alertsKey, alerts);\n state = state.set('notificationAlerts', notificationAlerts);\n\n // For each Silence, store a list of the Alerts it is silencing\n _.each(_.get(silences, 'data'), (s) => {\n s.firingAlerts = _.filter(firingAlerts, (a) => isSilenced(a, s));\n });\n return state.set(silencesKey, silences);\n }\n\n case ActionType.ToggleGraphs:\n return state.set('hideGraphs', !state.get('hideGraphs'));\n\n case ActionType.QueryBrowserAddQuery:\n return state.setIn(\n ['queryBrowser', 'queries'],\n state.getIn(['queryBrowser', 'queries']).push(newQueryBrowserQuery()),\n );\n\n case ActionType.QueryBrowserDuplicateQuery: {\n const index = action.payload.index;\n const originQueryText = state.getIn(['queryBrowser', 'queries', index, 'text']);\n const duplicate = newQueryBrowserQuery().merge({\n text: originQueryText,\n isEnabled: false,\n });\n return state.setIn(\n ['queryBrowser', 'queries'],\n state.getIn(['queryBrowser', 'queries']).push(duplicate),\n );\n }\n\n case ActionType.QueryBrowserDeleteAllQueries:\n return state.setIn(['queryBrowser', 'queries'], ImmutableList([newQueryBrowserQuery()]));\n\n case ActionType.QueryBrowserDeleteAllSeries: {\n return state.setIn(\n ['queryBrowser', 'queries'],\n state.getIn(['queryBrowser', 'queries']).map((q) => q.set('series', undefined)),\n );\n }\n\n case ActionType.QueryBrowserDeleteQuery: {\n let queries = state.getIn(['queryBrowser', 'queries']).delete(action.payload.index);\n if (queries.size === 0) {\n queries = queries.push(newQueryBrowserQuery());\n }\n return state.setIn(['queryBrowser', 'queries'], queries);\n }\n\n case ActionType.QueryBrowserDismissNamespaceAlert:\n return state.setIn(['queryBrowser', 'dismissNamespaceAlert'], true);\n\n case ActionType.QueryBrowserPatchQuery: {\n const { index, patch } = action.payload;\n return queryBrowserPatchQueryHelper(index, patch);\n }\n\n case ActionType.QueryBrowserRunQueries: {\n const queries = state.getIn(['queryBrowser', 'queries']).map((q) => {\n const isEnabled = q.get('isEnabled');\n const query = q.get('query');\n const text = _.trim(q.get('text'));\n return isEnabled && query !== text ? q.merge({ query: text, series: undefined }) : q;\n });\n\n return state\n .setIn(['queryBrowser', 'queries'], queries)\n .setIn(['queryBrowser', 'lastRequestTime'], Date.now());\n }\n\n case ActionType.QueryBrowserSetAllExpanded: {\n const queries = state.getIn(['queryBrowser', 'queries']).map((q) => {\n return q.set('isExpanded', action.payload.isExpanded);\n });\n return state.setIn(['queryBrowser', 'queries'], queries);\n }\n\n case ActionType.QueryBrowserSetMetrics:\n return state.setIn(['queryBrowser', 'metrics'], action.payload.metrics);\n\n case ActionType.QueryBrowserSetPollInterval:\n return state.setIn(['queryBrowser', 'pollInterval'], action.payload.pollInterval);\n\n case ActionType.QueryBrowserSetTimespan:\n return state.setIn(['queryBrowser', 'timespan'], action.payload.timespan);\n\n case ActionType.QueryBrowserToggleAllSeries: {\n const index = action.payload.index;\n const isDisabledSeriesEmpty = _.isEmpty(\n state.getIn(['queryBrowser', 'queries', index, 'disabledSeries']),\n );\n const series = state.getIn(['queryBrowser', 'queries', index, 'series']);\n const patch = { disabledSeries: isDisabledSeriesEmpty ? series : [] };\n return queryBrowserPatchQueryHelper(index, patch);\n }\n\n case ActionType.QueryBrowserToggleIsEnabled: {\n const query = state.getIn(['queryBrowser', 'queries', action.payload.index]);\n const isEnabled = !query.get('isEnabled');\n return state.setIn(\n ['queryBrowser', 'queries', action.payload.index],\n query.merge({\n isEnabled,\n isExpanded: isEnabled,\n query: isEnabled ? query.get('text') : '',\n }),\n );\n }\n\n case ActionType.QueryBrowserToggleSeries:\n return state.updateIn(\n ['queryBrowser', 'queries', action.payload.index, 'disabledSeries'],\n (v) => _.xorWith(v, [action.payload.labels], _.isEqual),\n );\n\n case ActionType.SetAlertCount:\n return state.set('alertCount', action.payload.alertCount);\n\n default:\n break;\n }\n return state;\n};\n\nexport type NotificationAlerts = {\n data: Alert[];\n loaded: boolean;\n loadError?: {\n message?: string;\n };\n};\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport {\n Route,\n Routes,\n Navigate,\n useParams,\n useLocation,\n matchRoutes,\n} from 'react-router-dom-v5-compat';\nimport { useActivePerspective, Perspective } from '@console/dynamic-plugin-sdk';\nimport { useDynamicPluginInfo } from '@console/plugin-sdk/src/api/useDynamicPluginInfo';\nimport { FLAGS, useUserSettings, getPerspectiveVisitedKey, usePerspectives } from '@console/shared';\nimport { ErrorBoundaryPage } from '@console/shared/src/components/error';\nimport { connectToFlags } from '../reducers/connectToFlags';\nimport { flagPending, FlagsObject } from '../reducers/features';\nimport { GlobalNotifications } from './global-notifications';\nimport { NamespaceBar } from './namespace-bar';\nimport { SearchPage } from './search';\nimport { ResourceDetailsPage, ResourceListPage } from './resource-list';\nimport { AsyncComponent, LoadingBox } from './utils';\nimport { namespacedPrefixes } from './utils/link';\nimport {\n AlertmanagerModel,\n CronJobModel,\n HorizontalPodAutoscalerModel,\n VolumeSnapshotModel,\n} from '../models';\nimport { referenceForModel } from '../module/k8s';\nimport { NamespaceRedirect } from './utils/namespace-redirect';\nimport { PageSection, PageSectionVariants } from '@patternfly/react-core';\nimport { usePluginRoutes } from '@console/app/src/hooks/usePluginRoutes';\nimport CreateResource from './create-resource';\nimport { TelemetryNotifier } from './global-telemetry-notifications';\n\nconst RedirectComponent = () => {\n const location = useLocation();\n const to = `/k8s${location.pathname}`;\n return <Navigate to={to} replace />;\n};\n\n// Ensure a *const* function wrapper for each namespaced Component so that react router doesn't recreate them\nconst Memoized = new Map();\nfunction NamespaceFromURL(Component) {\n let C = Memoized.get(Component);\n if (!C) {\n C = function NamespaceInjector(props) {\n return <Component {...props} />;\n };\n Memoized.set(Component, C);\n }\n return C;\n}\n\nconst namespacedRoutes = [];\n_.each(namespacedPrefixes, (p) => {\n namespacedRoutes.push({ path: `${p}/ns/:ns/*` });\n namespacedRoutes.push({ path: `${p}/all-namespaces/*` });\n});\n\nconst DefaultPageRedirect: React.FC<{\n url: Perspective['properties']['landingPageURL'];\n flags: { [key: string]: boolean };\n firstVisit: boolean;\n}> = ({ url, flags, firstVisit }) => {\n const [resolvedUrl, setResolvedUrl] = React.useState<string>();\n React.useEffect(() => {\n (async () => {\n setResolvedUrl((await url())(flags, firstVisit));\n })();\n }, [url, flags, firstVisit]);\n\n return resolvedUrl ? <Navigate to={resolvedUrl} replace /> : null;\n};\n\ntype DefaultPageProps = {\n flags: FlagsObject;\n};\n\n// The default page component lets us connect to flags without connecting the entire App.\nconst DefaultPage_: React.FC<DefaultPageProps> = ({ flags }) => {\n const [activePerspective] = useActivePerspective();\n const perspectiveExtensions = usePerspectives();\n const [visited, setVisited, visitedLoaded] = useUserSettings<boolean>(\n getPerspectiveVisitedKey(activePerspective),\n false,\n );\n const firstVisit = React.useRef<boolean>();\n\n // First time thru, capture first visit status\n if (firstVisit.current == null && visitedLoaded) {\n firstVisit.current = !visited;\n }\n\n React.useEffect(() => {\n if (visitedLoaded && !visited) {\n // Mark perspective as visited\n setVisited(true);\n }\n }, [visitedLoaded, visited, setVisited]);\n\n if (Object.keys(flags).some((key) => flagPending(flags[key])) || !visitedLoaded) {\n return <LoadingBox />;\n }\n\n const perspective = perspectiveExtensions.find((p) => p?.properties?.id === activePerspective);\n\n // support redirecting to perspective landing page\n return (\n <DefaultPageRedirect\n flags={flags}\n firstVisit={firstVisit.current}\n url={perspective?.properties?.landingPageURL}\n />\n );\n};\n\nconst DefaultPage = connectToFlags(\n FLAGS.OPENSHIFT,\n FLAGS.CAN_LIST_NS,\n FLAGS.MONITORING,\n)(DefaultPage_);\n\n// REDIRECT ROUTES FOR REACT-ROUTER-V6\nconst StatusProjectsRedirect = () => {\n const { ns } = useParams();\n return <Navigate to={`/k8s/cluster/projects/${ns}`} replace />;\n};\n\nconst OverviewProjectsRedirect = () => {\n const { ns } = useParams();\n return <Navigate to={`/k8s/cluster/projects/${ns}/workloads`} replace />;\n};\n\nconst AlertManagerRedirect = () => {\n const { ns, name } = useParams();\n return <Navigate to={`/k8s/ns/${ns}/${referenceForModel(AlertmanagerModel)}/${name}`} replace />;\n};\n\nconst CronJobRedirect = () => {\n const { ns, name } = useParams();\n return <Navigate to={`/k8s/ns/${ns}/${CronJobModel.plural}/${name}`} replace />;\n};\n\nconst HorizontalPodRedirect = () => {\n const { ns, name } = useParams();\n return <Navigate to={`/k8s/ns/${ns}/${HorizontalPodAutoscalerModel.plural}/${name}`} replace />;\n};\n\nconst AppContents: React.FC<{}> = () => {\n const [, allPluginsProcessed] = useDynamicPluginInfo();\n const location = useLocation();\n const [pluginPageRoutes, inactivePluginPageRoutes] = usePluginRoutes();\n\n const contentRouter = (\n <Routes>\n {pluginPageRoutes}\n\n <Route path=\"/all-namespaces/*\" element={<RedirectComponent />} />\n <Route path=\"/ns/:ns/*\" element={<RedirectComponent />} />\n <Route\n path=\"/dashboards/*\"\n element={\n <AsyncComponent\n loader={() =>\n import(\n './dashboard/dashboards-page/dashboards' /* webpackChunkName: \"dashboards\" */\n ).then((m) => m.DashboardsPage)\n }\n />\n }\n />\n\n {/* Redirect legacy routes to avoid breaking links */}\n <Route path=\"/cluster-status\" element={<Navigate to=\"/dashboards\" replace />} />\n <Route path=\"/status/all-namespaces\" element={<Navigate to=\"/dashboards\" replace />} />\n <Route path=\"/status/ns/:ns\" element={<StatusProjectsRedirect />} />\n <Route path=\"/status\" element={<NamespaceRedirect />} />\n <Route path=\"/overview/all-namespaces\" element={<Navigate to=\"/dashboards\" replace />} />\n <Route path=\"/overview/ns/:ns\" element={<OverviewProjectsRedirect />} />\n <Route path=\"/overview\" element={<NamespaceRedirect />} />\n\n <Route\n path=\"/api-explorer\"\n element={\n <AsyncComponent\n loader={() =>\n import('./api-explorer' /* webpackChunkName: \"api-explorer\" */).then(\n (m) => m.APIExplorerPage,\n )\n }\n />\n }\n />\n <Route\n path=\"/api-resource/cluster/:plural/*\"\n element={\n <AsyncComponent\n loader={() =>\n import('./api-explorer' /* webpackChunkName: \"api-explorer\" */).then(\n (m) => m.APIResourcePage,\n )\n }\n />\n }\n />\n <Route\n path=\"/api-resource/all-namespaces/:plural/*\"\n element={\n <AsyncComponent\n loader={() =>\n import('./api-explorer' /* webpackChunkName: \"api-explorer\" */).then((m) =>\n NamespaceFromURL(m.APIResourcePage),\n )\n }\n />\n }\n />\n <Route\n path=\"/api-resource/ns/:ns/:plural/*\"\n element={\n <AsyncComponent\n loader={() =>\n import('./api-explorer' /* webpackChunkName: \"api-explorer\" */).then((m) =>\n NamespaceFromURL(m.APIResourcePage),\n )\n }\n />\n }\n />\n\n <Route\n path=\"/command-line-tools\"\n element={\n <AsyncComponent\n loader={() =>\n import('./command-line-tools' /* webpackChunkName: \"command-line-tools\" */).then(\n (m) => m.CommandLineToolsPage,\n )\n }\n />\n }\n />\n\n <Route path=\"/operatorhub\" element={<NamespaceRedirect />} />\n\n <Route\n path=\"/catalog/instantiate-template\"\n element={\n <AsyncComponent\n loader={() =>\n import('./instantiate-template' /* webpackChunkName: \"instantiate-template\" */).then(\n (m) => m.InstantiateTemplatePage,\n )\n }\n />\n }\n />\n\n <Route path=\"/k8s/ns/:ns/alertmanagers/:name\" element={<AlertManagerRedirect />} />\n <Route path=\"/k8s/ns/:ns/batch~v1beta1~CronJob/:name\" element={<CronJobRedirect />} />\n <Route\n path=\"/k8s/ns/:ns/autoscaling~v2beta2~HorizontalPodAutoscaler/:name\"\n element={<HorizontalPodRedirect />}\n />\n\n <Route\n path=\"/k8s/all-namespaces/events\"\n element={\n <AsyncComponent\n loader={() =>\n import('./events' /* webpackChunkName: \"events\" */).then((m) =>\n NamespaceFromURL(m.EventStreamPage),\n )\n }\n />\n }\n />\n <Route\n path=\"/k8s/ns/:ns/events\"\n element={\n <AsyncComponent\n loader={() =>\n import('./events' /* webpackChunkName: \"events\" */).then((m) =>\n NamespaceFromURL(m.EventStreamPage),\n )\n }\n />\n }\n />\n\n <Route path=\"/search/all-namespaces\" element={<SearchPage />} />\n <Route path=\"/search/ns/:ns\" element={<SearchPage />} />\n <Route path=\"/search\" element={<NamespaceRedirect />} />\n\n <Route\n path=\"/k8s/all-namespaces/import\"\n element={\n <AsyncComponent\n loader={() =>\n import('./import-yaml' /* webpackChunkName: \"import-yaml\" */).then(\n (m) => m.ImportYamlPage,\n )\n }\n />\n }\n />\n <Route\n path=\"/k8s/ns/:ns/import/\"\n element={\n <AsyncComponent\n loader={() =>\n import('./import-yaml' /* webpackChunkName: \"import-yaml\" */).then(\n (m) => m.ImportYamlPage,\n )\n }\n />\n }\n />\n <Route\n path=\"/k8s/ns/:ns/secrets/~new/:type\"\n element={\n <AsyncComponent\n kind=\"Secret\"\n loader={() =>\n import('./secrets/create-secret' /* webpackChunkName: \"create-secret\" */).then(\n (m) => m.CreateSecret,\n )\n }\n />\n }\n />\n <Route\n path=\"/k8s/ns/:ns/configmaps/~new/form\"\n element={\n <AsyncComponent\n kind=\"ConfigMap\"\n loader={() =>\n import(\n './configmaps/ConfigMapPage' /* webpackChunkName: \"create-configmap-page\" */\n ).then((m) => m.default)\n }\n />\n }\n />\n <Route\n path=\"/k8s/ns/:ns/configmaps/:name/form\"\n element={\n <AsyncComponent\n kind=\"ConfigMap\"\n loader={() =>\n import(\n './configmaps/ConfigMapPage' /* webpackChunkName: \"edit-configmap-page\" */\n ).then((m) => m.default)\n }\n />\n }\n />\n <Route\n path=\"/k8s/ns/:ns/secrets/:name/edit\"\n element={\n <AsyncComponent\n kind=\"Secret\"\n loader={() =>\n import('./secrets/create-secret' /* webpackChunkName: \"create-secret\" */).then(\n (m) => m.EditSecret,\n )\n }\n />\n }\n />\n <Route\n path=\"/k8s/ns/:ns/secrets/:name/edit-yaml\"\n element={\n <AsyncComponent\n kind=\"Secret\"\n loader={() => import('./create-yaml').then((m) => m.EditYAMLPage)}\n />\n }\n />\n\n <Route\n path=\"/k8s/ns/:ns/networkpolicies/~new/form\"\n element={\n <AsyncComponent\n kind=\"NetworkPolicy\"\n loader={() =>\n import(\n '@console/app/src/components/network-policies/create-network-policy' /* webpackChunkName: \"create-network-policy\" */\n ).then((m) => m.CreateNetworkPolicy)\n }\n />\n }\n />\n\n <Route\n path=\"/k8s/ns/:ns/networking.k8s.io~v1~NetworkPolicy/~new/form\"\n element={\n <AsyncComponent\n kind=\"NetworkPolicy\"\n loader={() =>\n import(\n '@console/app/src/components/network-policies/create-network-policy' /* webpackChunkName: \"create-network-policy\" */\n ).then((m) => m.CreateNetworkPolicy)\n }\n />\n }\n />\n\n <Route\n path=\"/k8s/ns/:ns/k8s.cni.cncf.io~v1beta1~MultiNetworkPolicy/~new/form\"\n element={\n <AsyncComponent\n kind=\"NetworkPolicy\"\n loader={() =>\n import(\n '@console/app/src/components/network-policies/create-network-policy' /* webpackChunkName: \"create-network-policy\" */\n ).then((m) => m.CreateNetworkPolicy)\n }\n />\n }\n />\n\n <Route\n path=\"/k8s/ns/:ns/routes/~new/form\"\n element={\n <AsyncComponent\n kind=\"Route\"\n loader={() =>\n import('./routes/RoutePage' /* webpackChunkName: \"create-route\" */).then(\n (m) => m.RoutePage,\n )\n }\n />\n }\n />\n\n <Route\n path=\"/k8s/ns/:ns/routes/:name/form\"\n element={\n <AsyncComponent\n kind=\"Route\"\n loader={() =>\n import('./routes/RoutePage' /* webpackChunkName: \"edit-route\" */).then(\n (m) => m.RoutePage,\n )\n }\n />\n }\n />\n\n <Route\n path=\"/k8s/cluster/rolebindings/~new\"\n element={\n <AsyncComponent\n loader={() =>\n import('./RBAC' /* webpackChunkName: \"rbac\" */).then((m) => m.CreateRoleBinding)\n }\n kind=\"RoleBinding\"\n />\n }\n />\n <Route\n path=\"/k8s/ns/:ns/rolebindings/~new\"\n element={\n <AsyncComponent\n loader={() =>\n import('./RBAC' /* webpackChunkName: \"rbac\" */).then((m) => m.CreateRoleBinding)\n }\n kind=\"RoleBinding\"\n />\n }\n />\n <Route\n path=\"/k8s/ns/:ns/rolebindings/:name/copy\"\n element={\n <AsyncComponent\n kind=\"RoleBinding\"\n loader={() =>\n import('./RBAC' /* webpackChunkName: \"rbac\" */).then((m) => m.CopyRoleBinding)\n }\n />\n }\n />\n <Route\n path=\"/k8s/ns/:ns/rolebindings/:name/edit\"\n element={\n <AsyncComponent\n kind=\"RoleBinding\"\n loader={() =>\n import('./RBAC' /* webpackChunkName: \"rbac\" */).then((m) => m.EditRoleBinding)\n }\n />\n }\n />\n <Route\n path=\"/k8s/cluster/clusterrolebindings/:name/copy\"\n element={\n <AsyncComponent\n kind=\"ClusterRoleBinding\"\n loader={() =>\n import('./RBAC' /* webpackChunkName: \"rbac\" */).then((m) => m.CopyRoleBinding)\n }\n />\n }\n />\n <Route\n path=\"/k8s/cluster/clusterrolebindings/:name/edit\"\n element={\n <AsyncComponent\n kind=\"ClusterRoleBinding\"\n loader={() =>\n import('./RBAC' /* webpackChunkName: \"rbac\" */).then((m) => m.EditRoleBinding)\n }\n />\n }\n />\n <Route\n path=\"/k8s/ns/:ns/:plural/:name/attach-storage\"\n element={\n <AsyncComponent\n loader={() =>\n import('./storage/attach-storage' /* webpackChunkName: \"attach-storage\" */).then(\n (m) => m.default,\n )\n }\n />\n }\n />\n\n <Route\n path=\"/k8s/ns/:ns/persistentvolumeclaims/~new/form\"\n element={\n <AsyncComponent\n kind=\"PersistentVolumeClaim\"\n loader={() =>\n import('./storage/create-pvc' /* webpackChunkName: \"create-pvc\" */).then(\n (m) => m.CreatePVC,\n )\n }\n />\n }\n />\n\n <Route\n path={`/k8s/ns/:ns/${VolumeSnapshotModel.plural}/~new/form`}\n element={\n <AsyncComponent\n loader={() =>\n import(\n '@console/app/src/components/volume-snapshot/create-volume-snapshot/create-volume-snapshot' /* webpackChunkName: \"create-volume-snapshot\" */\n ).then((m) => m.VolumeSnapshot)\n }\n />\n }\n />\n <Route\n path={`/k8s/all-namespaces/${VolumeSnapshotModel.plural}/~new/form`}\n element={\n <AsyncComponent\n loader={() =>\n import(\n '@console/app/src/components/volume-snapshot/create-volume-snapshot/create-volume-snapshot' /* webpackChunkName: \"create-volume-snapshot\" */\n ).then((m) => m.VolumeSnapshot)\n }\n />\n }\n />\n\n <Route\n path=\"/monitoring/alertmanagerconfig/receivers/~new\"\n element={\n <AsyncComponent\n loader={() =>\n import(\n './monitoring/receiver-forms/alert-manager-receiver-forms' /* webpackChunkName: \"receiver-forms\" */\n ).then((m) => m.CreateReceiver)\n }\n />\n }\n />\n <Route\n path=\"/monitoring/alertmanagerconfig/receivers/:name/edit\"\n element={\n <AsyncComponent\n loader={() =>\n import(\n './monitoring/receiver-forms/alert-manager-receiver-forms' /* webpackChunkName: \"receiver-forms\" */\n ).then((m) => m.EditReceiver)\n }\n />\n }\n />\n <Route\n path=\"/monitoring/*\"\n element={\n <AsyncComponent\n loader={() =>\n import('./monitoring/alerting' /* webpackChunkName: \"alerting\" */).then(\n (m) => m.MonitoringUI,\n )\n }\n />\n }\n />\n\n <Route\n path=\"/settings/idp/github\"\n element={\n <AsyncComponent\n loader={() =>\n import(\n './cluster-settings/github-idp-form' /* webpackChunkName: \"github-idp-form\" */\n ).then((m) => m.AddGitHubPage)\n }\n />\n }\n />\n <Route\n path=\"/settings/idp/gitlab\"\n element={\n <AsyncComponent\n loader={() =>\n import(\n './cluster-settings/gitlab-idp-form' /* webpackChunkName: \"gitlab-idp-form\" */\n ).then((m) => m.AddGitLabPage)\n }\n />\n }\n />\n <Route\n path=\"/settings/idp/google\"\n element={\n <AsyncComponent\n loader={() =>\n import(\n './cluster-settings/google-idp-form' /* webpackChunkName: \"google-idp-form\" */\n ).then((m) => m.AddGooglePage)\n }\n />\n }\n />\n <Route\n path=\"/settings/idp/htpasswd\"\n element={\n <AsyncComponent\n loader={() =>\n import(\n './cluster-settings/htpasswd-idp-form' /* webpackChunkName: \"htpasswd-idp-form\" */\n ).then((m) => m.AddHTPasswdPage)\n }\n />\n }\n />\n <Route\n path=\"/settings/idp/keystone\"\n element={\n <AsyncComponent\n loader={() =>\n import(\n './cluster-settings/keystone-idp-form' /* webpackChunkName: \"keystone-idp-form\" */\n ).then((m) => m.AddKeystonePage)\n }\n />\n }\n />\n <Route\n path=\"/settings/idp/ldap\"\n element={\n <AsyncComponent\n loader={() =>\n import(\n './cluster-settings/ldap-idp-form' /* webpackChunkName: \"ldap-idp-form\" */\n ).then((m) => m.AddLDAPPage)\n }\n />\n }\n />\n <Route\n path=\"/settings/idp/ldap\"\n element={\n <AsyncComponent\n loader={() =>\n import(\n './cluster-settings/ldap-idp-form' /* webpackChunkName: \"ldap-idp-form\" */\n ).then((m) => m.AddLDAPPage)\n }\n />\n }\n />\n <Route\n path=\"/settings/idp/oidconnect\"\n element={\n <AsyncComponent\n loader={() =>\n import(\n './cluster-settings/openid-idp-form' /* webpackChunkName: \"openid-idp-form\" */\n ).then((m) => m.AddOpenIDIDPPage)\n }\n />\n }\n />\n <Route\n path=\"/settings/idp/basicauth\"\n element={\n <AsyncComponent\n loader={() =>\n import(\n './cluster-settings/basicauth-idp-form' /* webpackChunkName: \"basicauth-idp-form\" */\n ).then((m) => m.AddBasicAuthPage)\n }\n />\n }\n />\n <Route\n path=\"/settings/idp/requestheader\"\n element={\n <AsyncComponent\n loader={() =>\n import(\n './cluster-settings/request-header-idp-form' /* webpackChunkName: \"request-header-idp-form\" */\n ).then((m) => m.AddRequestHeaderPage)\n }\n />\n }\n />\n <Route\n path=\"/settings/cluster/*\"\n element={\n <AsyncComponent\n loader={() =>\n import(\n './cluster-settings/cluster-settings' /* webpackChunkName: \"cluster-settings\" */\n ).then((m) => m.ClusterSettingsPage)\n }\n />\n }\n />\n\n <Route\n path={'/k8s/cluster/storageclasses/~new/form'}\n element={\n <AsyncComponent\n loader={() =>\n import('./storage-class-form' /* webpackChunkName: \"storage-class-form\" */).then(\n (m) => m.StorageClassForm,\n )\n }\n />\n }\n />\n <Route\n path=\"/k8s/ns/:ns/:resourceRef/form\"\n element={\n <AsyncComponent\n kind=\"PodDisruptionBudgets\"\n loader={() =>\n import(\n '@console/app/src/components/pdb/PDBFormPage' /* webpackChunkName: \"PDBFormPage\" */\n ).then((m) => m.PDBFormPage)\n }\n />\n }\n />\n <Route path=\"/k8s/cluster/:plural\" element={<ResourceListPage />} />\n <Route path=\"/k8s/cluster/:plural/~new\" element={<CreateResource />} />\n <Route path=\"/k8s/cluster/:plural/:name/*\" element={<ResourceDetailsPage />} />\n <Route\n path=\"/k8s/ns/:ns/pods/:podName/containers/:name/debug/*\"\n element={\n <AsyncComponent\n loader={() =>\n import('./debug-terminal' /* webpackChunkName: \"debug-terminal\" */).then(\n (m) => m.DebugTerminalPage,\n )\n }\n />\n }\n />\n <Route\n path=\"/k8s/ns/:ns/pods/:podName/containers/:name/*\"\n element={\n <AsyncComponent\n loader={() => import('./container').then((m) => m.ContainersDetailsPage)}\n />\n }\n />\n <Route path=\"/k8s/ns/:ns/:plural/~new/*\" element={<CreateResource />} />\n <Route path=\"/k8s/ns/:ns/:plural/:name/*\" element={<ResourceDetailsPage />} />\n <Route path=\"/k8s/ns/:ns/:plural\" element={<ResourceListPage />} />\n\n <Route path=\"/k8s/all-namespaces/:plural\" element={<ResourceListPage />} />\n <Route path=\"/k8s/all-namespaces/:plural/:name/*\" element={<ResourceDetailsPage />} />\n\n {inactivePluginPageRoutes}\n <Route path=\"/\" element={<DefaultPage />} />\n\n {allPluginsProcessed ? (\n <Route\n path=\"*\"\n element={\n <AsyncComponent\n loader={() =>\n import('./error' /* webpackChunkName: \"error\" */).then((m) => m.ErrorPage404)\n }\n />\n }\n />\n ) : (\n <Route element={<LoadingBox />} />\n )}\n </Routes>\n );\n\n const matches = matchRoutes(namespacedRoutes, location);\n\n return (\n <div id=\"content\">\n <PageSection variant={PageSectionVariants.light} padding={{ default: 'noPadding' }}>\n <GlobalNotifications />\n {matches && <NamespaceBar />}\n </PageSection>\n <div id=\"content-scrollable\">\n <PageSection\n className=\"pf-v5-page__main-section--flex co-page-backdrop\"\n padding={{ default: 'noPadding' }}\n >\n <ErrorBoundaryPage>\n <React.Suspense fallback={<LoadingBox />}>{contentRouter}</React.Suspense>\n </ErrorBoundaryPage>\n </PageSection>\n </div>\n <PageSection variant={PageSectionVariants.light} padding={{ default: 'noPadding' }}>\n <TelemetryNotifier />\n </PageSection>\n </div>\n );\n};\n\nexport default AppContents;\n","import * as React from 'react';\n\nimport { ImpersonateNotifier } from './impersonate-notifier';\nimport { KubeAdminNotifier } from './kube-admin-notifier';\n\nexport const GlobalNotifications = () => (\n <div className=\"co-global-notifications\" data-test=\"global-notifications\">\n <KubeAdminNotifier />\n <ImpersonateNotifier />\n </div>\n);\n","import * as React from 'react';\nimport { connect } from 'react-redux';\nimport { useTranslation, Trans } from 'react-i18next';\nimport { useNavigate } from 'react-router-dom-v5-compat';\nimport { Button } from '@patternfly/react-core';\nimport { getImpersonate } from '@console/dynamic-plugin-sdk';\n\nimport * as UIActions from '../actions/ui';\nimport { modelFor } from '../module/k8s';\n\nexport const ImpersonateNotifier = connect((state) => ({ impersonate: getImpersonate(state) }), {\n stopImpersonate: UIActions.stopImpersonate,\n})(({ stopImpersonate, impersonate }) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n if (!impersonate) {\n return null;\n }\n const kindTranslated = modelFor(impersonate.kind)?.labelKey\n ? t(modelFor(impersonate.kind).labelKey)\n : impersonate.kind;\n const impersonateName = impersonate.name;\n return (\n <div className=\"co-global-notification\">\n <div className=\"co-global-notification__content\">\n <p className=\"co-global-notification__text\">\n <span className=\"text-uppercase co-global-notification__impersonate-kind\">\n {t('public~Impersonating {{kind}}', {\n kind: kindTranslated,\n })}\n </span>{' '}\n <Trans t={t} ns=\"public\">\n You are impersonating{' '}\n <span className=\"co-global-notification__impersonate-name\">{{ impersonateName }}</span>.\n You are viewing all resources and roles this {{ kindTranslated }} can access.\n </Trans>{' '}\n <Button\n isInline\n type=\"button\"\n variant=\"link\"\n onClick={() => {\n stopImpersonate();\n navigate(window.SERVER_FLAGS.basePath);\n }}\n >\n {t('public~Stop impersonation')}\n </Button>\n </p>\n </div>\n </div>\n );\n});\n","import * as React from 'react';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { connect } from 'react-redux';\nimport * as _ from 'lodash-es';\nimport { useTranslation, Trans } from 'react-i18next';\n\nimport { KUBE_ADMIN_USERNAMES, useCanClusterUpgrade } from '@console/shared';\nimport { OAuthModel } from '../models';\nimport { userStateToProps } from '../reducers/ui';\nimport { resourcePathFromModel } from './utils/resource-link';\n\nconst oAuthResourcePath = resourcePathFromModel(OAuthModel, 'cluster');\n\nexport const KubeAdminNotifier = connect(userStateToProps)(({ user }) => {\n const { t } = useTranslation();\n const canUpgrade = useCanClusterUpgrade();\n const username = _.get(user, 'username');\n return KUBE_ADMIN_USERNAMES.includes(username) && canUpgrade ? (\n <div className=\"co-global-notification\">\n <div className=\"co-global-notification__content\">\n <p className=\"co-global-notification__text\">\n <Trans t={t} ns=\"public\">\n You are logged in as a temporary administrative user. Update the{' '}\n <Link to={oAuthResourcePath}>cluster OAuth configuration</Link> to allow others to log\n in.\n </Trans>\n </p>\n </div>\n </div>\n ) : null;\n});\n","import * as React from 'react';\nimport { Route } from 'react-router-dom-v5-compat';\nimport {\n useActivePerspective,\n RoutePage as DynamicRoutePageExtension,\n isRoutePage as isDynamicRoutePageExtension,\n} from '@console/dynamic-plugin-sdk';\nimport { AsyncComponent } from '@console/internal/components/utils';\nimport {\n RoutePage as StaticRoutePageExtension,\n isRoutePage as isStaticRoutePageExtension,\n useExtensions,\n LoadedExtension,\n} from '@console/plugin-sdk';\n\nconst isRoutePageExtensionActive: IsRouteExtensionActive = (extension, activePerspective) =>\n (extension.properties.perspective ?? activePerspective) === activePerspective;\n\nconst LazyDynamicRoutePage: React.FCC<LazyDynamicRoutePageProps> = ({ component }) => {\n const LazyComponent = React.useMemo(\n () =>\n React.lazy(async () => {\n const Component = await component();\n // TODO do not wrap as `default` when we support module code refs\n return { default: Component };\n }),\n [component],\n );\n return <LazyComponent />;\n};\n\nconst LazyRoutePage: React.FCC<LazyRoutePageProps> = ({ extension }) => {\n if (isStaticRoutePageExtension(extension)) {\n return extension.properties.loader ? (\n <AsyncComponent loader={extension.properties.loader} />\n ) : null;\n }\n return <LazyDynamicRoutePage component={extension.properties.component} />;\n};\n\nconst InactiveRoutePage: React.FCC<InactiveRoutePageProps> = ({\n extension,\n path,\n setActivePerspective,\n}) => {\n React.useEffect(() => {\n setActivePerspective(extension.properties.perspective, path);\n });\n return null;\n};\n\nconst RoutePage: React.FCC<RoutePageProps> = ({\n path,\n extension,\n activePerspective,\n setActivePerspective,\n}) => {\n const active = isRoutePageExtensionActive(extension, activePerspective);\n return active ? (\n <LazyRoutePage extension={extension} />\n ) : (\n <InactiveRoutePage\n extension={extension}\n path={path}\n setActivePerspective={setActivePerspective}\n />\n );\n};\n\nexport const usePluginRoutes: UsePluginRoutes = () => {\n const staticExtensions = useExtensions<StaticRoutePageExtension>(isStaticRoutePageExtension);\n const dynamicExtensions = useExtensions<DynamicRoutePageExtension>(isDynamicRoutePageExtension);\n const [activePerspective, setActivePerspective] = useActivePerspective();\n const getRoutesForExtension = React.useCallback(\n (extension: LoadedRoutePageExtension): React.ReactElement[] => {\n if (Array.isArray(extension.properties.path)) {\n return extension.properties.path.map((path) => (\n <Route\n {...extension.properties}\n path={`${path}${extension.properties.exact ? '' : '/*'}`}\n key={path}\n element={\n <RoutePage\n extension={extension}\n path={path}\n activePerspective={activePerspective}\n setActivePerspective={setActivePerspective}\n />\n }\n />\n ));\n }\n return [\n <Route\n {...extension.properties}\n path={`${extension.properties.path}${extension.properties.exact ? '' : '/*'}`}\n key={extension.properties.path}\n element={\n <RoutePage\n extension={extension}\n path={extension.properties.path}\n activePerspective={activePerspective}\n setActivePerspective={setActivePerspective}\n />\n }\n />,\n ];\n },\n [activePerspective, setActivePerspective],\n );\n\n return React.useMemo(\n () =>\n [...staticExtensions, ...dynamicExtensions].reduce(\n ([activeAcc, inactiveAcc], extension) => {\n const active = isRoutePageExtensionActive(extension, activePerspective);\n const routes = getRoutesForExtension(extension);\n return active\n ? [[...activeAcc, ...routes], inactiveAcc]\n : [activeAcc, [...inactiveAcc, ...routes]];\n },\n [[], []],\n ),\n [staticExtensions, dynamicExtensions, getRoutesForExtension, activePerspective],\n );\n};\n\ntype RoutePageExtension = StaticRoutePageExtension | DynamicRoutePageExtension;\n\ntype LoadedRoutePageExtension = LoadedExtension<RoutePageExtension>;\n\ntype SetActivePerspective = (perspective: string, next: string) => void;\n\ntype IsRouteExtensionActive = (\n extension: LoadedRoutePageExtension,\n activePerspective: string,\n) => boolean;\n\ntype LazyDynamicRoutePageProps = {\n component: DynamicRoutePageExtension['properties']['component'];\n};\n\ntype LazyRoutePageProps = { extension: LoadedRoutePageExtension };\n\ntype InactiveRoutePageProps = {\n extension: LoadedRoutePageExtension;\n path: string;\n setActivePerspective: SetActivePerspective;\n};\n\ntype RoutePageProps = {\n path: string;\n extension: LoadedRoutePageExtension;\n activePerspective: string;\n setActivePerspective: SetActivePerspective;\n};\n\ntype UsePluginRoutes = () => [React.ReactElement[], React.ReactElement[]];\n","import * as React from 'react';\nimport { useTranslation, Trans } from 'react-i18next';\nimport { Button } from '@patternfly/react-core';\n\nimport {\n CLUSTER_TELEMETRY_ANALYTICS,\n PREFERRED_TELEMETRY_USER_SETTING_KEY,\n USER_TELEMETRY_ANALYTICS,\n useUserSettings,\n} from '@console/shared';\n\nexport const TelemetryNotifier = () => {\n const { t } = useTranslation();\n\n const [\n currentUserPreferenceTelemetryValue,\n setCurrentUserPreferenceTelemetryValue,\n ] = useUserSettings<USER_TELEMETRY_ANALYTICS>(PREFERRED_TELEMETRY_USER_SETTING_KEY, null, true);\n\n const userResponse = (value: USER_TELEMETRY_ANALYTICS) => {\n setCurrentUserPreferenceTelemetryValue(value);\n };\n\n return (\n <>\n {!currentUserPreferenceTelemetryValue &&\n (window.SERVER_FLAGS.telemetry?.STATE === CLUSTER_TELEMETRY_ANALYTICS.OPTIN ||\n window.SERVER_FLAGS.telemetry?.STATE === CLUSTER_TELEMETRY_ANALYTICS.OPTOUT) && (\n <div className=\"co-global-notifications\" data-test=\"global-notifications\">\n <div className=\"co-global-notification\">\n <div className=\"co-global-telemetry-notification__content\">\n <p className=\"co-global-notification__text\">\n <Trans t={t} ns=\"public\">\n Your feedback is valuable in enhancing our services. To help us improve, we seek\n your consent to collect anonymized telemetry data.{' '}\n <a\n href=\"https://www.redhat.com/en/about/privacy-policy\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Privacy statement\n </a>\n .\n </Trans>\n </p>\n <Button\n variant=\"tertiary\"\n className=\"co-global-telemetry-notification__button\"\n onClick={() => userResponse(USER_TELEMETRY_ANALYTICS.ALLOW)}\n >\n {t('public~Accept')}\n </Button>\n <Button\n variant=\"tertiary\"\n className=\"co-global-telemetry-notification__button\"\n onClick={() => userResponse(USER_TELEMETRY_ANALYTICS.DENY)}\n >\n {t('public~Deny')}\n </Button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n};\n","import * as React from 'react';\nimport * as _ from 'lodash-es';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useTranslation } from 'react-i18next';\nimport { BellIcon } from '@patternfly/react-icons/dist/esm/icons/bell-icon';\nimport { CaretDownIcon } from '@patternfly/react-icons/dist/esm/icons/caret-down-icon';\nimport { EllipsisVIcon } from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';\nimport { PlusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon';\nimport { QuestionCircleIcon } from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';\nimport {\n NotificationBadge,\n Toolbar,\n ToolbarContent,\n ToolbarGroup,\n ToolbarItem,\n} from '@patternfly/react-core';\nimport {\n ApplicationLauncher,\n ApplicationLauncherGroup,\n ApplicationLauncherItem,\n ApplicationLauncherSeparator,\n} from '@patternfly/react-core/deprecated';\nimport { Link } from 'react-router-dom-v5-compat';\nimport {\n ACM_LINK_ID,\n FLAGS,\n useActiveNamespace,\n useCopyCodeModal,\n useCopyLoginCommands,\n useFlag,\n usePerspectiveExtension,\n useTelemetry,\n YellowExclamationTriangleIcon,\n} from '@console/shared';\nimport { formatNamespacedRouteForResource } from '@console/shared/src/utils';\nimport CloudShellMastheadButton from '@console/webterminal-plugin/src/components/cloud-shell/CloudShellMastheadButton';\nimport CloudShellMastheadAction from '@console/webterminal-plugin/src/components/cloud-shell/CloudShellMastheadAction';\nimport { getUser } from '@console/dynamic-plugin-sdk';\nimport * as UIActions from '../actions/ui';\nimport { flagPending, featureReducerName } from '../reducers/features';\nimport { authSvc } from '../module/auth';\nimport { getOCMLink, referenceForModel } from '../module/k8s';\nimport { Firehose } from './utils';\nimport { openshiftHelpBase } from './utils/documentation';\nimport { AboutModal } from './about-modal';\nimport { clusterVersionReference, getReportBugLink } from '../module/k8s/cluster-settings';\nimport * as redhatLogoImg from '../imgs/logos/redhat.svg';\nimport { GuidedTourMastheadTrigger } from '@console/app/src/components/tour';\nimport { ConsoleLinkModel } from '../models';\nimport ClusterMenu from '@console/app/src/components/nav/ClusterMenu';\nimport { ACM_PERSPECTIVE_ID } from '@console/app/src/consts';\nimport { FeedbackModal } from '@patternfly/react-user-feedback';\nimport { useFeedbackLocal } from './feedback-local';\nimport { action as reduxAction } from 'typesafe-actions';\nimport feedbackImage from '@patternfly/react-user-feedback/dist/esm/images/rh_feedback.svg';\n\nconst LAST_CONSOLE_ACTIVITY_TIMESTAMP_LOCAL_STORAGE_KEY = 'last-console-activity-timestamp';\n\nconst defaultHelpLinks = [\n {\n // t('public~Learning Portal')\n label: 'Learning Portal',\n externalLink: true,\n href: 'https://learn.openshift.com/?ref=webconsole',\n },\n {\n // t('public~OpenShift Blog')\n label: 'OpenShift Blog',\n externalLink: true,\n href: 'https://blog.openshift.com',\n },\n];\n\nconst MultiClusterToolbarGroup = () => {\n const acmPerspectiveExtension = usePerspectiveExtension(ACM_PERSPECTIVE_ID);\n return (\n !!acmPerspectiveExtension && (\n <ToolbarGroup spacer={{ default: 'spacerNone' }}>\n <ClusterMenu />\n </ToolbarGroup>\n )\n );\n};\n\nconst FeedbackModalLocalized = ({ isOpen, onClose, reportBugLink }) => {\n const feedbackLocales = useFeedbackLocal(reportBugLink);\n return (\n <FeedbackModal\n onShareFeedback=\"https://console.redhat.com/self-managed-feedback-form?source=openshift\"\n onOpenSupportCase={reportBugLink.href}\n feedbackLocale={feedbackLocales}\n onJoinMailingList=\"https://console.redhat.com/self-managed-research-form?source=openshift\"\n feedbackImg={feedbackImage}\n isOpen={isOpen}\n onClose={onClose}\n />\n );\n};\n\nconst SystemStatusButton = ({ statuspageData }) => {\n const { t } = useTranslation();\n return !_.isEmpty(_.get(statuspageData, 'incidents')) ? (\n <a\n className=\"pf-v5-c-button pf-m-plain\"\n aria-label={t('public~System status')}\n href={statuspageData.page.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <YellowExclamationTriangleIcon className=\"co-masthead-icon\" />\n </a>\n ) : null;\n};\n\n// TODO migrate to TS, break this down into smaller components and hooks\nconst MastheadToolbarContents = ({ consoleLinks, cv, isMastheadStacked }) => {\n const { t } = useTranslation();\n const fireTelemetryEvent = useTelemetry();\n const authEnabledFlag = useFlag(FLAGS.AUTH_ENABLED);\n const consoleCLIDownloadFlag = useFlag(FLAGS.CONSOLE_CLI_DOWNLOAD);\n const openshiftFlag = useFlag(FLAGS.OPENSHIFT);\n const quickstartFlag = useFlag(FLAGS.CONSOLE_QUICKSTART);\n const dispatch = useDispatch();\n const [activeNamespace] = useActiveNamespace();\n const [requestTokenURL, externalLoginCommand] = useCopyLoginCommands();\n const launchCopyLoginCommandModal = useCopyCodeModal(\n t('public~Login with this command'),\n externalLoginCommand,\n );\n const { clusterID, user, alertCount, canAccessNS } = useSelector((state) => ({\n clusterID: state.UI.get('clusterID'),\n user: getUser(state),\n alertCount: state.observe.getIn(['alertCount']),\n canAccessNS: !!state[featureReducerName].get(FLAGS.CAN_GET_NS),\n }));\n const [isAppLauncherDropdownOpen, setIsAppLauncherDropdownOpen] = React.useState(false);\n const [isUserDropdownOpen, setIsUserDropdownOpen] = React.useState(false);\n const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false);\n const [isHelpDropdownOpen, setIsHelpDropdownOpen] = React.useState(false);\n const [statusPageData, setStatusPageData] = React.useState(null);\n const [showAboutModal, setshowAboutModal] = React.useState(false);\n const [isFeedbackModalOpen, setIsFeedbackModalOpen] = React.useState(false);\n const reportBugLink = cv?.data ? getReportBugLink(cv.data, t) : null;\n const userInactivityTimeout = React.useRef(null);\n const username = user?.username ?? '';\n const isKubeAdmin = username === 'kube:admin';\n\n const drawerToggle = React.useCallback(\n () => dispatch(UIActions.notificationDrawerToggleExpanded()),\n [dispatch],\n );\n\n const getImportYAMLPath = () => formatNamespacedRouteForResource('import', activeNamespace);\n const onUserDropdownToggle = (e, isOpen) => setIsUserDropdownOpen(isOpen);\n const onUserDropdownSelect = () => setIsUserDropdownOpen((u) => !u);\n const onKebabDropdownToggle = (e, isOpen) => setIsKebabDropdownOpen(isOpen);\n const onKebabDropdownSelect = () => setIsKebabDropdownOpen((k) => !k);\n const onAppLauncherDropdownToggle = (e, isOpen) => setIsAppLauncherDropdownOpen(isOpen);\n const onAppLauncherDropdownSelect = () => setIsAppLauncherDropdownOpen((a) => !a);\n const onHelpDropdownToggle = (e, isOpen) => setIsHelpDropdownOpen(isOpen);\n const onHelpDropdownSelect = () => setIsHelpDropdownOpen((h) => !h);\n const onFeedbackModal = () => setIsFeedbackModalOpen(true);\n const onAboutModal = (e) => {\n e.preventDefault();\n setshowAboutModal(true);\n };\n\n const closeAboutModal = () => setshowAboutModal(false);\n\n const getAdditionalLinks = (links, type) =>\n _.sortBy(\n // ACM link is being moved to the perspective switcher, so do not show in application launcher\n _.filter(links, (link) => link.spec.location === type && link.metadata.name !== ACM_LINK_ID),\n 'spec.text',\n );\n\n const getSectionLauncherItems = (launcherItems, sectionName) =>\n _.sortBy(\n _.filter(\n launcherItems,\n (link) => _.get(link, 'spec.applicationMenu.section', '') === sectionName,\n ),\n 'spec.text',\n );\n\n const sectionSort = (section) => {\n switch (section.name) {\n case 'Red Hat Applications':\n return 0;\n case 'Third Party Applications':\n return 1;\n case 'Customer Applications':\n return 2;\n case 'Troubleshooting':\n return 3;\n case '':\n return 9; // Items w/o sections go last\n default:\n return 3; // Custom groups come after well-known groups\n }\n };\n\n const getLaunchActions = () => {\n const isTroubleshootingPanelEnabled = Array.isArray(window.SERVER_FLAGS.consolePlugins)\n ? window.SERVER_FLAGS.consolePlugins.includes('troubleshooting-panel-console-plugin')\n : false;\n const launcherItems = getAdditionalLinks(consoleLinks?.data, 'ApplicationMenu');\n\n const sections = [];\n if (\n clusterID &&\n window.SERVER_FLAGS.branding !== 'okd' &&\n window.SERVER_FLAGS.branding !== 'azure'\n ) {\n sections.push({\n name: t('public~Red Hat Applications'),\n isSection: true,\n actions: [\n {\n label: t('public~OpenShift Cluster Manager'),\n externalLink: true,\n href: getOCMLink(clusterID),\n image: <img src={redhatLogoImg} alt=\"\" />,\n callback: () => {\n fireTelemetryEvent('Launcher Menu Accessed', {\n id: 'OpenShift Cluster Manager',\n name: 'OpenShift Cluster Manager',\n });\n },\n },\n {\n label: t('public~Red Hat Hybrid Cloud Console'),\n externalLink: true,\n href: 'https://console.redhat.com',\n image: <img src={redhatLogoImg} alt=\"\" />,\n callback: () => {\n fireTelemetryEvent('Launcher Menu Accessed', {\n id: 'Red Hat Hybrid Cloud Console',\n name: 'Red Hat Hybrid Cloud Console',\n });\n },\n },\n ],\n });\n }\n\n // This should be removed when the extension to add items to the masthead is implemented: https://issues.redhat.com/browse/OU-488\n if (isTroubleshootingPanelEnabled) {\n sections.push({\n name: t('public~Troubleshooting'),\n isSection: true,\n actions: [\n {\n label: t('public~Signal Correlation'),\n component: 'button',\n callback: (e) => {\n e.preventDefault();\n dispatch(reduxAction('openTroubleshootingPanel'));\n fireTelemetryEvent('Launcher Menu Accessed', {\n id: 'Signal Correlation',\n name: 'Signal Correlation',\n });\n },\n },\n ],\n });\n }\n\n _.each(launcherItems, (item) => {\n const sectionName = _.get(item, 'spec.applicationMenu.section', '');\n if (!_.find(sections, { name: sectionName })) {\n sections.push({ name: sectionName, isSection: true, actions: [] });\n }\n });\n\n const sortedSections = _.sortBy(sections, [sectionSort, 'name']);\n\n _.each(sortedSections, (section) => {\n const sectionItems = getSectionLauncherItems(launcherItems, section.name);\n _.each(sectionItems, (item) => {\n section.actions.push({\n label: _.get(item, 'spec.text'),\n externalLink: true,\n href: _.get(item, 'spec.href'),\n image: <img src={_.get(item, 'spec.applicationMenu.imageURL')} alt=\"\" />,\n callback: () => {\n fireTelemetryEvent('Launcher Menu Accessed', {\n id: item.metadata.name,\n name: _.get(item, 'spec.text'),\n });\n },\n });\n });\n });\n\n return sections;\n };\n\n const getHelpActions = (additionalHelpActions) => {\n const helpActions = [];\n const tourRef = React.createRef();\n\n helpActions.push({\n name: '',\n isSection: true,\n actions: [\n ...(quickstartFlag\n ? [\n {\n component: <Link to=\"/quickstart\">{t('public~Quick Starts')}</Link>,\n },\n ]\n : []),\n {\n label: t('public~Documentation'),\n externalLink: true,\n href: openshiftHelpBase,\n callback: () => {\n fireTelemetryEvent('Documentation Clicked');\n },\n },\n ...(consoleCLIDownloadFlag\n ? [\n {\n component: (\n <Link\n onClick={() => {\n fireTelemetryEvent('CLI Clicked');\n }}\n to=\"/command-line-tools\"\n >\n {t('public~Command Line Tools')}\n </Link>\n ),\n },\n ]\n : []),\n {\n component: <GuidedTourMastheadTrigger ref={tourRef} />,\n },\n ...(reportBugLink\n ? [\n {\n label: t('public~Share Feedback'),\n component: 'button',\n callback: (e) => {\n e.preventDefault();\n onFeedbackModal(reportBugLink);\n },\n },\n ]\n : []),\n {\n label: t('public~About'),\n callback: onAboutModal,\n component: 'button',\n },\n ],\n });\n\n // Add default help links to start of additional links from operator\n additionalHelpActions.actions = defaultHelpLinks\n .map((helpLink) => ({\n ...helpLink,\n label: t(`public~${helpLink.label}`),\n }))\n .concat(additionalHelpActions.actions);\n\n if (!_.isEmpty(additionalHelpActions.actions)) {\n helpActions.push(additionalHelpActions);\n }\n\n return helpActions;\n };\n\n const getAdditionalActions = (links) => {\n const actions = _.map(links, (link) => {\n return {\n label: link.spec.text,\n externalLink: true,\n href: link.spec.href,\n };\n });\n\n return {\n name: '',\n isSection: true,\n actions,\n };\n };\n\n const externalProps = (action) =>\n action.externalLink ? { isExternal: true, target: '_blank', rel: 'noopener noreferrer' } : {};\n\n const renderApplicationItems = (actions) =>\n _.map(actions, (action, groupIndex) => {\n if (action.isSection) {\n return (\n <ApplicationLauncherGroup key={groupIndex} label={action.name}>\n {_.map(action.actions, (sectionAction, itemIndex) => {\n return (\n <ApplicationLauncherItem\n key={itemIndex}\n icon={sectionAction.image}\n href={sectionAction.href || '#'}\n onClick={sectionAction.callback}\n component={sectionAction.component}\n data-test={\n sectionAction.dataTest ? sectionAction.dataTest : 'application-launcher-item'\n }\n {...externalProps(sectionAction)}\n >\n {sectionAction.label}\n </ApplicationLauncherItem>\n );\n })}\n <>\n {groupIndex < actions.length - 1 && (\n <ApplicationLauncherSeparator key={`separator-${groupIndex}`} />\n )}\n </>\n </ApplicationLauncherGroup>\n );\n }\n\n return (\n <ApplicationLauncherGroup key={groupIndex}>\n <>\n <ApplicationLauncherItem\n key={action.label}\n icon={action.image}\n href={action.href || '#'}\n onClick={action.callback}\n component={action.component}\n {...externalProps(action)}\n >\n {action.label}\n </ApplicationLauncherItem>\n {groupIndex < actions.length - 1 && (\n <ApplicationLauncherSeparator key={`separator-${groupIndex}`} />\n )}\n </>\n </ApplicationLauncherGroup>\n );\n });\n\n const renderMenu = (mobile) => {\n const additionalUserActions = getAdditionalActions(\n getAdditionalLinks(consoleLinks?.data, 'UserMenu'),\n );\n const helpActions = getHelpActions(\n getAdditionalActions(getAdditionalLinks(consoleLinks?.data, 'HelpMenu')),\n );\n const launchActions = getLaunchActions();\n\n if (flagPending(openshiftFlag) || flagPending(authEnabledFlag)) {\n return null;\n }\n\n const actions = [];\n const userActions = [\n {\n component: <Link to=\"/user-preferences\">{t('public~User Preferences')}</Link>,\n },\n ];\n\n if (authEnabledFlag) {\n const logout = (e) => {\n e.preventDefault();\n authSvc.logout('', isKubeAdmin);\n };\n if (requestTokenURL) {\n userActions.unshift({\n label: t('public~Copy login command'),\n href: requestTokenURL,\n externalLink: true,\n dataTest: 'copy-login-command',\n });\n } else if (externalLoginCommand) {\n userActions.unshift({\n callback: launchCopyLoginCommandModal,\n component: 'button',\n dataTest: 'copy-login-command',\n label: t('public~Copy login command'),\n });\n }\n\n userActions.push({\n label: t('public~Log out'),\n callback: logout,\n component: 'button',\n dataTest: 'log-out',\n });\n }\n\n actions.push({\n name: '',\n isSection: true,\n actions: userActions,\n });\n\n if (!_.isEmpty(additionalUserActions.actions)) {\n actions.unshift(additionalUserActions);\n }\n\n if (mobile) {\n actions.unshift(...helpActions);\n\n actions.unshift({\n name: '',\n isSection: true,\n actions: [\n {\n component: <Link to={getImportYAMLPath()}>{t('public~Import YAML')}</Link>,\n },\n {\n component: <CloudShellMastheadAction />,\n },\n ],\n });\n\n if (!_.isEmpty(launchActions)) {\n actions.unshift(...launchActions);\n }\n\n return (\n <ApplicationLauncher\n aria-label={t('public~Utility menu')}\n className=\"co-app-launcher\"\n onSelect={onKebabDropdownSelect}\n onToggle={onKebabDropdownToggle}\n isOpen={isKebabDropdownOpen}\n items={renderApplicationItems(actions)}\n position=\"right\"\n data-quickstart-id=\"qs-masthead-utilitymenu\"\n toggleIcon={<EllipsisVIcon />}\n isGrouped\n />\n );\n }\n\n const userToggle = (\n <span className=\"pf-v5-c-dropdown__toggle\">\n <span className=\"co-username\" data-test=\"username\">\n {authEnabledFlag ? username : t('public~Auth disabled')}\n </span>\n <CaretDownIcon className=\"pf-c-dropdown__toggle-icon\" />\n </span>\n );\n\n return (\n <ApplicationLauncher\n aria-label={t('public~User menu')}\n data-test=\"user-dropdown\"\n className=\"co-app-launcher co-user-menu\"\n onSelect={onUserDropdownSelect}\n onToggle={onUserDropdownToggle}\n isOpen={isUserDropdownOpen}\n items={renderApplicationItems(actions)}\n data-tour-id=\"tour-user-button\"\n data-quickstart-id=\"qs-masthead-usermenu\"\n position=\"right\"\n toggleIcon={userToggle}\n isGrouped\n />\n );\n };\n\n React.useEffect(() => {\n if (window.SERVER_FLAGS.statuspageID) {\n fetch(`https://${window.SERVER_FLAGS.statuspageID}.statuspage.io/api/v2/summary.json`, {\n headers: { Accept: 'application/json' },\n })\n .then((response) => response.json())\n .then((newStatusPageData) => setStatusPageData(newStatusPageData));\n }\n }, [setStatusPageData]);\n\n const setLastConsoleActivityTimestamp = () =>\n localStorage.setItem(LAST_CONSOLE_ACTIVITY_TIMESTAMP_LOCAL_STORAGE_KEY, Date.now().toString());\n\n const resetInactivityTimeout = React.useCallback(() => {\n setLastConsoleActivityTimestamp();\n clearTimeout(userInactivityTimeout.current);\n userInactivityTimeout.current = setTimeout(() => {\n if (openshiftFlag) {\n authSvc.logoutOpenShift(isKubeAdmin);\n } else {\n authSvc.logout();\n }\n }, window.SERVER_FLAGS.inactivityTimeout * 1000);\n }, [openshiftFlag, isKubeAdmin]);\n\n React.useEffect(() => {\n const onStorageChange = (e) => {\n const { key, oldValue, newValue } = e;\n if (key === LAST_CONSOLE_ACTIVITY_TIMESTAMP_LOCAL_STORAGE_KEY && oldValue < newValue) {\n resetInactivityTimeout();\n }\n };\n // Ignore inactivity-timeout if set to less then 300 seconds\n const inactivityTimeoutEnabled = window.SERVER_FLAGS.inactivityTimeout >= 300;\n if (inactivityTimeoutEnabled) {\n setLastConsoleActivityTimestamp();\n window.addEventListener('storage', onStorageChange);\n window.addEventListener('click', _.throttle(resetInactivityTimeout, 500));\n window.addEventListener('keydown', _.throttle(resetInactivityTimeout, 500));\n resetInactivityTimeout();\n }\n return () => {\n window.removeEventListener('storage', onStorageChange);\n window.removeEventListener('click', resetInactivityTimeout);\n window.removeEventListener('keydown', resetInactivityTimeout);\n clearTimeout(userInactivityTimeout.current);\n };\n }, [resetInactivityTimeout]);\n\n const launchActions = getLaunchActions();\n const alertAccess = canAccessNS && !!window.SERVER_FLAGS.prometheusBaseURL;\n return (\n <>\n <Toolbar isFullHeight isStatic>\n <ToolbarContent>\n <MultiClusterToolbarGroup />\n <ToolbarGroup\n align={{ default: 'alignRight' }}\n spacer={{ default: 'spacerNone' }}\n visibility={{ default: isMastheadStacked ? 'hidden' : 'visible' }}\n >\n <ToolbarItem spacer={{ default: 'spacerNone', lg: 'spacerLg' }}>\n <SystemStatusButton statuspageData={statusPageData} />\n {!_.isEmpty(launchActions) && (\n <ApplicationLauncher\n aria-label={t('public~Application launcher')}\n className=\"co-app-launcher\"\n data-test-id=\"application-launcher\"\n onSelect={onAppLauncherDropdownSelect}\n onToggle={onAppLauncherDropdownToggle}\n isOpen={isAppLauncherDropdownOpen}\n items={renderApplicationItems(launchActions)}\n data-quickstart-id=\"qs-masthead-applications\"\n position=\"right\"\n isGrouped\n />\n )}\n {alertAccess && (\n <NotificationBadge\n aria-label={t('public~Notification drawer')}\n onClick={drawerToggle}\n variant=\"read\"\n count={alertCount || 0}\n data-quickstart-id=\"qs-masthead-notifications\"\n >\n <BellIcon alt=\"\" />\n </NotificationBadge>\n )}\n <Link\n to={getImportYAMLPath()}\n className=\"pf-v5-c-button pf-m-plain\"\n aria-label={t('public~Import YAML')}\n data-quickstart-id=\"qs-masthead-import\"\n data-test=\"import-yaml\"\n >\n <PlusCircleIcon className=\"co-masthead-icon\" alt=\"\" />\n </Link>\n <CloudShellMastheadButton />\n <ApplicationLauncher\n aria-label={t('public~Help menu')}\n className=\"co-app-launcher\"\n data-test=\"help-dropdown-toggle\"\n data-tour-id=\"tour-help-button\"\n data-quickstart-id=\"qs-masthead-help\"\n onSelect={onHelpDropdownSelect}\n onToggle={onHelpDropdownToggle}\n isOpen={isHelpDropdownOpen}\n items={renderApplicationItems(\n getHelpActions(\n getAdditionalActions(getAdditionalLinks(consoleLinks?.data, 'HelpMenu')),\n ),\n )}\n position=\"right\"\n toggleIcon={<QuestionCircleIcon className=\"co-masthead-icon\" alt=\"\" />}\n isGrouped\n />\n </ToolbarItem>\n <ToolbarItem>{renderMenu(false)}</ToolbarItem>\n </ToolbarGroup>\n <ToolbarGroup\n align={{ default: 'alignRight' }}\n spacer={{ default: 'spacerNone' }}\n visibility={{ default: isMastheadStacked ? 'visible' : 'hidden' }}\n >\n <SystemStatusButton statuspageData={statusPageData} />\n {alertAccess && alertCount > 0 && (\n <NotificationBadge\n aria-label={t('public~Notification drawer')}\n onClick={drawerToggle}\n variant=\"read\"\n count={alertCount}\n data-quickstart-id=\"qs-masthead-notifications\"\n >\n <BellIcon />\n </NotificationBadge>\n )}\n <ToolbarItem>{renderMenu(true)}</ToolbarItem>\n </ToolbarGroup>\n </ToolbarContent>\n </Toolbar>\n <AboutModal isOpen={showAboutModal} closeAboutModal={closeAboutModal} />\n {reportBugLink ? (\n <FeedbackModalLocalized\n reportBugLink={reportBugLink}\n isOpen={isFeedbackModalOpen}\n onClose={() => setIsFeedbackModalOpen(false)}\n />\n ) : null}\n </>\n );\n};\n\nexport const MastheadToolbar = ({ isMastheadStacked }) => {\n const clusterVersionFlag = useFlag(FLAGS.CLUSTER_VERSION);\n const consoleLinkFlag = useFlag(FLAGS.CONSOLE_LINK);\n const resources = [];\n if (clusterVersionFlag) {\n resources.push({\n kind: clusterVersionReference,\n name: 'version',\n isList: false,\n prop: 'cv',\n });\n }\n if (consoleLinkFlag) {\n resources.push({\n kind: referenceForModel(ConsoleLinkModel),\n isList: true,\n prop: 'consoleLinks',\n });\n }\n\n return (\n <Firehose resources={resources}>\n <MastheadToolbarContents isMastheadStacked={isMastheadStacked} />\n </Firehose>\n );\n};\n","import * as React from 'react';\nimport { Button } from '@patternfly/react-core';\nimport { TerminalIcon } from '@patternfly/react-icons/dist/esm/icons/terminal-icon';\nimport { useTranslation } from 'react-i18next';\nimport { connect } from 'react-redux';\nimport { RootState } from '@console/internal/redux';\nimport { useTelemetry } from '@console/shared/src/hooks/useTelemetry';\nimport { toggleCloudShellExpanded } from '../../redux/actions/cloud-shell-actions';\nimport { isCloudShellExpanded } from '../../redux/reducers/cloud-shell-selectors';\nimport useCloudShellAvailable from './useCloudShellAvailable';\n\ntype DispatchProps = {\n onClick: () => void;\n};\n\ntype StateProps = {\n open?: boolean;\n};\n\ntype Props = StateProps & DispatchProps;\n\nconst ClouldShellMastheadButton: React.FC<Props> = ({ onClick, open }) => {\n const terminalAvailable = useCloudShellAvailable();\n const fireTelemetryEvent = useTelemetry();\n\n const { t } = useTranslation();\n\n if (!terminalAvailable) {\n return null;\n }\n\n const openCloudshell = () => {\n onClick();\n fireTelemetryEvent('Web Terminal Initiated');\n };\n\n return (\n <Button\n variant=\"plain\"\n aria-label={t('webterminal-plugin~Command line terminal')}\n onClick={openCloudshell}\n className={open ? 'pf-m-selected' : undefined}\n data-tour-id=\"tour-cloud-shell-button\"\n data-quickstart-id=\"qs-masthead-cloudshell\"\n >\n <TerminalIcon className=\"co-masthead-icon\" />\n </Button>\n );\n};\n\nconst stateToProps = (state: RootState): StateProps => ({\n open: isCloudShellExpanded(state),\n});\n\nconst dispatchToProps = (dispatch): DispatchProps => ({\n onClick: () => dispatch(toggleCloudShellExpanded()),\n});\n\nexport default connect<StateProps, DispatchProps>(\n stateToProps,\n dispatchToProps,\n)(ClouldShellMastheadButton);\n","import * as React from 'react';\nimport { CheckIcon } from '@patternfly/react-icons/dist/esm/icons/check-icon';\nimport { useTranslation } from 'react-i18next';\nimport { connect } from 'react-redux';\nimport { RootState } from '@console/internal/redux';\nimport { toggleCloudShellExpanded } from '../../redux/actions/cloud-shell-actions';\nimport { isCloudShellExpanded } from '../../redux/reducers/cloud-shell-selectors';\nimport useCloudShellAvailable from './useCloudShellAvailable';\n\ntype DispatchProps = {\n onClick: () => void;\n};\n\ntype StateProps = {\n open?: boolean;\n};\n\ntype Props = StateProps & DispatchProps & { className?: string };\n\nconst ClouldShellMastheadAction: React.FC<Props> = ({ onClick, className, open }) => {\n const terminalAvailable = useCloudShellAvailable();\n const { t } = useTranslation();\n if (!terminalAvailable) {\n return null;\n }\n return (\n <button\n className={className}\n type=\"button\"\n onClick={onClick}\n data-tour-id=\"tour-cloud-shell-button\"\n data-quickstart-id=\"qs-masthead-cloudshell\"\n >\n {t('webterminal-plugin~OpenShift command line')}\n {open ? (\n <span\n style={{\n marginLeft: 'auto',\n color: 'var(--pf-v5-global--active-color--100)',\n fontSize: 'var(--pf-v5-global--FontSize--xs)',\n paddingLeft: 'var(--pf-v5-global--spacer--md)',\n }}\n >\n <CheckIcon />\n </span>\n ) : null}\n </button>\n );\n};\n\nconst stateToProps = (state: RootState): StateProps => ({\n open: isCloudShellExpanded(state),\n});\n\nconst dispatchToProps = (dispatch): DispatchProps => ({\n onClick: () => dispatch(toggleCloudShellExpanded()),\n});\n\nexport default connect<StateProps, DispatchProps>(\n stateToProps,\n dispatchToProps,\n)(ClouldShellMastheadAction);\n","import * as React from 'react';\nimport {\n Alert,\n AboutModal as PfAboutModal,\n TextContent,\n TextList,\n TextListItem,\n} from '@patternfly/react-core';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { useClusterVersion, BlueArrowCircleUpIcon, useCanClusterUpgrade } from '@console/shared';\nimport { isLoadedDynamicPluginInfo } from '@console/plugin-sdk/src';\nimport { useDynamicPluginInfo } from '@console/plugin-sdk/src/api/useDynamicPluginInfo';\nimport { getBrandingDetails } from './masthead';\nimport {\n ReleaseNotesLink,\n ServiceLevel,\n useServiceLevelTitle,\n ServiceLevelText,\n ServiceLevelLoading,\n} from './utils';\nimport { k8sVersion } from '../module/status';\nimport {\n getClusterID,\n getCurrentVersion,\n getK8sGitVersion,\n getOpenShiftVersion,\n hasAvailableUpdates,\n} from '../module/k8s/cluster-settings';\n\nconst DynamicPlugins: React.FC = () => {\n const { t } = useTranslation();\n const [pluginInfoEntries] = useDynamicPluginInfo();\n const [items, setItems] = React.useState([]);\n\n React.useEffect(() => {\n const loadedPlugins = pluginInfoEntries.filter(isLoadedDynamicPluginInfo);\n const sortedLoadedPlugins = loadedPlugins.sort((a, b) =>\n a.metadata.name.localeCompare(b.metadata.name),\n );\n\n setItems(\n sortedLoadedPlugins?.map((plugin) => {\n return (\n <TextListItem\n key={plugin.pluginID}\n >{`${plugin.metadata.name} (${plugin.metadata.version})`}</TextListItem>\n );\n }),\n );\n }, [pluginInfoEntries]);\n\n return items.length > 0 ? (\n <TextList className=\"co-text-list-plain\">{items}</TextList>\n ) : (\n t('public~None')\n );\n};\n\nconst AboutModalItems: React.FC<AboutModalItemsProps> = ({ closeAboutModal }) => {\n const [kubernetesVersion, setKubernetesVersion] = React.useState('');\n const { t } = useTranslation();\n React.useEffect(() => {\n k8sVersion()\n .then((response) => setKubernetesVersion(getK8sGitVersion(response) || '-'))\n .catch(() => setKubernetesVersion(t('public~unknown')));\n }, [t]);\n const clusterVersion = useClusterVersion();\n const canUpgrade = useCanClusterUpgrade();\n const serviceLevelTitle = useServiceLevelTitle();\n\n const clusterID = getClusterID(clusterVersion);\n const channel: string = clusterVersion?.spec?.channel;\n const openshiftVersion = getOpenShiftVersion(clusterVersion);\n\n return (\n <>\n {canUpgrade && hasAvailableUpdates(clusterVersion) && (\n <Alert\n className=\"co-alert co-about-modal__alert\"\n title={\n <Trans t={t} ns=\"public\">\n Cluster update available.{' '}\n <Link to=\"/settings/cluster?showVersions\" onClick={closeAboutModal}>\n Update cluster\n </Link>\n </Trans>\n }\n customIcon={<BlueArrowCircleUpIcon />}\n />\n )}\n <TextContent>\n <TextList component=\"dl\">\n {openshiftVersion && (\n <>\n <TextListItem component=\"dt\">{t('public~OpenShift version')}</TextListItem>\n <TextListItem component=\"dd\">\n <div className=\"co-select-to-copy\">{openshiftVersion}</div>\n <ReleaseNotesLink version={getCurrentVersion(clusterVersion)} />\n </TextListItem>\n </>\n )}\n <TextListItem component=\"dt\">{t('public~Kubernetes version')}</TextListItem>\n <TextListItem component=\"dd\" className=\"co-select-to-copy\">\n {kubernetesVersion}\n </TextListItem>\n {channel && (\n <>\n <TextListItem component=\"dt\">{t('public~Channel')}</TextListItem>\n <TextListItem component=\"dd\" className=\"co-select-to-copy\">\n {channel}\n </TextListItem>\n </>\n )}\n {clusterID && (\n <>\n <TextListItem component=\"dt\">{t('public~Cluster ID')}</TextListItem>\n <TextListItem component=\"dd\" className=\"co-select-to-copy\">\n {clusterID}\n </TextListItem>\n </>\n )}\n <TextListItem component=\"dt\">{t('public~API server')}</TextListItem>\n <TextListItem component=\"dd\" className=\"co-select-to-copy\">\n {window.SERVER_FLAGS.kubeAPIServerURL}\n </TextListItem>\n\n <ServiceLevel\n clusterID={clusterID}\n loading={\n <>\n <TextListItem component=\"dt\">{serviceLevelTitle}</TextListItem>\n <TextListItem component=\"dd\">\n <ServiceLevelLoading />\n </TextListItem>\n </>\n }\n >\n <>\n <TextListItem component=\"dt\">{serviceLevelTitle}</TextListItem>\n <TextListItem component=\"dd\" className=\"co-select-to-copy\">\n <ServiceLevelText inline clusterID={clusterID} />\n </TextListItem>\n </>\n </ServiceLevel>\n\n <TextListItem component=\"dt\">{t('public~Dynamic plugins')}</TextListItem>\n <TextListItem component=\"dd\">\n <DynamicPlugins />\n </TextListItem>\n </TextList>\n </TextContent>\n </>\n );\n};\nAboutModalItems.displayName = 'AboutModalItems';\n\nexport const AboutModal: React.FC<AboutModalProps> = (props) => {\n const { isOpen, closeAboutModal } = props;\n const { t } = useTranslation();\n const details = getBrandingDetails();\n const customBranding = window.SERVER_FLAGS.customLogoURL || window.SERVER_FLAGS.customProductName;\n return (\n <PfAboutModal\n isOpen={isOpen}\n onClose={closeAboutModal}\n productName=\"\"\n brandImageSrc={details.logoImg}\n brandImageAlt={details.productName}\n hasNoContentContainer\n aria-label=\"About modal\"\n >\n {!customBranding && (\n <p>\n {t(\n \"public~OpenShift is Red Hat's container application platform that allows developers to quickly develop, host, and scale applications in a cloud environment.\",\n )}\n </p>\n )}\n <AboutModalItems {...(props as any)} />\n </PfAboutModal>\n );\n};\nAboutModal.displayName = 'AboutModal';\n\ntype AboutModalItemsProps = {\n closeAboutModal: () => void;\n};\n\ntype AboutModalProps = {\n isOpen: boolean;\n closeAboutModal: () => void;\n};\n","import { k8sBasePath } from './k8s/k8s';\nimport { coFetchJSON } from '../co-fetch';\n\nexport const k8sVersion = () => coFetchJSON(`${k8sBasePath}/version`);\n","import { FeatureState } from '@console/internal/reducers/features';\nimport { Step } from './type';\n\n/**\n * filter utils\n */\n\nexport const filterTourBasedonPermissionAndFlag = (steps: Step[], flags: FeatureState): Step[] =>\n steps.reduce((acc: Step[], step: Step) => {\n const { flags: stepFlags, access, selector } = step;\n if (stepFlags && stepFlags.filter((flag) => !flags[flag]).length > 0) return acc;\n if (access && !access()) return acc;\n // if the access and flag both check passes but the element is not present in the dom\n if (selector && !document.querySelector(selector)) return acc;\n acc.push(step);\n return acc;\n }, [] as Step[]);\n","import * as React from 'react';\nimport { ModalVariant } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { Popover, PopoverPlacement, Modal, Spotlight } from '@console/shared';\nimport StepBadge from './steps/StepBadge';\nimport StepContent from './steps/StepContent';\nimport StepFooter from './steps/StepFooter';\nimport StepHeader from './steps/StepHeader';\nimport './TourStepComponent.scss';\n\ntype TourStepComponentProps = {\n selector?: string;\n placement?: string;\n heading: string;\n content: React.ReactNode;\n showClose?: boolean;\n step?: number;\n totalSteps?: number;\n showStepBadge?: boolean;\n nextButtonText?: string;\n backButtonText?: string;\n onNext?: () => void;\n onBack?: () => void;\n onClose?: () => void;\n};\n\nconst TourStepComponent: React.FC<TourStepComponentProps> = ({\n placement,\n heading,\n content,\n selector,\n showStepBadge,\n showClose,\n step,\n totalSteps,\n nextButtonText,\n backButtonText,\n onNext,\n onBack,\n onClose,\n}) => {\n const { t } = useTranslation();\n const header = <StepHeader>{heading}</StepHeader>;\n const footer = (\n <StepFooter\n primaryButton={{\n name: nextButtonText,\n onClick: () => {\n onNext && onNext();\n },\n }}\n secondaryButton={{\n name: backButtonText,\n onClick: () => {\n onBack && onBack();\n },\n }}\n >\n {showStepBadge ? <StepBadge stepNumber={step} totalSteps={totalSteps} /> : null}\n </StepFooter>\n );\n const stepContent = <StepContent>{content}</StepContent>;\n const handleClose = () => {\n onClose && onClose();\n };\n return selector ? (\n <>\n <Spotlight selector={selector} />\n <Popover\n placement={placement as PopoverPlacement}\n headerContent={header}\n footerContent={footer}\n open\n onClose={handleClose}\n trigger={selector}\n uniqueId={step.toString()}\n id=\"guided-tour-popover\"\n >\n {stepContent}\n </Popover>\n </>\n ) : (\n <Modal\n className=\"co-tour-step-component\"\n variant={ModalVariant.small}\n showClose={showClose}\n isOpen\n header={header}\n footer={footer}\n onClose={handleClose}\n id=\"guided-tour-modal\"\n data-test=\"guided-tour-modal\"\n aria-label={t('console-app~guided tour {{step, number}}', { step })}\n isFullScreen\n >\n {stepContent}\n </Modal>\n );\n};\n\nexport default TourStepComponent;\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport './StepBadge.scss';\n\ntype StepBadgeProps = {\n stepNumber: number;\n totalSteps: number;\n};\n\nconst StepBadge: React.FC<StepBadgeProps> = ({ stepNumber, totalSteps }) => {\n const { t } = useTranslation();\n return (\n <span className=\"co-step-badge\">\n {t('console-app~Step {{stepNumber, number}}/{{totalSteps, number}}', {\n stepNumber,\n totalSteps,\n })}\n </span>\n );\n};\n\nexport default StepBadge;\n","import * as React from 'react';\nimport { StepContentType } from '../type';\nimport './StepContent.scss';\n\ntype StepContentProps = {\n children: StepContentType;\n};\n\nconst StepContent: React.FC<StepContentProps> = ({ children }) => (\n <div className=\"co-step-content\">{children}</div>\n);\n\nexport default StepContent;\n","import * as React from 'react';\nimport { Flex, FlexItem, Button } from '@patternfly/react-core';\n\ntype StepFooterProps = {\n primaryButton: {\n name: string;\n onClick: () => void;\n };\n secondaryButton: {\n name: string;\n onClick: () => void;\n };\n children?: React.ReactNode;\n};\n\nconst StepFooter: React.FC<StepFooterProps> = ({\n children,\n primaryButton: { name: primaryButton, onClick: primaryButtonCallback },\n secondaryButton: { name: secondaryButton, onClick: secondaryButtonCallback },\n}) => (\n <Flex>\n {children && <FlexItem>{children}</FlexItem>}\n <FlexItem align={{ default: 'alignRight' }}>\n <Button\n variant=\"secondary\"\n id=\"tour-step-footer-secondary\"\n data-test=\"tour-step-footer-secondary\"\n onClick={secondaryButtonCallback}\n >\n {secondaryButton}\n </Button>\n </FlexItem>\n <FlexItem>\n <Button\n variant=\"primary\"\n id=\"tour-step-footer-primary\"\n data-test=\"tour-step-footer-primary\"\n onClick={primaryButtonCallback}\n >\n {primaryButton}\n </Button>\n </FlexItem>\n </Flex>\n);\n\nexport default StepFooter;\n","import * as React from 'react';\nimport './StepHeader.scss';\n\ntype StepHeaderProps = {\n children: string;\n};\n\nconst StepHeader: React.FC<StepHeaderProps> = ({ children }) => (\n <b className=\"co-step-header\">{children}</b>\n);\n\nexport default StepHeader;\n","import * as React from 'react';\nimport { Menu, MenuContent, MenuItem, MenuList } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { useActivePerspective } from '@console/dynamic-plugin-sdk';\nimport { usePerspectiveExtension } from '@console/shared';\nimport { ACM_PERSPECTIVE_ID } from '../../consts';\nimport ClusterMenuToggle from './ClusterMenuToggle';\n\nconst ClusterGroup: React.FC<{\n clusters: ClusterMenuItem[];\n}> = ({ clusters }) => {\n const [activePerspective] = useActivePerspective();\n\n return clusters.length === 0 ? null : (\n <MenuList>\n {clusters.map((cluster) => (\n <MenuItem\n data-test-id=\"cluster-dropdown-item\"\n key={cluster.key}\n itemId={cluster.key}\n isSelected={\n activePerspective === ACM_PERSPECTIVE_ID\n ? cluster.key === ACM_PERSPECTIVE_ID\n : cluster.key === 'local-cluster'\n }\n onClick={(e) => {\n e.preventDefault();\n cluster.onClick();\n }}\n >\n {cluster.title}\n </MenuItem>\n ))}\n </MenuList>\n );\n};\n\nconst ClusterMenu = () => {\n const { t } = useTranslation();\n const menuRef = React.useRef(null);\n const [activePerspective, setActivePerspective] = useActivePerspective();\n const acmPerspectiveExtension = usePerspectiveExtension(ACM_PERSPECTIVE_ID);\n const [selection, setSelection] = React.useState('local-cluster');\n const [dropdownOpen, setDropdownOpen] = React.useState(false);\n\n const onLocalClusterClick = React.useCallback((): void => {\n setActivePerspective('admin');\n setSelection('local-cluster');\n setDropdownOpen(false);\n }, [setActivePerspective]);\n\n const onAllClustersClick = React.useCallback(() => {\n setActivePerspective(ACM_PERSPECTIVE_ID);\n setSelection(ACM_PERSPECTIVE_ID);\n setDropdownOpen(false);\n }, [setActivePerspective]);\n\n const items = React.useMemo<ClusterMenuItem[]>(\n () => [\n ...(acmPerspectiveExtension\n ? [\n {\n key: ACM_PERSPECTIVE_ID,\n title: t('console-app~All Clusters'),\n onClick: onAllClustersClick,\n },\n ]\n : []),\n {\n key: 'local-cluster',\n title: t('console-app~local-cluster'),\n onClick: () => onLocalClusterClick(),\n },\n ],\n [t, acmPerspectiveExtension, onAllClustersClick, onLocalClusterClick],\n );\n\n const clusterMenu: JSX.Element = (\n <Menu ref={menuRef} isScrollable activeItemId={selection} className=\"co-cluster-menu\">\n <MenuContent maxMenuHeight=\"60vh\">\n <ClusterGroup clusters={items} />\n </MenuContent>\n </Menu>\n );\n\n return (\n <ClusterMenuToggle\n disabled={false}\n menu={clusterMenu}\n menuRef={menuRef}\n isOpen={dropdownOpen}\n onToggle={setDropdownOpen}\n title={\n activePerspective === ACM_PERSPECTIVE_ID ? t('console-app~All Clusters') : 'local-cluster'\n }\n />\n );\n};\n\ntype ClusterMenuItem = {\n key: string;\n title: string;\n onClick: () => void;\n};\n\nexport default ClusterMenu;\n","import * as React from 'react';\nimport { MenuToggle, Popper, ToolbarItem } from '@patternfly/react-core';\n\nconst ClusterMenuToggle = (props: {\n disabled: boolean;\n menu: React.ReactElement;\n menuRef: React.RefObject<HTMLElement>;\n isOpen: boolean;\n title: string | JSX.Element;\n onToggle: (state: boolean) => void;\n}) => {\n const { disabled, menu, isOpen, menuRef, onToggle, title } = props;\n\n const toggleRef = React.useRef(null);\n\n const handleMenuKeys = (event) => {\n if (menuRef.current) {\n if (event.key === 'Escape') {\n onToggle(false);\n toggleRef.current.focus();\n }\n if (!menuRef.current?.contains(event.target) && event.key === 'Tab') {\n onToggle(false);\n }\n }\n };\n\n const handleMenuClick = (event) => {\n if (\n menuRef.current &&\n !menuRef.current?.contains(event.target) &&\n !toggleRef.current.contains(event.target)\n ) {\n onToggle(false);\n }\n };\n\n React.useEffect(() => {\n window.addEventListener('keyup', handleMenuKeys);\n window.addEventListener('click', handleMenuClick);\n return () => {\n window.removeEventListener('keyup', handleMenuKeys);\n window.removeEventListener('click', handleMenuClick);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // This needs to be run only on component mount/unmount\n\n const menuToggle = (\n <MenuToggle\n ref={toggleRef}\n onClick={() => onToggle(!isOpen)}\n isExpanded={isOpen}\n variant=\"plainText\"\n isFullHeight\n disabled={disabled}\n className=\"co-cluster-selector\"\n data-test-id=\"cluster-dropdown-toggle\"\n >\n {title}\n </MenuToggle>\n );\n\n return (\n <ToolbarItem>\n <Popper\n trigger={menuToggle}\n popper={menu}\n direction=\"down\"\n position=\"left\"\n appendTo={() => document.body}\n isVisible={isOpen}\n enableFlip={false}\n />\n </ToolbarItem>\n );\n};\n\nexport default ClusterMenuToggle;\n","import { useTranslation } from 'react-i18next';\n\nexport function useFeedbackLocal(reportBug) {\n const { t } = useTranslation();\n\n return {\n getSupport: reportBug.description,\n back: t('public~Back'),\n bugReported: t('public~Bug Reported'),\n cancel: t('public~Cancel'),\n close: t('public~Close'),\n describeBug: t(\n 'public~Describe the bug you encountered. For urgent issues, open a support case instead.',\n ),\n describeBugUrgentCases: t(\n 'public~Describe the bug you encountered. For urgent issues, open a support case instead.',\n ),\n describeReportBug: t(\n 'public~Describe the bug you encountered. Include where it is located and what action caused it. If this issue is urgent or blocking your workflow,',\n ),\n directInfluence:\n 'public~your feedback will directly influence the future of Red Hat’s products. Opt in below to hear about future research opportunities via email.',\n email: t('public~Email'),\n enterFeedback: t('public~Enter your feedback'),\n feedback: t('public~Feedback'),\n feedbackSent: t('public~Feedback Sent'),\n helpUsImproveHCC: t('public~Help us improve Red Hat OpenShift.'),\n howIsConsoleExperience: t('public~What has your experience been like so far?'),\n joinMailingList: t('public~Join mailing list'),\n informDirectionDescription: t(\n 'public~By participating in feedback sessions, usability tests, and interviews with our',\n ),\n informDirection: t('public~Inform the direction of Red Hat'),\n learnAboutResearchOpportunities: t(\n 'public~Learn about opportunities to share your feedback with our User Research Team.',\n ),\n openSupportCase: reportBug.label,\n problemProcessingRequest: t(\n 'public~There was a problem processing the request. Try reloading the page. If the problem persists, contact',\n ),\n redHatSupport: t('public~Red Hat support'),\n reportABug: t('public~Report a bug'),\n responseSent: t('public~Response sent'),\n researchOpportunities: t('public~Yes, I would like to hear about research opportunities'),\n shareFeedback: t('public~Share feedback'),\n shareYourFeedback: t('public~Share your feedback with us!'),\n somethingWentWrong: t('public~Something went wrong'),\n submitFeedback: t('\"Submit feedback'),\n teamWillReviewBug: t(\n 'public~We appreciate your feedback and our team will review your report shortly',\n ),\n tellAboutExperience: t('public~Tell us about your experience'),\n thankYouForFeedback: t('public~Thank you, we appreciate your feedback.'),\n thankYouForInterest: t(\n 'public~Thank you for your interest in user research. You have been added to our mailing list.',\n ),\n userResearchTeam: t('public~User Research Team'),\n weNeverSharePersonalInformation: t(\n 'public~We never share your personal information, and you can opt out at any time.',\n ),\n };\n}\n","module.exports = __webpack_public_path__ + \"assets/public/imgs/okd-logo.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/openshift-online-logo.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/openshift-dedicated-logo.svg\";","module.exports = __webpack_public_path__ + \"assets/public/imgs/openshift-service-on-aws-logo.svg\";","import * as React from 'react';\nimport { Nav, NavProps, PageSidebar, PageSidebarBody } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport NavHeader from './NavHeader';\nimport PerspectiveNav from './PerspectiveNav';\n\ntype NavigationProps = {\n onNavSelect: NavProps['onSelect'];\n onPerspectiveSelected: () => void;\n isNavOpen: boolean;\n};\n\nexport const Navigation: React.FC<NavigationProps> = React.memo(function Navigation({\n isNavOpen,\n onNavSelect,\n onPerspectiveSelected,\n}) {\n const { t } = useTranslation();\n return (\n <PageSidebar isSidebarOpen={isNavOpen} theme=\"dark\">\n <PageSidebarBody>\n <Nav aria-label={t('console-app~Nav')} onSelect={onNavSelect} theme=\"dark\">\n <NavHeader onPerspectiveSelected={onPerspectiveSelected} />\n <PerspectiveNav />\n </Nav>\n </PageSidebarBody>\n </PageSidebar>\n );\n});\n","import * as React from 'react';\nimport { Title } from '@patternfly/react-core';\nimport {\n Dropdown as DropdownDeprecated,\n DropdownItem as DropdownItemDeprecated,\n DropdownToggle as DropdownToggleDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { CaretDownIcon } from '@patternfly/react-icons/dist/esm/icons/caret-down-icon';\nimport * as cx from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport { Perspective, useActivePerspective } from '@console/dynamic-plugin-sdk';\nimport { useK8sWatchResource } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sWatchResource';\nimport * as acmIcon from '@console/internal/imgs/ACM-icon.svg';\nimport { ConsoleLinkModel } from '@console/internal/models';\nimport { K8sResourceKind, referenceForModel } from '@console/internal/module/k8s';\nimport { ACM_LINK_ID, usePerspectiveExtension, usePerspectives } from '@console/shared';\nimport { ACM_PERSPECTIVE_ID } from '../../consts';\nimport './NavHeader.scss';\n\nexport type NavHeaderProps = {\n onPerspectiveSelected: () => void;\n selected?: string;\n};\n\ntype PerspectiveDropdownItemProps = {\n perspective: Perspective;\n activePerspective: string;\n onClick: (perspective: string) => void;\n};\n\nconst PerspectiveDropdownItem: React.FC<PerspectiveDropdownItemProps> = ({\n perspective,\n onClick,\n}) => {\n const LazyIcon = React.useMemo(() => React.lazy(perspective.properties.icon), [\n perspective.properties.icon,\n ]);\n return (\n <DropdownItemDeprecated\n key={perspective.properties.id}\n onClick={(e: React.MouseEvent<HTMLLinkElement>) => {\n e.preventDefault();\n onClick(perspective.properties.id);\n }}\n icon={\n <React.Suspense fallback={<> </>}>\n <LazyIcon />\n </React.Suspense>\n }\n >\n <Title headingLevel=\"h2\" size=\"md\" data-test-id=\"perspective-switcher-menu-option\">\n {perspective.properties.name}\n </Title>\n </DropdownItemDeprecated>\n );\n};\n\nconst NavHeader: React.FC<NavHeaderProps> = ({ onPerspectiveSelected }) => {\n const { t } = useTranslation();\n const [activePerspective, setActivePerspective] = useActivePerspective();\n const [isPerspectiveDropdownOpen, setPerspectiveDropdownOpen] = React.useState(false);\n const perspectiveExtensions = usePerspectives();\n const acmPerspectiveExtension = usePerspectiveExtension(ACM_PERSPECTIVE_ID);\n const [consoleLinks] = useK8sWatchResource<K8sResourceKind[]>({\n isList: true,\n kind: referenceForModel(ConsoleLinkModel),\n optional: true,\n });\n\n const togglePerspectiveOpen = React.useCallback(() => {\n setPerspectiveDropdownOpen((isOpen) => !isOpen);\n }, []);\n\n const acmLink = React.useMemo(\n () =>\n consoleLinks.find(\n (link: K8sResourceKind) =>\n link.spec.location === 'ApplicationMenu' && link.metadata.name === ACM_LINK_ID,\n ),\n [consoleLinks],\n );\n\n const onPerspectiveSelect = React.useCallback(\n (perspective: string): void => {\n setActivePerspective(perspective);\n setPerspectiveDropdownOpen(false);\n onPerspectiveSelected?.();\n },\n [onPerspectiveSelected, setActivePerspective],\n );\n\n const perspectiveItems = perspectiveExtensions.reduce(\n (acc, perspective) =>\n perspective.uid === acmPerspectiveExtension?.uid\n ? acc\n : [\n ...acc,\n <PerspectiveDropdownItem\n key={perspective.uid}\n perspective={perspective}\n activePerspective={activePerspective}\n onClick={onPerspectiveSelect}\n />,\n ],\n [],\n );\n\n const { icon, name } = React.useMemo(\n () =>\n perspectiveExtensions.find((p) => p?.properties?.id === activePerspective)?.properties ??\n perspectiveExtensions[0]?.properties ?? { icon: null, name: null },\n [activePerspective, perspectiveExtensions],\n );\n\n const LazyIcon = React.useMemo(() => icon && React.lazy(icon), [icon]);\n const perspectiveDropdownItems = [\n ...perspectiveItems,\n ...(!acmPerspectiveExtension && acmLink\n ? [\n <DropdownItemDeprecated\n key={ACM_LINK_ID}\n onClick={() => {\n window.location.href = acmLink.spec.href;\n }}\n >\n <Title headingLevel=\"h2\" size=\"md\" data-test-id=\"perspective-switcher-menu-option\">\n <span className=\"oc-nav-header__icon\">\n <img src={acmIcon} height=\"12em\" width=\"12em\" alt=\"\" />\n </span>\n {t('console-app~Advanced Cluster Management')}\n </Title>\n </DropdownItemDeprecated>,\n ]\n : []),\n ];\n\n return (\n <>\n {activePerspective !== ACM_PERSPECTIVE_ID && (\n <div\n className=\"oc-nav-header\"\n data-tour-id=\"tour-perspective-dropdown\"\n data-quickstart-id=\"qs-perspective-switcher\"\n >\n <DropdownDeprecated\n isOpen={isPerspectiveDropdownOpen}\n toggle={\n <DropdownToggleDeprecated\n className={cx({\n 'oc-nav-header__dropdown-toggle--is-empty': perspectiveItems.length === 1,\n })}\n isOpen={isPerspectiveDropdownOpen}\n onToggle={() => (perspectiveItems.length === 1 ? null : togglePerspectiveOpen())}\n toggleIndicator={perspectiveItems.length === 1 ? null : CaretDownIcon}\n data-test-id=\"perspective-switcher-toggle\"\n icon={<LazyIcon />}\n >\n {name && (\n <Title headingLevel=\"h2\" size=\"md\">\n {name}\n </Title>\n )}\n </DropdownToggleDeprecated>\n }\n dropdownItems={perspectiveDropdownItems}\n data-test-id=\"perspective-switcher-menu\"\n />\n </div>\n )}\n </>\n );\n};\n\nexport default NavHeader;\n","module.exports = __webpack_public_path__ + \"assets/public/imgs/ACM-icon.svg\";","import * as React from 'react';\nimport { NavGroup, NavList } from '@patternfly/react-core';\nimport * as classNames from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport {\n useActivePerspective,\n isNavSection,\n isNavItem,\n} from '@console/dynamic-plugin-sdk/src/lib-core';\nimport withDragDropContext from '@console/internal/components/utils/drag-drop-context';\nimport { modelFor } from '@console/internal/module/k8s';\nimport { usePinnedResources } from '@console/shared';\nimport PinnedResource from './PinnedResource';\nimport { PluginNavItem } from './PluginNavItem';\nimport { useNavExtensionsForPerspective } from './useNavExtensionForPerspective';\nimport { getSortedNavExtensions, isTopLevelNavItem } from './utils';\n\nimport './PerspectiveNav.scss';\n\nconst PerspectiveNav: React.FC<{}> = () => {\n const [activePerspective] = useActivePerspective();\n const allNavExtensions = useNavExtensionsForPerspective(activePerspective);\n const [pinnedResources, setPinnedResources, pinnedResourcesLoaded] = usePinnedResources();\n const [validPinnedResources, setValidPinnedResources] = React.useState<string[]>([]);\n const [isDragged, setIsDragged] = React.useState(false);\n const { t } = useTranslation();\n\n React.useEffect(() => {\n const validResources = pinnedResources.filter((res) => !!modelFor(res));\n setValidPinnedResources(validResources);\n }, [setValidPinnedResources, pinnedResources]);\n\n const orderedNavExtensions = React.useMemo(() => {\n const topLevelNavExtensions = allNavExtensions.filter(isTopLevelNavItem);\n return getSortedNavExtensions(topLevelNavExtensions);\n }, [allNavExtensions]);\n\n const getPinnedItems = (): React.ReactElement[] =>\n validPinnedResources.map((resource, idx) => (\n <PinnedResource\n key={`${resource}_${idx.toString()}`}\n idx={idx}\n resourceRef={resource}\n onChange={setPinnedResources}\n onReorder={setValidPinnedResources}\n onDrag={setIsDragged}\n navResources={validPinnedResources}\n draggable={validPinnedResources.length > 1}\n />\n ));\n\n const NavGroupWithDnd = withDragDropContext(() => (\n <NavGroup\n title=\"\"\n aria-label={t('console-app~Pinned resources')}\n className={classNames('no-title', { 'oc-perspective-nav--dragging': isDragged })}\n >\n {getPinnedItems()}\n </NavGroup>\n ));\n\n // We have to use NavList if there is at least one extension that will render an <li>, but we\n // can't use NavList if there are no extensions that render an <li>\n const hasListItem = orderedNavExtensions.some(\n (item) => (isNavSection(item) && item.properties.name) || isNavItem(item),\n );\n\n const content = (\n <>\n {orderedNavExtensions.map((extension) => (\n <PluginNavItem key={extension.uid} extension={extension} />\n ))}\n {pinnedResourcesLoaded && validPinnedResources?.length > 0 ? <NavGroupWithDnd /> : null}\n </>\n );\n\n return hasListItem ? (\n <NavList\n className=\"oc-perspective-nav\"\n title=\"\"\n aria-label={t('console-app~Main navigation')}\n data-test-id={`${activePerspective}-perspective-nav`}\n >\n {content}\n </NavList>\n ) : (\n <div className=\"oc-perspective-nav\" data-test-id={`${activePerspective}-perspective-nav`}>\n {content}\n </div>\n );\n};\n\nexport default PerspectiveNav;\n","import * as React from 'react';\nimport { Button } from '@patternfly/react-core';\nimport { GripVerticalIcon } from '@patternfly/react-icons/dist/esm/icons/grip-vertical-icon';\nimport { MinusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/minus-circle-icon';\nimport * as classNames from 'classnames';\nimport { debounce } from 'lodash';\nimport { useDrag, useDrop } from 'react-dnd';\nimport { useTranslation } from 'react-i18next';\nimport { K8sModel, modelFor } from '@console/internal/module/k8s';\nimport { useK8sModel } from '@console/shared/src/hooks/useK8sModel';\nimport confirmNavUnpinModal from './confirmNavUnpinModal';\nimport './PinnedResource.scss';\nimport { NavItemResource } from './NavItemResource';\n\ntype PinnedResourceProps = {\n resourceRef?: string;\n navResources?: string[];\n onChange?: (pinnedResources: string[]) => void;\n idx?: number;\n draggable?: boolean;\n onReorder?: (pinnedResources: string[]) => void;\n onDrag?: (dragging: boolean) => void;\n};\n\ntype DraggableButtonProps = {\n dragRef?: (node) => void | null;\n};\n\ntype RemoveButtonProps = {\n resourceRef?: string;\n navResources?: string[];\n onChange?: (pinnedResources: string[]) => void;\n};\n\nexport type DragItem = {\n idx: number;\n id: string;\n type: string;\n};\n\nconst DraggableButton: React.FC<DraggableButtonProps> = ({ dragRef }) => {\n const { t } = useTranslation();\n return (\n <Button\n ref={dragRef}\n className=\"oc-pinned-resource__drag-button\"\n variant=\"link\"\n type=\"button\"\n aria-label={t('console-app~Drag to reorder')}\n >\n <GripVerticalIcon className=\"oc-pinned-resource__drag-icon\" />\n </Button>\n );\n};\n\nconst RemoveButton: React.FC<RemoveButtonProps> = ({ resourceRef, navResources, onChange }) => {\n const { t } = useTranslation();\n const unPin = (e: React.MouseEvent<HTMLButtonElement>, navItem: string) => {\n e.preventDefault();\n e.stopPropagation();\n confirmNavUnpinModal(navItem, navResources, onChange);\n };\n return (\n <Button\n className=\"oc-pinned-resource__unpin-button\"\n variant=\"link\"\n aria-label={t('console-app~Unpin')}\n onClick={(e) => unPin(e, resourceRef)}\n >\n <MinusCircleIcon className=\"oc-pinned-resource__delete-icon\" />\n </Button>\n );\n};\n\nconst reorder = (list: string[], startIndex: number, destIndex: number) => {\n const result = [...list];\n const [removed] = result.splice(startIndex, 1);\n result.splice(destIndex, 0, removed);\n return result;\n};\n\nconst PinnedResource: React.FC<PinnedResourceProps> = ({\n resourceRef,\n onChange,\n navResources,\n idx,\n draggable,\n onReorder,\n onDrag,\n}) => {\n const { t } = useTranslation();\n const [, drag, preview] = useDrag({\n item: { type: 'NavItem', id: `NavItem-${idx}`, idx },\n end: (item, monitor) => {\n const didDrop = monitor.didDrop();\n if (!didDrop) {\n onDrag(false);\n }\n },\n });\n\n const [{ isOver }, drop] = useDrop({\n accept: 'NavItem',\n collect: (monitor) => ({\n isOver: monitor.isOver(),\n }),\n hover: debounce((item: DragItem) => {\n if (item.idx === idx) {\n return;\n }\n onReorder(reorder(navResources, item.idx, idx));\n // monitor item updated here to avoid expensive index searches.\n item.idx = idx;\n onDrag(true);\n }, 10),\n drop() {\n onChange(navResources); // update user-settings when the resource is dropped\n onDrag(false);\n },\n });\n\n const [model] = useK8sModel(resourceRef);\n if (!model) {\n return null;\n }\n const { apiVersion, apiGroup, namespaced, kind } = model;\n\n const getLabelForResourceRef = (resourceName: string): string => {\n const resourceModel: K8sModel | undefined = modelFor(resourceName);\n if (resourceModel) {\n if (resourceModel.labelPluralKey) {\n return t(resourceModel.labelPluralKey);\n }\n return resourceModel.labelPlural || resourceModel.plural;\n }\n return '';\n };\n const label = getLabelForResourceRef(resourceRef);\n const duplicates = navResources.filter((res) => getLabelForResourceRef(res) === label).length > 1;\n const previewRef = draggable ? (node: React.ReactElement) => preview(drop(node)) : null;\n return (\n <NavItemResource\n key={`pinned-${resourceRef}`}\n namespaced={namespaced}\n title={duplicates ? `${label}: ${apiGroup || 'core'}/${apiVersion}` : null}\n model={{ group: apiGroup, version: apiVersion, kind }}\n id={resourceRef}\n dragRef={previewRef}\n dataAttributes={{\n 'data-test': draggable ? 'draggable-pinned-resource-item' : 'pinned-resource-item',\n }}\n className={classNames('oc-pinned-resource', {\n 'oc-pinned-resource--dragging': draggable && isOver,\n })}\n >\n {draggable ? <DraggableButton dragRef={drag} /> : null}\n {label}\n <RemoveButton onChange={onChange} navResources={navResources} resourceRef={resourceRef} />\n </NavItemResource>\n );\n};\n\nexport default PinnedResource;\n","import * as React from 'react';\nimport { NavItemSeparator } from '@patternfly/react-core';\nimport {\n isNavSection,\n isSeparator,\n NavExtension,\n isHrefNavItem,\n isResourceNSNavItem,\n isResourceNavItem,\n} from '@console/dynamic-plugin-sdk';\nimport { LoadedExtension } from '@console/dynamic-plugin-sdk/src/types';\nimport { NavItemHref } from './NavItemHref';\nimport { NavItemResource } from './NavItemResource';\nimport { NavSection } from './NavSection';\n\nexport const PluginNavItem: React.FC<PluginNavItemProps> = ({ extension }) => {\n if (isNavSection(extension)) {\n return (\n <NavSection\n id={extension.properties.id}\n name={extension.properties.name}\n dataAttributes={extension.properties.dataAttributes}\n />\n );\n }\n if (isSeparator(extension)) {\n return <NavItemSeparator key={extension.uid} {...extension.properties.dataAttributes} />;\n }\n if (isHrefNavItem(extension)) {\n return (\n <NavItemHref\n href={extension.properties.href}\n namespaced={extension.properties.namespaced}\n prefixNamespaced={extension.properties.prefixNamespaced}\n startsWith={extension.properties.startsWith}\n dataAttributes={extension.properties.dataAttributes}\n >\n {extension.properties.name}\n </NavItemHref>\n );\n }\n if (isResourceNavItem(extension)) {\n return (\n <NavItemResource\n namespaced={isResourceNSNavItem(extension)}\n model={extension.properties.model}\n startsWith={extension.properties.startsWith}\n dataAttributes={extension.properties.dataAttributes}\n >\n {extension.properties.name}\n </NavItemResource>\n );\n }\n // eslint-disable-next-line no-console\n console.warn('Invalid or unrecognized navigation extension:', extension);\n return null;\n};\n\nexport type PluginNavItemProps = {\n extension: LoadedExtension<NavExtension>;\n};\n","import * as React from 'react';\nimport { NavExpandable, NavGroup, NavItemSeparator } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport {\n NavExtension,\n isHrefNavItem,\n isResourceNavItem,\n isSeparator,\n K8sModel,\n ResourceNavItem,\n isResourceNSNavItem,\n} from '@console/dynamic-plugin-sdk';\nimport { LoadedExtension } from '@console/dynamic-plugin-sdk/src/types';\nimport { referenceForExtensionModel } from '@console/internal/module/k8s';\nimport { useK8sModels } from '@console/shared/src/hooks/useK8sModels';\nimport { useLocation } from '@console/shared/src/hooks/useLocation';\nimport { NavItemHref } from './NavItemHref';\nimport { NavItemResource } from './NavItemResource';\nimport { useNavExtensionsForSection } from './useNavExtensionsForSection';\nimport { navItemHrefIsActive, navItemResourceIsActive } from './utils';\n\nexport const NavSection: React.FC<NavSectionProps> = ({ id, name, dataAttributes }) => {\n const { t } = useTranslation();\n const location = useLocation();\n const [k8sModels] = useK8sModels();\n const navExtensions = useNavExtensionsForSection(id);\n const [isOpen, setIsOpen] = React.useState(false);\n\n const getK8sModelForExtension = React.useCallback(\n (e: LoadedExtension<ResourceNavItem>): K8sModel => {\n const { model } = e.properties;\n const gvk = referenceForExtensionModel(model);\n return k8sModels?.[gvk] ?? k8sModels[e?.properties?.model?.kind ?? ''];\n },\n [k8sModels],\n );\n\n const navExtensionIsActive = React.useCallback(\n (e: LoadedExtension<NavExtension>) => {\n if (isHrefNavItem(e)) {\n return navItemHrefIsActive(location, e.properties.href, e.properties.startsWith);\n }\n if (isResourceNavItem(e)) {\n const k8sModel = getK8sModelForExtension(e);\n return navItemResourceIsActive(location, k8sModel, e.properties.startsWith);\n }\n return false;\n },\n [getK8sModelForExtension, location],\n );\n const isActive = React.useMemo(() => navExtensions.some(navExtensionIsActive), [\n navExtensions,\n navExtensionIsActive,\n ]);\n const hasChildren = navExtensions?.length > 0;\n\n // Section is empty\n if (!hasChildren) {\n return null;\n }\n\n const children = navExtensions.map((extension) => {\n if (isSeparator(extension)) {\n return <NavItemSeparator key={extension.uid} {...extension.properties.dataAttributes} />;\n }\n if (isHrefNavItem(extension)) {\n return (\n <NavItemHref\n key={extension.uid}\n href={extension.properties.href}\n namespaced={extension.properties.namespaced}\n prefixNamespaced={extension.properties.prefixNamespaced}\n startsWith={extension.properties.startsWith}\n dataAttributes={extension.properties.dataAttributes}\n >\n {extension.properties.name}\n </NavItemHref>\n );\n }\n if (isResourceNavItem(extension)) {\n return (\n <NavItemResource\n key={extension.uid}\n namespaced={isResourceNSNavItem(extension)}\n model={extension.properties.model}\n startsWith={extension.properties.startsWith}\n dataAttributes={extension.properties.dataAttributes}\n >\n {extension.properties.name}\n </NavItemResource>\n );\n }\n return null;\n });\n\n if (!name) {\n return (\n <NavGroup\n title=\"\"\n className=\"no-title\"\n aria-label={t('console-app~Navigation')}\n {...dataAttributes}\n >\n {children}\n </NavGroup>\n );\n }\n\n return (\n <NavExpandable\n title={name}\n isActive={isActive}\n isExpanded={isOpen}\n onExpand={(e, expandedState) => setIsOpen(expandedState)}\n data-test=\"nav\"\n buttonProps={dataAttributes}\n >\n {children}\n </NavExpandable>\n );\n};\n\ntype NavSectionProps = {\n id: string;\n name: string;\n dataAttributes?: { [key: string]: string };\n};\n","import * as React from 'react';\nimport { useActivePerspective, NavExtension } from '@console/dynamic-plugin-sdk/src/lib-core';\nimport { LoadedExtension } from '@console/dynamic-plugin-sdk/src/types';\nimport { useNavExtensionsForPerspective } from './useNavExtensionForPerspective';\nimport { getSortedNavExtensions } from './utils';\n\nexport const useNavExtensionsForSection = (section: string): LoadedExtension<NavExtension>[] => {\n const [activePerspective] = useActivePerspective();\n const extensions = useNavExtensionsForPerspective(activePerspective);\n const isExtensionForSection = React.useCallback(\n (extension) => section === extension.properties.section,\n [section],\n );\n return React.useMemo(() => {\n const filtered = extensions.filter(isExtensionForSection);\n return getSortedNavExtensions(filtered);\n }, [extensions, isExtensionForSection]);\n};\n","import * as React from 'react';\nimport { connect } from 'react-redux';\nimport { connectToFlags, WithFlagsProps } from '@console/internal/reducers/connectToFlags';\nimport { RootState } from '@console/internal/redux';\nimport { FLAG_DEVWORKSPACE } from '../../const';\nimport { toggleCloudShellExpanded } from '../../redux/actions/cloud-shell-actions';\nimport { isCloudShellExpanded } from '../../redux/reducers/cloud-shell-selectors';\nimport CloudShellDrawer from './CloudShellDrawer';\nimport MultiTabTerminal from './MultiTabbedTerminal';\n\ntype StateProps = {\n open: boolean;\n};\n\ntype DispatchProps = {\n onClose: () => void;\n};\n\ntype CloudShellProps = WithFlagsProps & StateProps & DispatchProps;\n\nconst CloudShell: React.FC<CloudShellProps> = ({ flags, open, onClose }) => {\n if (!flags[FLAG_DEVWORKSPACE]) {\n return null;\n }\n return open ? (\n <CloudShellDrawer onClose={onClose}>\n <MultiTabTerminal onClose={onClose} />\n </CloudShellDrawer>\n ) : null;\n};\n\nconst stateToProps = (state: RootState): StateProps => ({\n open: isCloudShellExpanded(state),\n});\n\nconst dispatchToProps = (dispatch): DispatchProps => ({\n onClose: () => dispatch(toggleCloudShellExpanded()),\n});\n\nexport default connect<StateProps, DispatchProps>(\n stateToProps,\n dispatchToProps,\n)(connectToFlags(FLAG_DEVWORKSPACE)(CloudShell));\n","import * as React from 'react';\nimport { Tooltip, Flex, FlexItem, Button } from '@patternfly/react-core';\nimport { ExternalLinkAltIcon } from '@patternfly/react-icons/dist/esm/icons/external-link-alt-icon';\nimport { useTranslation } from 'react-i18next';\nimport CloseButton from '@console/shared/src/components/close-button';\nimport Drawer from '@console/shared/src/components/drawer/Drawer';\nimport { useTelemetry } from '@console/shared/src/hooks/useTelemetry';\nimport MinimizeRestoreButton from './MinimizeRestoreButton';\n\nimport './CloudShellDrawer.scss';\n\ntype CloudShellDrawerProps = {\n onClose: () => void;\n};\n\nconst getMastheadHeight = (): number => {\n const masthead = document.getElementById('page-main-header');\n if (!masthead) return 0;\n const { height } = masthead.getBoundingClientRect();\n return height;\n};\n\nconst CloudShellDrawer: React.FC<CloudShellDrawerProps> = ({ children, onClose }) => {\n const [expanded, setExpanded] = React.useState<boolean>(true);\n const { t } = useTranslation();\n const fireTelemetryEvent = useTelemetry();\n\n const onMRButtonClick = (expandedState: boolean) => {\n setExpanded(!expandedState);\n fireTelemetryEvent('Web Terminal Minimized', {\n minimized: expandedState,\n });\n };\n const handleChange = (openState: boolean) => {\n setExpanded(openState);\n };\n const header = (\n <Flex style={{ flexGrow: 1 }} data-test=\"cloudshell-drawer-header\">\n <FlexItem className=\"co-cloud-shell-drawer__heading\">\n {t('webterminal-plugin~OpenShift command line terminal')}\n </FlexItem>\n <FlexItem align={{ default: 'alignRight' }}>\n <Tooltip content={t('webterminal-plugin~Open terminal in new tab')}>\n <Button\n variant=\"plain\"\n component=\"a\"\n href=\"/terminal\"\n target=\"_blank\"\n aria-label={t('webterminal-plugin~Open terminal in new tab')}\n >\n <ExternalLinkAltIcon />\n </Button>\n </Tooltip>\n <MinimizeRestoreButton\n minimize={expanded}\n minimizeText={t('webterminal-plugin~Minimize terminal')}\n restoreText={t('webterminal-plugin~Restore terminal')}\n onClick={onMRButtonClick}\n />\n <Tooltip content={t('webterminal-plugin~Close terminal')}>\n <CloseButton\n ariaLabel={t('webterminal-plugin~Close terminal')}\n onClick={onClose}\n data-test=\"cloudshell-drawer-close-button\"\n />\n </Tooltip>\n </FlexItem>\n </Flex>\n );\n return (\n <Drawer\n open={expanded}\n defaultHeight={385}\n header={header}\n maxHeight={`calc(100vh - ${getMastheadHeight()}px)`}\n onChange={handleChange}\n resizable\n >\n <div className=\"co-cloud-shell-drawer__body\">{children}</div>\n </Drawer>\n );\n};\n\nexport default CloudShellDrawer;\n","import * as React from 'react';\nimport { Tooltip, Button } from '@patternfly/react-core';\nimport { OutlinedWindowMinimizeIcon } from '@patternfly/react-icons/dist/esm/icons/outlined-window-minimize-icon';\nimport { OutlinedWindowRestoreIcon } from '@patternfly/react-icons/dist/esm/icons/outlined-window-restore-icon';\n\ntype MinimizeRestoreButtonProps = {\n minimizeText: string;\n restoreText: string;\n minimize?: boolean;\n onClick: (minimized: boolean) => void;\n};\n\nconst MinimizeRestoreButton: React.FC<MinimizeRestoreButtonProps> = ({\n minimizeText,\n restoreText,\n minimize = true,\n onClick,\n}) => {\n const onMinimize = () => {\n onClick(true);\n };\n const onRestore = () => {\n onClick(false);\n };\n return (\n <Tooltip\n key={minimize ? 'btn-minmize' : 'btn-restore'}\n content={minimize ? minimizeText : restoreText}\n >\n <Button\n variant=\"plain\"\n type=\"button\"\n onClick={minimize ? onMinimize : onRestore}\n aria-label={minimize ? minimizeText : restoreText}\n isInline\n >\n {minimize ? <OutlinedWindowMinimizeIcon /> : <OutlinedWindowRestoreIcon />}\n </Button>\n </Tooltip>\n );\n};\n\nexport default MinimizeRestoreButton;\n","export * from './Tabs';\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { connect } from 'react-redux';\nimport { getUser } from '@console/dynamic-plugin-sdk';\nimport { useAccessReview2 } from '@console/internal/components/utils/rbac';\nimport { StatusBox, LoadError } from '@console/internal/components/utils/status-box';\nimport { UserInfo } from '@console/internal/module/k8s';\nimport { RootState } from '@console/internal/redux';\nimport {\n useFlag,\n withUserSettingsCompatibility,\n WithUserSettingsCompatibilityProps,\n} from '@console/shared';\nimport { v1alpha1WorkspaceModel, WorkspaceModel } from '../../../models';\nimport { FLAG_V1ALPHA2DEVWORKSPACE } from '../../const';\nimport {\n TerminalInitData,\n initTerminal,\n startWorkspace,\n CLOUD_SHELL_PHASE,\n} from './cloud-shell-utils';\nimport CloudshellExec from './CloudShellExec';\nimport { CLOUD_SHELL_NAMESPACE, CLOUD_SHELL_NAMESPACE_CONFIG_STORAGE_KEY } from './const';\nimport CloudShellAdminSetup from './setup/CloudShellAdminSetup';\nimport CloudShellDeveloperSetup from './setup/CloudShellDeveloperSetup';\nimport TerminalLoadingBox from './TerminalLoadingBox';\nimport useCloudShellNamespace from './useCloudShellNamespace';\nimport useCloudShellWorkspace from './useCloudShellWorkspace';\n\nimport './CloudShellTerminal.scss';\n\ntype StateProps = {\n user: UserInfo;\n};\n\ntype Props = {\n onCancel?: () => void;\n terminalNumber?: number;\n setWorkspaceName?: (name: string, terminalNumber: number) => void;\n setWorkspaceNamespace?: (namespace: string, terminalNumber: number) => void;\n};\n\ntype CloudShellTerminalProps = StateProps & Props;\n\nconst CloudShellTerminal: React.FC<\n CloudShellTerminalProps & WithUserSettingsCompatibilityProps<string>\n> = ({\n user,\n onCancel,\n userSettingState: namespace,\n setUserSettingState: setNamespace,\n terminalNumber,\n setWorkspaceName,\n setWorkspaceNamespace,\n}) => {\n const [operatorNamespace, namespaceLoadError] = useCloudShellNamespace();\n const [initData, setInitData] = React.useState<TerminalInitData>();\n const [initError, setInitError] = React.useState<string>();\n const [isAdmin, isAdminCheckLoading] = useAccessReview2({\n namespace: 'openshift-terminal',\n verb: 'create',\n resource: 'pods',\n });\n const isv1Alpha2Available = useFlag(FLAG_V1ALPHA2DEVWORKSPACE);\n const workspaceModel = !isv1Alpha2Available ? v1alpha1WorkspaceModel : WorkspaceModel;\n const [workspace, loaded, loadError] = useCloudShellWorkspace(\n user,\n isAdmin,\n workspaceModel,\n namespace,\n );\n\n const workspacePhase = workspace?.status?.phase;\n const workspaceName = workspace?.metadata?.name;\n const workspaceNamespace = workspace?.metadata?.namespace;\n const workspaceId = workspace?.metadata?.uid;\n\n terminalNumber &&\n workspaceName &&\n setWorkspaceName &&\n setWorkspaceName(workspaceName, terminalNumber);\n\n terminalNumber &&\n workspaceNamespace &&\n setWorkspaceNamespace &&\n setWorkspaceNamespace(workspaceNamespace, terminalNumber);\n\n const username = user?.username;\n\n const { t } = useTranslation();\n\n const unrecoverableErrorFound = !operatorNamespace && namespaceLoadError;\n\n // wait until the web terminal is loaded.\n // if the namespace has any problems loading then set the terminal into an unrecoverable state\n React.useEffect(() => {\n if (namespaceLoadError) {\n setInitError(namespaceLoadError);\n }\n }, [namespaceLoadError]);\n\n // start the workspace if no unrecoverable errors were found\n React.useEffect(() => {\n if (\n operatorNamespace &&\n !unrecoverableErrorFound &&\n workspace?.spec &&\n !workspace.spec.started\n ) {\n startWorkspace(workspace);\n }\n // Run this effect if the workspace name or namespace changes.\n // This effect should only be run once per workspace.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n operatorNamespace,\n unrecoverableErrorFound,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n workspace?.metadata?.name,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n workspace?.metadata?.namespace,\n ]);\n\n // save the namespace once the workspace has loaded\n React.useEffect(() => {\n if (loaded && !loadError) {\n // workspace may be undefined which is ok\n setNamespace(workspaceNamespace);\n }\n }, [loaded, loadError, workspaceNamespace, setNamespace]);\n\n // clear the init data and error if the workspace changes and if the loading process isn't in an unrecoverable state\n React.useEffect(() => {\n if (!unrecoverableErrorFound) {\n setInitData(undefined);\n setInitError(undefined);\n }\n }, [unrecoverableErrorFound, username, workspaceName, workspaceNamespace]);\n\n // initialize the terminal once it is Running\n React.useEffect(() => {\n let unmounted = false;\n const defaultError = t(\n 'webterminal-plugin~Failed to connect to your OpenShift command line terminal',\n );\n\n if (workspacePhase === CLOUD_SHELL_PHASE.RUNNING) {\n initTerminal(username, workspaceName, workspaceNamespace)\n .then((res: TerminalInitData) => {\n if (!unmounted) setInitData(res);\n })\n .catch((e) => {\n if (!unmounted) {\n if (e?.response?.headers?.get('Content-Type')?.startsWith('text/plain')) {\n // eslint-disable-next-line promise/no-nesting\n e.response\n .text()\n .then((text) => {\n setInitError(text);\n })\n .catch(() => {\n setInitError(defaultError);\n });\n } else {\n setInitError(defaultError);\n }\n }\n });\n }\n if (workspacePhase === CLOUD_SHELL_PHASE.FAILED) {\n setInitError(defaultError);\n }\n\n if (workspacePhase === CLOUD_SHELL_PHASE.STARTING) {\n setInitError(null);\n }\n\n return () => {\n unmounted = true;\n };\n }, [username, workspaceName, workspaceNamespace, workspacePhase, t, terminalNumber]);\n\n // failed to load the workspace\n if (loadError) {\n return (\n <StatusBox\n loaded={loaded}\n loadError={loadError}\n label={t('webterminal-plugin~OpenShift command line terminal')}\n />\n );\n }\n\n // failed to init the terminal\n if (initError) {\n return (\n <LoadError\n message={initError}\n label={t('webterminal-plugin~OpenShift command line terminal')}\n />\n );\n }\n\n // loading the workspace resource\n if (!loaded || isAdminCheckLoading || !operatorNamespace) {\n return <TerminalLoadingBox message=\"\" />;\n }\n\n // waiting for the workspace to start and initialize the terminal\n if (workspaceName && !initData) {\n return (\n <div className=\"co-cloudshell-terminal__container\">\n <TerminalLoadingBox />\n </div>\n );\n }\n\n if (initData && workspaceNamespace) {\n return (\n <CloudshellExec\n workspaceName={workspaceName}\n namespace={workspaceNamespace}\n workspaceId={workspaceId}\n container={initData.container}\n podname={initData.pod}\n shcommand={initData.cmd || []}\n workspaceModel={workspaceModel}\n />\n );\n }\n\n if (isAdmin) {\n return (\n <CloudShellAdminSetup\n workspaceModel={workspaceModel}\n onCancel={onCancel}\n onSubmit={(ns: string) => {\n setNamespace(ns);\n }}\n operatorNamespace={operatorNamespace}\n />\n );\n }\n\n // show the form to let the user create a new workspace\n return (\n <CloudShellDeveloperSetup\n workspaceModel={workspaceModel}\n onCancel={onCancel}\n onSubmit={(ns: string) => {\n setNamespace(ns);\n }}\n operatorNamespace={operatorNamespace}\n />\n );\n};\n\n// For testing\nexport const InternalCloudShellTerminal = CloudShellTerminal;\n\nconst stateToProps = (state: RootState): StateProps => ({\n user: getUser(state),\n});\n\nexport default connect<StateProps, null, Props>(stateToProps)(\n withUserSettingsCompatibility<\n CloudShellTerminalProps & WithUserSettingsCompatibilityProps<string>,\n string\n >(\n CLOUD_SHELL_NAMESPACE_CONFIG_STORAGE_KEY,\n CLOUD_SHELL_NAMESPACE,\n )(CloudShellTerminal),\n);\n","import * as React from 'react';\nimport { Button, EmptyState, EmptyStateBody, EmptyStateFooter } from '@patternfly/react-core';\nimport { Base64 } from 'js-base64';\nimport { useTranslation } from 'react-i18next';\nimport { connect, Dispatch } from 'react-redux';\nimport { impersonateStateToProps } from '@console/dynamic-plugin-sdk';\nimport { PodModel } from '@console/internal/models';\nimport { resourceURL, K8sKind } from '@console/internal/module/k8s';\nimport { WSFactory } from '@console/internal/module/ws-factory';\nimport { connectToFlags, WithFlagsProps } from '@console/internal/reducers/connectToFlags';\nimport { FLAGS, useTelemetry } from '@console/shared';\nimport { setCloudShellActive } from '../../redux/actions/cloud-shell-actions';\nimport {\n getCloudShellCR,\n CLOUD_SHELL_STOPPED_BY_ANNOTATION,\n startWorkspace,\n CloudShellResource,\n} from './cloud-shell-utils';\nimport ExecuteCommand from './ExecuteCommand';\nimport Terminal, { ImperativeTerminalType } from './Terminal';\nimport TerminalLoadingBox from './TerminalLoadingBox';\nimport './CloudShellExec.scss';\n\n// pod exec WS protocol is FD prefixed, base64 encoded data (sometimes json stringified)\n\n// Channel 0 is STDIN, 1 is STDOUT, 2 is STDERR (if TTY is not requested), and 3 is a special error channel - 4 is C&C\n// The server only reads from STDIN, writes to the other three.\n// see also: https://github.com/kubernetes/kubernetes/pull/13885\n\ntype Props = {\n workspaceName: string;\n workspaceId: string;\n container: string;\n podname: string;\n namespace: string;\n shcommand?: string[];\n workspaceModel: K8sKind;\n};\n\ntype StateProps = {\n impersonate?: {\n subprotocols: string[];\n };\n};\n\ntype DispatchProps = {\n onActivate: (active: boolean) => void;\n};\n\nexport type CloudShellExecProps = Props & DispatchProps & StateProps & WithFlagsProps;\n\nconst NO_SH =\n 'starting container process caused \"exec: \\\\\"sh\\\\\": executable file not found in $PATH\"';\n\nconst CloudShellExec: React.FC<CloudShellExecProps> = ({\n workspaceName,\n workspaceId,\n container,\n podname,\n namespace,\n shcommand,\n flags,\n impersonate,\n workspaceModel,\n onActivate,\n}) => {\n const fireTelemetryEvent = useTelemetry();\n const [wsOpen, setWsOpen] = React.useState<boolean>(false);\n const [wsError, setWsError] = React.useState<string>();\n const [wsReopening, setWsReopening] = React.useState<boolean>(false);\n const [customResource, setCustomResource] = React.useState<CloudShellResource>();\n const ws = React.useRef<WSFactory>();\n const terminal = React.useRef<ImperativeTerminalType>();\n const { t } = useTranslation();\n\n const onData = (data: string): void => {\n ws.current?.send(`0${Base64.encode(data)}`);\n fireTelemetryEvent('Web Terminal Command Issued', { sessionId: workspaceId });\n };\n\n const handleResize = React.useCallback((cols: number, rows: number) => {\n const data = Base64.encode(JSON.stringify({ Height: rows, Width: cols }));\n ws.current?.send(`4${data}`);\n }, []);\n\n const onCommand = React.useCallback((command: string): void => {\n ws.current?.send(`0${Base64.encode(`${command}\\n`)}`);\n }, []);\n\n React.useEffect(() => {\n onActivate(true);\n return () => {\n onActivate(false);\n };\n }, [onActivate]);\n\n React.useEffect(() => {\n let unmounted: boolean;\n const usedClient = flags[FLAGS.OPENSHIFT] ? 'oc' : 'kubectl';\n const cmd = shcommand || ['sh', '-i', '-c', 'TERM=xterm sh'];\n const subprotocols = (impersonate?.subprotocols || []).concat('base64.channel.k8s.io');\n\n const urlOpts = {\n ns: namespace,\n name: podname,\n path: 'exec',\n queryParams: {\n stdout: '1',\n stdin: '1',\n stderr: '1',\n tty: '1',\n container,\n command: cmd.map((c) => encodeURIComponent(c)).join('&command='),\n },\n };\n\n const path = resourceURL(PodModel, urlOpts);\n const wsOpts = {\n host: 'auto',\n reconnect: true,\n jsonParse: false,\n path,\n subprotocols,\n };\n\n const websocket: WSFactory = new WSFactory(`${podname}-terminal`, wsOpts);\n let previous;\n\n websocket\n .onmessage((msg) => {\n const currentTerminal = terminal.current;\n // error channel\n if (msg[0] === '3') {\n if (previous.includes(NO_SH)) {\n const errMsg = `This container doesn't have a /bin/sh shell. Try specifying your command in a terminal with:\\r\\n\\r\\n ${usedClient} -n ${namespace} exec ${podname} -ti <command>`;\n currentTerminal && currentTerminal.reset();\n currentTerminal && currentTerminal.onConnectionClosed(errMsg);\n websocket.destroy();\n previous = '';\n return;\n }\n }\n const data = Base64.decode(msg.slice(1));\n currentTerminal && currentTerminal.onDataReceived(data);\n previous = data;\n })\n .onopen(() => {\n const currentTerminal = terminal.current;\n currentTerminal && currentTerminal.reset();\n previous = '';\n if (!unmounted) setWsOpen(true);\n })\n .onclose((evt) => {\n if (!evt || evt.wasClean === true) {\n return;\n }\n\n setWsOpen(false);\n\n // Check the Cloud Shell to see if it has any hints as to why the terminal connection was closed\n const cloudShellCR = getCloudShellCR(workspaceModel, workspaceName, namespace);\n let stoppedByError;\n cloudShellCR\n .then((cr) => {\n const stopReason = cr.metadata.annotations[CLOUD_SHELL_STOPPED_BY_ANNOTATION];\n if (stopReason) {\n stoppedByError = t(\n 'webterminal-plugin~The terminal connection has closed due to {{reason}}.',\n { reason: stopReason },\n );\n }\n setCustomResource(cr);\n })\n .catch((err) => {\n stoppedByError = err;\n })\n .finally(() => {\n const error =\n evt.reason ||\n stoppedByError ||\n t('webterminal-plugin~The terminal connection has closed.');\n const currentTerminal = terminal.current;\n currentTerminal && currentTerminal.onConnectionClosed(error);\n websocket.destroy();\n fireTelemetryEvent('Web Terminal Timeout');\n if (!unmounted) setWsError(error);\n })\n .catch((e) => {\n // eslint-disable-next-line no-console\n console.error('Cloud shell error', e);\n });\n }) // eslint-disable-next-line no-console\n .onerror((evt) => console.error(`WS error?! ${evt}`));\n\n if (ws.current !== websocket) {\n ws.current && ws.current.destroy();\n ws.current = websocket;\n const currentTerminal = terminal.current;\n currentTerminal &&\n currentTerminal.onConnectionClosed(\n t('webterminal-plugin~connecting to {{container}}', { container }),\n );\n }\n\n setWsReopening(false);\n\n return () => {\n unmounted = true;\n websocket.destroy();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n container,\n flags,\n impersonate,\n namespace,\n podname,\n shcommand,\n t,\n workspaceName,\n workspaceModel,\n wsReopening,\n ]);\n\n if (wsError) {\n return (\n <div className=\"co-cloudshell-exec__container-error\">\n <EmptyState>\n <EmptyStateBody className=\"co-cloudshell-exec__error-msg\">{wsError}</EmptyStateBody>\n <EmptyStateFooter>\n <Button\n variant=\"primary\"\n onClick={() => {\n fireTelemetryEvent('Web Terminal Timeout', {\n reconnect: customResource.status.phase === 'Running',\n });\n if (customResource && customResource.status.phase !== 'Running') {\n startWorkspace(customResource);\n } else if (!wsReopening) {\n setWsReopening(true);\n }\n setWsError(undefined);\n }}\n >\n {customResource.status.phase === 'Running'\n ? t('webterminal-plugin~Reconnect to terminal')\n : t('webterminal-plugin~Restart terminal')}\n </Button>\n </EmptyStateFooter>\n </EmptyState>\n </div>\n );\n }\n\n if (wsOpen) {\n return (\n <>\n <div className=\"co-cloudshell-terminal__container\">\n <Terminal onData={onData} onResize={handleResize} ref={terminal} />\n </div>\n <ExecuteCommand onCommand={onCommand} />\n </>\n );\n }\n\n return (\n <div className=\"co-cloudshell-terminal__container\">\n <TerminalLoadingBox />\n </div>\n );\n};\n\n// For testing\nexport const InternalCloudShellExec = CloudShellExec;\n\nconst dispatchToProps = (dispatch: Dispatch): DispatchProps => ({\n onActivate: (active: boolean) => dispatch(setCloudShellActive(active)),\n});\n\nexport default connect<StateProps, DispatchProps>(\n impersonateStateToProps,\n dispatchToProps,\n)(connectToFlags<CloudShellExecProps & WithFlagsProps>(FLAGS.OPENSHIFT)(CloudShellExec));\n","import * as React from 'react';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version\nimport { useSelector } from 'react-redux';\nimport { useCloudShellCommandDispatch } from '../../redux/actions/cloud-shell-dispatchers';\nimport { getCloudShellCommand } from '../../redux/reducers/cloud-shell-selectors';\n\ntype ExecuteCommandProps = {\n onCommand: (command: string) => void;\n};\n\nconst ExecuteCommand: React.FC<ExecuteCommandProps> = ({ onCommand }) => {\n const command = useSelector(getCloudShellCommand);\n const setCloudShellCommand = useCloudShellCommandDispatch();\n\n React.useEffect(() => {\n if (command) {\n onCommand(command);\n setCloudShellCommand(null);\n }\n }, [command, setCloudShellCommand, onCommand]);\n\n return null;\n};\n\nexport default ExecuteCommand;\n","import * as React from 'react';\nimport { Terminal as XTerminal, ITerminalOptions, ITerminalAddon } from 'xterm';\nimport { FitAddon } from 'xterm-addon-fit';\n\nimport './Terminal.scss';\n\nconst terminalOptions: ITerminalOptions = {\n fontFamily: 'monospace',\n fontSize: 16,\n cursorBlink: false,\n cols: 80,\n rows: 25,\n};\n\ntype TerminalProps = {\n onData: (data: string) => void;\n onResize: (cols: number, rows: number) => void;\n};\n\nexport type ImperativeTerminalType = {\n focus: () => void;\n reset: () => void;\n onDataReceived: (data) => void;\n onConnectionClosed: (msg: string) => void;\n loadAttachAddon: (addOn: ITerminalAddon) => void;\n};\n\nconst Terminal = React.forwardRef<ImperativeTerminalType, TerminalProps>(\n ({ onData, onResize }, ref) => {\n const terminal = React.useRef<XTerminal>();\n const terminalRef = React.useRef<HTMLDivElement>();\n\n React.useEffect(() => {\n const term: XTerminal = new XTerminal(terminalOptions);\n const fitAddon = new FitAddon();\n term.open(terminalRef.current);\n term.loadAddon(fitAddon);\n term.focus();\n\n const resizeObserver: ResizeObserver = new ResizeObserver(() => {\n window.requestAnimationFrame(() => fitAddon.fit());\n });\n\n resizeObserver.observe(terminalRef.current);\n\n if (terminal.current !== term) {\n terminal.current && terminal.current.dispose();\n terminal.current = term;\n }\n\n return () => {\n term.dispose();\n resizeObserver.disconnect();\n };\n }, []);\n\n const handleResize = React.useCallback(\n ({ cols, rows }: { cols: number; rows: number }) => {\n onResize(cols, rows);\n },\n [onResize],\n );\n\n React.useEffect(() => {\n const term = terminal.current;\n const data = term.onData(onData);\n const resize = term.onResize(handleResize);\n return () => {\n data.dispose();\n resize.dispose();\n };\n }, [onData, handleResize]);\n\n React.useImperativeHandle(ref, () => ({\n focus: () => {\n terminal.current && terminal.current.focus();\n },\n reset: () => {\n if (!terminal.current) return;\n terminal.current.reset();\n terminal.current.clear();\n terminal.current.setOption('disableStdin', false);\n },\n onDataReceived: (data) => {\n terminal.current && terminal.current.write(data);\n },\n onConnectionClosed: (msg) => {\n if (!terminal.current) return;\n terminal.current.write(`\\x1b[31m${msg || 'disconnected'}\\x1b[m\\r\\n`);\n terminal.current.setOption('disableStdin', true);\n },\n loadAttachAddon: (addOn: ITerminalAddon) => {\n if (!terminal.current) return;\n terminal.current.loadAddon(addOn);\n },\n }));\n\n return <div className=\"co-terminal\" ref={terminalRef} />;\n },\n);\n\nexport default Terminal;\n","import * as React from 'react';\nimport { Formik } from 'formik';\nimport { useTranslation } from 'react-i18next';\nimport { connect } from 'react-redux';\nimport { K8sModel } from '@console/dynamic-plugin-sdk/src/api/common-types';\nimport { k8sGetResource, k8sCreateResource } from '@console/dynamic-plugin-sdk/src/utils/k8s';\nimport { SectionHeading } from '@console/internal/components/utils';\nimport { LoadError } from '@console/internal/components/utils/status-box';\nimport { NamespaceModel } from '@console/internal/models';\nimport {\n newCloudShellWorkSpace,\n createCloudShellResourceName,\n CLOUD_SHELL_PROTECTED_NAMESPACE,\n} from '../cloud-shell-utils';\nimport {\n CloudShellSetupFormData,\n cloudShellSetupValidationSchema,\n getCloudShellTimeout,\n} from './cloud-shell-setup-utils';\nimport CloudSehellSetupForm from './CloudShellSetupForm';\n\ntype Props = {\n onSubmit?: (namespace: string) => void;\n onCancel?: () => void;\n workspaceModel: K8sModel;\n operatorNamespace: string;\n};\n\nconst CloudShellAdminSetup: React.FunctionComponent<Props> = ({\n onSubmit,\n onCancel,\n workspaceModel,\n operatorNamespace,\n}) => {\n const initialValues: CloudShellSetupFormData = {\n namespace: CLOUD_SHELL_PROTECTED_NAMESPACE,\n advancedOptions: {\n timeout: {\n limit: null,\n unit: 'm',\n },\n },\n };\n\n const { t } = useTranslation();\n\n const [initError, setInitError] = React.useState<string>();\n\n const handleSubmit = async (values: CloudShellSetupFormData, actions) => {\n async function namespaceExists(): Promise<boolean> {\n try {\n await k8sGetResource({\n model: NamespaceModel,\n name: CLOUD_SHELL_PROTECTED_NAMESPACE,\n });\n return true;\n } catch (error) {\n if (error.json.code !== 404) {\n setInitError(error);\n }\n return false;\n }\n }\n try {\n const protectedNamespaceExists = await namespaceExists();\n const csTimeout = getCloudShellTimeout(\n values.advancedOptions?.timeout?.limit,\n values.advancedOptions?.timeout?.unit,\n );\n\n if (!protectedNamespaceExists) {\n await k8sCreateResource({\n model: NamespaceModel,\n data: {\n metadata: {\n name: CLOUD_SHELL_PROTECTED_NAMESPACE,\n },\n },\n });\n }\n await k8sCreateResource({\n model: workspaceModel,\n data: newCloudShellWorkSpace(\n createCloudShellResourceName(),\n values.namespace,\n operatorNamespace,\n workspaceModel.apiVersion,\n csTimeout,\n values.advancedOptions?.image,\n ),\n });\n onSubmit(values.namespace);\n } catch (error) {\n actions.setStatus({ submitError: error.message });\n setInitError(error);\n }\n };\n\n if (initError) {\n return (\n <LoadError\n message={initError}\n label={t('webterminal-plugin~OpenShift command line terminal')}\n />\n );\n }\n\n return (\n <>\n <div className=\"co-m-pane__body\" style={{ paddingBottom: 0 }}>\n <SectionHeading\n text={t('webterminal-plugin~Initialize terminal')}\n style={{ marginBottom: 0 }}\n />\n </div>\n <Formik\n initialValues={initialValues}\n onSubmit={handleSubmit}\n onReset={onCancel}\n validationSchema={cloudShellSetupValidationSchema()}\n >\n {(formikProps) => <CloudSehellSetupForm {...formikProps} isAdmin />}\n </Formik>\n </>\n );\n};\n\nexport default connect()(CloudShellAdminSetup);\n","import * as React from 'react';\nimport { FormSection, TextInputTypes } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { InputField } from '@console/shared';\n\nconst AdminNamespaceSection: React.FC = () => {\n const { t } = useTranslation();\n\n return (\n <FormSection>\n <InputField\n type={TextInputTypes.text}\n name=\"namespace\"\n label={t('webterminal-plugin~Project')}\n helpText={t(\n 'webterminal-plugin~This Project will be used to initialize your command line terminal',\n )}\n isDisabled\n required\n />\n </FormSection>\n );\n};\n\nexport default AdminNamespaceSection;\n","import * as React from 'react';\nimport { FormSection } from '@patternfly/react-core';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { ProgressiveList, ProgressiveListItem } from '@console/shared/src';\nimport ImageSection from './ImageSection';\nimport TimeoutSection from './TimeoutSection';\n\nconst Footer = ({ children }) => {\n const { t } = useTranslation();\n return (\n <Trans\n t={t}\n ns=\"webterminal-plugin\"\n defaults=\"Click on the names to access advanced options for <0></0>.\"\n components={[children]}\n />\n );\n};\n\nconst List: React.FC = () => {\n const { t } = useTranslation();\n\n const [visibleItems, setVisibleItems] = React.useState([]);\n const handleVisibleItemChange = (item: string) => {\n setVisibleItems([...visibleItems, item]);\n };\n\n return (\n <ProgressiveList\n visibleItems={visibleItems}\n onVisibleItemChange={handleVisibleItemChange}\n Footer={Footer}\n >\n <ProgressiveListItem name={t('webterminal-plugin~Timeout')}>\n <TimeoutSection />\n </ProgressiveListItem>\n <ProgressiveListItem name={t('webterminal-plugin~Image')}>\n <ImageSection />\n </ProgressiveListItem>\n </ProgressiveList>\n );\n};\n\nconst CloudShellAdvancedSection: React.FC = () => {\n return (\n <FormSection style={{ marginTop: 0 }}>\n <div>\n <List />\n </div>\n </FormSection>\n );\n};\n\nexport default CloudShellAdvancedSection;\n","import * as React from 'react';\nimport { FormSection, TextInputTypes } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { InputField } from '@console/shared';\n\nconst ImageSection: React.FC = () => {\n const { t } = useTranslation();\n\n return (\n <FormSection>\n <InputField\n type={TextInputTypes.text}\n name=\"advancedOptions.image\"\n label={t('webterminal-plugin~Image')}\n helpText={t('webterminal-plugin~Set custom image for the terminal.')}\n />\n </FormSection>\n );\n};\n\nexport default ImageSection;\n","import * as React from 'react';\nimport { FormSection } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { ResourceLimitField } from '@console/shared';\n\nconst TimeoutSection: React.FC = () => {\n const { t } = useTranslation();\n\n const TimeoutUnits = {\n s: t('webterminal-plugin~Seconds'),\n m: t('webterminal-plugin~Minutes'),\n h: t('webterminal-plugin~Hours'),\n ms: t('webterminal-plugin~Milliseconds'),\n };\n\n return (\n <FormSection>\n <ResourceLimitField\n name=\"advancedOptions.timeout.limit\"\n label={t('webterminal-plugin~Timeout')}\n unitName=\"advancedOptions.timeout.unit\"\n unitOptions={TimeoutUnits}\n helpText={t('webterminal-plugin~Set timeout for the terminal.')}\n />\n </FormSection>\n );\n};\n\nexport default TimeoutSection;\n","import * as React from 'react';\nimport { TextInputTypes } from '@patternfly/react-core';\nimport { useFormikContext, FormikValues, useField } from 'formik';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { ProjectModel } from '@console/internal/models';\nimport { connectToFlags, WithFlagsProps } from '@console/internal/reducers/connectToFlags';\nimport { InputField, ResourceDropdownField, useFormikValidationFix, FLAGS } from '@console/shared';\nimport { CREATE_NAMESPACE_KEY } from './cloud-shell-setup-utils';\n\ntype NamespaceSectionProps = WithFlagsProps;\n\nconst NamespaceSection: React.FC<NamespaceSectionProps> = ({ flags }) => {\n const canCreateNs = flags[FLAGS.CAN_CREATE_NS];\n const canCreateProject = flags[FLAGS.CAN_CREATE_PROJECT];\n const canCreate = canCreateNs || canCreateProject;\n const [namespace] = useField('namespace');\n const { setFieldValue, setFieldTouched } = useFormikContext<FormikValues>();\n const { t } = useTranslation();\n\n useFormikValidationFix(namespace.value);\n\n const onDropdownChange = React.useCallback(\n (key: string) => {\n setFieldTouched('namespace', true);\n setFieldValue('namespace', key);\n },\n [setFieldValue, setFieldTouched],\n );\n\n const handleOnLoad = (projectList: { [key: string]: string }) => {\n const noProjects = _.isEmpty(projectList);\n if (noProjects || !projectList[namespace.value]) {\n if (canCreate && namespace.value !== CREATE_NAMESPACE_KEY) {\n setFieldValue('namespace', CREATE_NAMESPACE_KEY);\n }\n if (!canCreate && namespace.value) {\n setFieldValue('namespace', undefined);\n }\n }\n };\n\n return (\n <>\n <ResourceDropdownField\n name=\"namespace\"\n label={t('webterminal-plugin~Project')}\n placeholder={t('webterminal-plugin~Select Project')}\n fullWidth\n required\n selectedKey={namespace.value}\n resources={[\n {\n isList: true,\n kind: ProjectModel.kind,\n prop: ProjectModel.id,\n },\n ]}\n dataSelector={['metadata', 'name']}\n onChange={onDropdownChange}\n actionItems={\n canCreate\n ? [\n {\n actionTitle: t('webterminal-plugin~Create Project'),\n actionKey: CREATE_NAMESPACE_KEY,\n },\n ]\n : undefined\n }\n onLoad={handleOnLoad}\n helpText={t(\n 'webterminal-plugin~This Project will be used to initialize your command line terminal',\n )}\n />\n {namespace.value === CREATE_NAMESPACE_KEY && (\n <InputField\n type={TextInputTypes.text}\n required\n name=\"newNamespace\"\n label={t('webterminal-plugin~Project name')}\n />\n )}\n </>\n );\n};\n\n// exposed for testing\nexport const InternalNamespaceSection = NamespaceSection;\n\nexport default connectToFlags(FLAGS.CAN_CREATE_PROJECT)(NamespaceSection);\n","import * as React from 'react';\nimport { Formik } from 'formik';\nimport { useTranslation } from 'react-i18next';\nimport { connect } from 'react-redux';\nimport { getUser } from '@console/dynamic-plugin-sdk';\nimport { SectionHeading } from '@console/internal/components/utils';\nimport { ProjectRequestModel } from '@console/internal/models';\nimport { k8sCreate, K8sKind } from '@console/internal/module/k8s';\nimport { RootState } from '@console/internal/redux';\nimport { ALL_NAMESPACES_KEY } from '@console/shared';\nimport { newCloudShellWorkSpace, createCloudShellResourceName } from '../cloud-shell-utils';\nimport {\n CloudShellSetupFormData,\n CREATE_NAMESPACE_KEY,\n cloudShellSetupValidationSchema,\n getCloudShellTimeout,\n} from './cloud-shell-setup-utils';\nimport CloudSehellSetupForm from './CloudShellSetupForm';\n\ninterface StateProps {\n activeNamespace: string;\n username: string;\n}\n\ntype Props = StateProps & {\n onSubmit?: (namespace: string) => void;\n onCancel?: () => void;\n workspaceModel: K8sKind;\n operatorNamespace: string;\n};\n\nconst CloudShellDeveloperSetup: React.FunctionComponent<Props> = ({\n activeNamespace,\n workspaceModel,\n operatorNamespace,\n onSubmit,\n onCancel,\n}) => {\n const initialValues: CloudShellSetupFormData = {\n namespace: activeNamespace === ALL_NAMESPACES_KEY ? undefined : activeNamespace,\n advancedOptions: {\n timeout: {\n limit: null,\n unit: 'm',\n },\n },\n };\n const { t } = useTranslation();\n\n const handleSubmit = async (values: CloudShellSetupFormData, actions) => {\n const createNamespace = values.namespace === CREATE_NAMESPACE_KEY;\n const namespace = createNamespace ? values.newNamespace : values.namespace;\n const csTimeout = getCloudShellTimeout(\n values.advancedOptions?.timeout?.limit,\n values.advancedOptions?.timeout?.unit,\n );\n try {\n if (createNamespace) {\n await k8sCreate(ProjectRequestModel, {\n metadata: {\n name: namespace,\n },\n });\n }\n await k8sCreate(\n workspaceModel,\n newCloudShellWorkSpace(\n createCloudShellResourceName(),\n namespace,\n operatorNamespace,\n workspaceModel.apiVersion,\n csTimeout,\n values.advancedOptions?.image,\n ),\n );\n onSubmit && onSubmit(namespace);\n } catch (err) {\n actions.setStatus({ submitError: err.message });\n }\n };\n\n return (\n <>\n <div className=\"co-m-pane__body\" style={{ paddingBottom: 0 }}>\n <SectionHeading\n text={t('webterminal-plugin~Initialize terminal')}\n style={{ marginBottom: 0 }}\n />\n </div>\n <Formik\n initialValues={initialValues}\n onSubmit={handleSubmit}\n onReset={onCancel}\n validationSchema={cloudShellSetupValidationSchema()}\n >\n {(formikProps) => <CloudSehellSetupForm {...formikProps} />}\n </Formik>\n </>\n );\n};\n\nconst mapStateToProps = (state: RootState): StateProps => ({\n username: getUser(state)?.username || '',\n activeNamespace: state.UI.get('activeNamespace'),\n});\n\nexport default connect<StateProps>(mapStateToProps)(CloudShellDeveloperSetup);\n","import * as React from 'react';\nimport { WatchK8sResource, WatchK8sResult, useSafetyFirst } from '@console/dynamic-plugin-sdk';\nimport { useAccessReview2 } from '@console/internal/components/utils';\nimport { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';\nimport { ProjectModel } from '@console/internal/models';\nimport { UserInfo, referenceForModel, k8sList, K8sKind } from '@console/internal/module/k8s';\nimport {\n CLOUD_SHELL_LABEL,\n CLOUD_SHELL_CREATOR_LABEL,\n CloudShellResource,\n CLOUD_SHELL_RESTRICTED_ANNOTATION,\n CLOUD_SHELL_PROTECTED_NAMESPACE,\n} from './cloud-shell-utils';\n\nconst findWorkspace = (data?: CloudShellResource[]): CloudShellResource | undefined => {\n if (Array.isArray(data)) {\n return data.find(\n (d) =>\n d?.metadata?.annotations?.[CLOUD_SHELL_RESTRICTED_ANNOTATION] === 'true' &&\n !d?.metadata?.deletionTimestamp,\n );\n }\n return undefined;\n};\n\nconst useCloudShellWorkspace = (\n user: UserInfo,\n isClusterAdmin: boolean,\n workspaceModel: K8sKind,\n defaultNamespace: string = null,\n): WatchK8sResult<CloudShellResource> => {\n const [namespace, setNamespace] = useSafetyFirst(defaultNamespace);\n const [searching, setSearching] = useSafetyFirst<boolean>(false);\n const [noNamespaceFound, setNoNamespaceFound] = useSafetyFirst<boolean>(false);\n\n // sync defaultNamespace to namespace\n React.useEffect(() => {\n setNamespace(defaultNamespace);\n // a new namespace means we can start a new search\n defaultNamespace && setNoNamespaceFound(false);\n }, [defaultNamespace, setNamespace, setNoNamespaceFound]);\n\n const [canListWorkspaces, loadingAccessReview] = useAccessReview2({\n group: workspaceModel.apiGroup,\n resource: workspaceModel.plural,\n verb: 'list',\n });\n\n const uid = user?.uid;\n const username = user?.username;\n const isKubeAdmin = !uid && username === 'kube:admin';\n const resource = React.useMemo<WatchK8sResource>(() => {\n if (loadingAccessReview || (!canListWorkspaces && !namespace)) {\n return undefined;\n }\n const result: WatchK8sResource = {\n kind: referenceForModel(workspaceModel),\n isList: true,\n selector: {\n matchLabels: {\n [CLOUD_SHELL_LABEL]: 'true',\n [CLOUD_SHELL_CREATOR_LABEL]: isKubeAdmin ? '' : uid,\n },\n },\n };\n\n if (isClusterAdmin) {\n result.namespace = CLOUD_SHELL_PROTECTED_NAMESPACE;\n } else if (!canListWorkspaces) {\n result.namespace = namespace;\n }\n\n return result;\n }, [\n loadingAccessReview,\n canListWorkspaces,\n namespace,\n isKubeAdmin,\n uid,\n isClusterAdmin,\n workspaceModel,\n ]);\n\n // call k8s api to fetch workspace\n const [data, loaded, loadError] = useK8sWatchResource<CloudShellResource[]>(resource);\n const workspace = findWorkspace(data);\n\n const searchNamespaces =\n // are we currently searching\n searching ||\n // wait for access review to return\n (!loadingAccessReview &&\n // user cannot list workspaces at the cluster scope\n !canListWorkspaces &&\n // fetching the workspace succeeded or failed\n (loaded || loadError) &&\n // was a workspace was found\n !workspace &&\n // did a previous search result in no namespace found\n !noNamespaceFound);\n\n // FIXME need to use a service account on the backend to find the workspace instead of inefficiently looping through namespaces\n React.useEffect(() => {\n let unmounted = false;\n if (searchNamespaces) {\n (async () => {\n setNoNamespaceFound(false);\n setSearching(true);\n try {\n const projects = await k8sList(ProjectModel);\n if (unmounted) return;\n if (Array.isArray(projects)) {\n for (const project of projects) {\n const projectName = project.metadata.name;\n try {\n // search each project sequentially\n // eslint-disable-next-line no-await-in-loop\n const workspaceList = await k8sList(workspaceModel, {\n ns: projectName,\n labelSelector: {\n matchLabels: {\n [CLOUD_SHELL_LABEL]: 'true',\n [CLOUD_SHELL_CREATOR_LABEL]: isKubeAdmin ? '' : uid,\n },\n },\n });\n if (unmounted) return;\n const foundWorkspace = findWorkspace(workspaceList);\n if (foundWorkspace) {\n setNamespace(projectName);\n return;\n }\n } catch {\n // ignore and move on to the next namespace\n }\n }\n }\n setNoNamespaceFound(true);\n } catch (e) {\n setNoNamespaceFound(true);\n } finally {\n setSearching(false);\n }\n })();\n }\n return () => {\n unmounted = true;\n };\n }, [\n isKubeAdmin,\n searchNamespaces,\n setNamespace,\n uid,\n setNoNamespaceFound,\n setSearching,\n workspaceModel,\n ]);\n\n return [\n workspace,\n // loaded if we have a resource loaded and currently not searching\n // or if the search resulted in no namespace found\n (!!resource && !searching && !searchNamespaces && loaded) || noNamespaceFound,\n // provide the error associated with fetching the workspace\n resource && !searching && !searchNamespaces ? loadError : undefined,\n ];\n};\n\nexport default useCloudShellWorkspace;\n","import * as React from 'react';\nimport { sendActivityTick } from './cloud-shell-utils';\n\n// 1 minute\nexport const TICK_INTERVAL = 60000;\n\nconst useActivityTick = (workspaceName: string, namespace: string) => {\n const lastTick = React.useRef<number>(0);\n\n const tick = React.useCallback(() => {\n const now = Date.now();\n if (now - lastTick.current >= TICK_INTERVAL) {\n sendActivityTick(workspaceName, namespace);\n lastTick.current = now;\n }\n }, [workspaceName, namespace]);\n\n return tick;\n};\n\nexport default useActivityTick;\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Navigate } from 'react-router-dom-v5-compat';\nimport { useFlag } from '@console/shared';\nimport { FLAG_DEVWORKSPACE } from '../../const';\nimport MultiTabTerminal from './MultiTabbedTerminal';\n\nimport './CloudShellTab.scss';\n\nconst CloudShellTab: React.FC = () => {\n const { t } = useTranslation();\n const devWorkspaceFlag = useFlag(FLAG_DEVWORKSPACE);\n\n if (devWorkspaceFlag === false) return <Navigate to=\"/\" replace />;\n\n return (\n <>\n <div className=\"co-cloud-shell-tab__header\">\n <div className=\"co-cloud-shell-tab__header-text\">\n {t('webterminal-plugin~OpenShift command line terminal')}\n </div>\n </div>\n <div className=\"co-cloud-shell-tab__body\">\n <MultiTabTerminal />\n </div>\n </>\n );\n};\n\nexport default CloudShellTab;\n","import * as React from 'react';\nimport { useLocation } from 'react-router-dom-v5-compat';\nimport { Perspective, PerspectiveContext } from '@console/dynamic-plugin-sdk';\nimport { usePerspectives } from '@console/shared/src';\nimport PerspectiveDetector from './PerspectiveDetector';\nimport { useValuesForPerspectiveContext } from './useValuesForPerspectiveContext';\n\ntype DetectPerspectiveProps = {\n children: React.ReactNode;\n};\n\nconst getPerspectiveURLParam = (perspectives: Perspective[]) => {\n const perspectiveIDs = perspectives.map(\n (nextPerspective: Perspective) => nextPerspective.properties.id,\n );\n\n const urlParams = new URLSearchParams(window.location.search);\n const perspectiveParam = urlParams.get('perspective');\n return perspectiveIDs.includes(perspectiveParam) ? perspectiveParam : null;\n};\n\nconst DetectPerspective: React.FC<DetectPerspectiveProps> = ({ children }) => {\n const [activePerspective, setActivePerspective, loaded] = useValuesForPerspectiveContext();\n const perspectiveExtensions = usePerspectives();\n const perspectiveParam = getPerspectiveURLParam(perspectiveExtensions);\n const location = useLocation();\n React.useEffect(() => {\n if (perspectiveParam && perspectiveParam !== activePerspective) {\n setActivePerspective(perspectiveParam, location.pathname);\n }\n }, [perspectiveParam, activePerspective, setActivePerspective, location]);\n return loaded ? (\n activePerspective ? (\n <PerspectiveContext.Provider value={{ activePerspective, setActivePerspective }}>\n {children}\n </PerspectiveContext.Provider>\n ) : (\n <PerspectiveDetector setActivePerspective={setActivePerspective} />\n )\n ) : null;\n};\n\nexport default DetectPerspective;\n","import * as React from 'react';\nimport { Perspective, ResolvedExtension } from '@console/dynamic-plugin-sdk';\nimport { usePerspectives } from '@console/shared/src';\n\ntype DetectorProps = {\n setActivePerspective: (perspective: string) => void;\n perspectiveExtensions: Perspective[];\n detectors: (\n | undefined\n | ResolvedExtension<Perspective>['properties']['usePerspectiveDetection']\n )[];\n};\n\ntype PerspectiveDetectorProps = {\n setActivePerspective: (perspective: string) => void;\n};\n\nconst Detector: React.FC<DetectorProps> = ({\n setActivePerspective,\n perspectiveExtensions,\n detectors,\n}) => {\n let detectedPerspective: string;\n const defaultPerspective =\n perspectiveExtensions.find((p) => p.properties.default) || perspectiveExtensions[0];\n const detectionResults = detectors.map((detector) => detector?.());\n\n const detectionComplete = detectionResults.every((result, index) => {\n if (result) {\n const [enablePerspective, loading] = result;\n if (!detectedPerspective && !loading && enablePerspective) {\n detectedPerspective = perspectiveExtensions[index].properties.id;\n }\n return loading === false;\n }\n return true;\n });\n\n React.useEffect(() => {\n if (detectedPerspective) {\n setActivePerspective(detectedPerspective);\n } else if (defaultPerspective && (detectors.length < 1 || detectionComplete)) {\n // set default perspective if there are no detectors or none of the detections were successfull\n setActivePerspective(defaultPerspective.properties.id);\n }\n }, [\n defaultPerspective,\n detectedPerspective,\n detectionComplete,\n detectors.length,\n setActivePerspective,\n ]);\n\n return null;\n};\n\nconst PerspectiveDetector: React.FC<PerspectiveDetectorProps> = ({ setActivePerspective }) => {\n const perspectiveExtensions = usePerspectives();\n const [detectors, setDetectors] = React.useState<\n (undefined | ResolvedExtension<Perspective>['properties']['usePerspectiveDetection'])[]\n >();\n React.useEffect(() => {\n let resolveCount = 0;\n const resolvedDetectors: ResolvedExtension<\n Perspective\n >['properties']['usePerspectiveDetection'][] = [];\n perspectiveExtensions.forEach((p, i) => {\n if (p.properties.usePerspectiveDetection) {\n p.properties\n .usePerspectiveDetection()\n .then((detector) => {\n resolvedDetectors[i] = detector;\n })\n .finally(() => {\n resolveCount++;\n if (resolveCount === perspectiveExtensions.length) {\n setDetectors(resolvedDetectors);\n }\n })\n .catch((e) => {\n // eslint-disable-next-line no-console\n console.error('Perspective detection failed', e);\n });\n } else {\n resolveCount++;\n if (resolveCount === perspectiveExtensions.length) {\n setDetectors(resolvedDetectors);\n }\n }\n });\n }, [perspectiveExtensions]);\n return Array.isArray(detectors) ? (\n <Detector\n setActivePerspective={setActivePerspective}\n perspectiveExtensions={perspectiveExtensions}\n detectors={detectors}\n />\n ) : null;\n};\n\nexport default PerspectiveDetector;\n","import * as React from 'react';\nimport { Form } from '@patternfly/react-core';\nimport { ResolvedUserPreferenceItem } from './types';\nimport UserPreferenceField from './UserPreferenceField';\n\nimport './UserPreferenceForm.scss';\n\ntype UserPreferenceFormProps = { items: ResolvedUserPreferenceItem[] };\n\nconst UserPreferenceForm: React.FC<UserPreferenceFormProps> = ({ items }) =>\n items?.length > 0 ? (\n <Form onSubmit={(event) => event.preventDefault()} className=\"co-user-preference__form\">\n {items.map((item) => (\n <UserPreferenceField key={item.id} item={item} />\n ))}\n </Form>\n ) : null;\nexport default UserPreferenceForm;\n","import * as React from 'react';\nimport { FormGroup, FormHelperText, HelperText, HelperTextItem } from '@patternfly/react-core';\nimport { UserPreferenceFieldType } from '@console/dynamic-plugin-sdk';\nimport { componentForFieldType } from './const';\nimport { ResolvedUserPreferenceItem } from './types';\n\ntype UserPreferenceFieldProps = { item: ResolvedUserPreferenceItem };\n\nconst UserPreferenceField: React.FC<UserPreferenceFieldProps> = ({ item }) => {\n const { id, label, field, description } = item;\n\n const FieldComponent: React.FC<React.ComponentProps<\n typeof componentForFieldType[UserPreferenceFieldType]\n >> = componentForFieldType[field.type];\n\n return (\n <FormGroup key={id} fieldId={id} label={label} data-test={`${id} field`}>\n {FieldComponent ? <FieldComponent id={id} {...field} /> : null}\n\n <FormHelperText>\n <HelperText>\n <HelperTextItem>{description}</HelperTextItem>\n </HelperText>\n </FormHelperText>\n </FormGroup>\n );\n};\n\nexport default UserPreferenceField;\n","import {\n ResolvedUserPreferenceGroup,\n ResolvedUserPreferenceItem,\n UserPreferenceTabGroup,\n} from '../types';\n\nexport const getUserPreferenceGroups = (\n userPreferenceGroups: ResolvedUserPreferenceGroup[],\n userPreferenceItems: ResolvedUserPreferenceItem[],\n): UserPreferenceTabGroup[] => {\n if (!userPreferenceItems?.length || !userPreferenceGroups?.length) {\n return [];\n }\n const initialUserPreferenceGroup: UserPreferenceTabGroup[] = userPreferenceGroups.map(\n (userPreferenceGroup) => ({\n ...userPreferenceGroup,\n items: [],\n }),\n );\n const populatedUserPreferenceGroups: UserPreferenceTabGroup[] = userPreferenceItems.reduce(\n (userPreferenceGroup: typeof initialUserPreferenceGroup, currUserPreferenceItem) => {\n const userPreferenceGroupForCurrentItem = userPreferenceGroup.find(\n (group) => currUserPreferenceItem.groupId === group.id,\n );\n if (userPreferenceGroupForCurrentItem) {\n userPreferenceGroupForCurrentItem.items.push(currUserPreferenceItem);\n } else {\n userPreferenceGroup.push({\n id: currUserPreferenceItem.id,\n label: currUserPreferenceItem.label,\n items: [currUserPreferenceItem],\n });\n }\n return userPreferenceGroup;\n },\n initialUserPreferenceGroup,\n );\n return populatedUserPreferenceGroups.filter((group) => group.items.length);\n};\n","import { PerspectiveType } from '@console/dynamic-plugin-sdk';\nimport { useUserSettingsCompatibility } from '@console/shared';\nimport {\n LAST_PERSPECTIVE_LOCAL_STORAGE_KEY,\n LAST_PERSPECTIVE_USER_SETTINGS_KEY,\n} from '../../consts';\n\nexport const useLastPerspective = (): [\n string,\n React.Dispatch<React.SetStateAction<string>>,\n boolean,\n] =>\n useUserSettingsCompatibility<PerspectiveType>(\n LAST_PERSPECTIVE_USER_SETTINGS_KEY,\n LAST_PERSPECTIVE_LOCAL_STORAGE_KEY,\n '',\n );\n","import * as React from 'react';\nimport { NamespaceContext, useValuesForNamespaceContext } from './namespace';\n\ntype DetectNamespaceProps = {\n children: React.ReactNode;\n};\n\nconst DetectNamespace: React.FC<DetectNamespaceProps> = ({ children }) => {\n const { namespace, setNamespace, loaded } = useValuesForNamespaceContext();\n return loaded ? (\n <NamespaceContext.Provider value={{ namespace, setNamespace }}>\n {children}\n </NamespaceContext.Provider>\n ) : null;\n};\n\nexport default DetectNamespace;\n","import * as React from 'react';\nimport { usePreferredLanguage, useLanguage } from '../user-preferences/language';\n\nconst DetectLanguage: React.MemoExoticComponent<() => any> = React.memo(function DetectLanguage() {\n const [preferredLanguage, , preferredLanguageLoaded] = usePreferredLanguage();\n useLanguage(preferredLanguage, preferredLanguageLoaded);\n return null;\n});\n\nexport default DetectLanguage;\n","import * as React from 'react';\nimport {\n isFeatureFlagHookProvider,\n FeatureFlagHookProvider,\n useResolvedExtensions,\n} from '@console/dynamic-plugin-sdk';\nimport { featureFlagController } from '@console/internal/actions/features';\nimport FeatureFlagExtensionHookResolver from './FeatureFlagExtensionHookResolver';\n\nconst FeatureFlagExtensionLoader: React.FC = () => {\n const [flagProvider, flagProviderResolved] = useResolvedExtensions<FeatureFlagHookProvider>(\n isFeatureFlagHookProvider,\n );\n if (flagProviderResolved) {\n return (\n <>\n {flagProvider.map((nf) => {\n const {\n properties: { handler },\n uid,\n } = nf;\n return (\n <FeatureFlagExtensionHookResolver\n key={uid}\n handler={handler}\n setFeatureFlag={featureFlagController}\n />\n );\n })}\n </>\n );\n }\n return null;\n};\nexport default FeatureFlagExtensionLoader;\n","import * as React from 'react';\nimport { FeatureFlagHandler, SetFeatureFlag } from '@console/dynamic-plugin-sdk/src';\n\ntype FeatureFlagExtensionHookResolverProps = {\n handler: FeatureFlagHandler;\n setFeatureFlag: SetFeatureFlag;\n};\n\nconst FeatureFlagExtensionHookResolver: React.FC<FeatureFlagExtensionHookResolverProps> = ({\n handler,\n setFeatureFlag,\n}) => {\n handler(setFeatureFlag);\n return null;\n};\n\nexport default FeatureFlagExtensionHookResolver;\n","import * as _ from 'lodash';\nimport { Store } from 'redux';\nimport { RootState } from '@console/internal/redux';\nimport { initSubscriptionService } from '@console/plugin-sdk/src/api/pluginSubscriptionService';\nimport { PluginStore } from '@console/plugin-sdk/src/store';\nimport { setPluginStore } from '../utils/k8s';\nimport { registerPluginEntryCallback, loadAndEnablePlugin } from './plugin-loader';\n\nexport const initConsolePlugins = _.once(\n (pluginStore: PluginStore, reduxStore: Store<RootState>) => {\n // Initialize dynamic plugin infrastructure\n initSubscriptionService(pluginStore, reduxStore);\n registerPluginEntryCallback(pluginStore);\n setPluginStore(pluginStore);\n\n // Load dynamic plugins\n pluginStore.getAllowedDynamicPluginNames().forEach((pluginName) => {\n loadAndEnablePlugin(pluginName, pluginStore, (errorMessage, errorCause) => {\n // eslint-disable-next-line no-console\n console.error(..._.compact([errorMessage, errorCause]));\n pluginStore.registerFailedDynamicPlugin(pluginName, errorMessage, errorCause);\n // TODO(vojtech): add new entry into the notification drawer\n });\n });\n },\n);\n","import { PluginBuildMetadata, PluginManifest } from '@openshift/dynamic-plugin-sdk-webpack';\n\n/**\n * Additional plugin metadata supported by the Console application.\n */\nexport type ConsoleSupportedCustomProperties = Partial<{\n /** User-friendly plugin name. */\n displayName: string;\n\n /** User-friendly plugin description. */\n description: string;\n\n /** Disable the given static plugins when this plugin gets loaded. */\n disableStaticPlugins: string[];\n}>;\n\n/**\n * Build-time Console dynamic plugin metadata.\n */\nexport type ConsolePluginBuildMetadata = PluginBuildMetadata & ConsoleSupportedCustomProperties;\n\n/**\n * Standard Console dynamic plugin manifest format.\n */\nexport type StandardConsolePluginManifest = {\n customProperties?: {\n console?: ConsoleSupportedCustomProperties;\n [customNamespace: string]: unknown;\n };\n} & PluginManifest;\n\n/**\n * Legacy Console dynamic plugin manifest format.\n */\nexport type LegacyConsolePluginManifest = Pick<\n PluginManifest,\n 'name' | 'version' | 'dependencies' | 'extensions'\n> &\n ConsoleSupportedCustomProperties;\n\n/**\n * This type supports both standard and legacy Console dynamic plugin manifest formats.\n *\n * Console application automatically adapts the manifest to standard format when loading\n * the given plugin.\n */\nexport type AnyConsolePluginManifest = StandardConsolePluginManifest | LegacyConsolePluginManifest;\n\nexport const isStandardPluginManifest = (\n m: AnyConsolePluginManifest,\n): m is StandardConsolePluginManifest =>\n // Standard plugin manifests must have a string valued baseURL property\n // eslint-disable-next-line dot-notation\n m['baseURL'] && typeof m['baseURL'] === 'string';\n","/* eslint-disable global-require */\n/* eslint-disable @typescript-eslint/no-require-imports */\n\nimport { SharedModuleNames } from './shared-modules';\nimport { RemoteEntryModule } from './types';\n\ntype SharedScopeObject = {\n [moduleName: string]: {\n [versionRange: string]: {\n get: () => Promise<() => any>;\n eager?: boolean;\n loaded?: 1;\n };\n };\n};\n\nconst initSharedScope = () => {\n const scope: SharedScopeObject = {};\n\n // If version range is '*' it means \"this shared module matches all requested versions\",\n // i.e. make sure that the plugin always uses the given shared module implementation\n const addModule = (\n moduleName: SharedModuleNames,\n getModule: () => Promise<() => any>,\n versionRange = '*',\n ) => {\n scope[moduleName] = scope[moduleName] ?? {};\n scope[moduleName][versionRange] = { get: getModule, eager: true, loaded: 1 };\n };\n\n // Singleton modules provided by Console application without plugin provided fallback\n addModule('@openshift-console/dynamic-plugin-sdk', async () => () =>\n require('@console/dynamic-plugin-sdk/src/lib-core'),\n );\n addModule('@openshift-console/dynamic-plugin-sdk-internal', async () => () =>\n require('@console/dynamic-plugin-sdk/src/lib-internal'),\n );\n addModule('react', async () => () => require('react'));\n addModule('react-i18next', async () => () => require('react-i18next'));\n addModule('react-router', async () => () => require('react-router'));\n addModule('react-router-dom', async () => () => require('react-router-dom'));\n addModule('react-router-dom-v5-compat', async () => () => require('react-router-dom-v5-compat'));\n addModule('react-redux', async () => () => require('react-redux'));\n addModule('redux', async () => () => require('redux'));\n addModule('redux-thunk', async () => () => require('redux-thunk'));\n\n // Backwards compatibility: provide PatternFly 4 packages for existing Console plugins\n addModule(\n '@patternfly/react-core',\n async () => () => require('@patternfly-4/react-core'),\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n require('@patternfly-4/react-core/package.json').version,\n );\n addModule(\n '@patternfly/react-table',\n async () => () => require('@patternfly-4/react-table'),\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n require('@patternfly-4/react-table/package.json').version,\n );\n addModule(\n '@patternfly/quickstarts',\n async () => () => require('@patternfly-4/quickstarts'),\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n require('@patternfly-4/quickstarts/package.json').version,\n );\n\n return scope;\n};\n\nconst sharedScope = initSharedScope();\n\nif (process.env.NODE_ENV !== 'production') {\n // Expose webpack shared scope object for debugging\n window.webpackSharedScope = sharedScope;\n}\n\n/**\n * At runtime, the Console application will initialize shared modules for each\n * dynamic plugin before loading any of the modules exposed by the given plugin.\n *\n * Note: `__webpack_init_sharing__` global function is available in webpack 5+ builds.\n * Once Console gets built with webpack 5, evaluate if we need this global in order to\n * allow plugins to attempt to provide shared modules into the application shared scope.\n *\n * @see https://webpack.js.org/concepts/module-federation/#dynamic-remote-containers\n */\nexport const initSharedPluginModules = (entryModule: RemoteEntryModule) => {\n entryModule.init(sharedScope);\n};\n","import * as React from 'react';\nimport { AccordionContent, AccordionItem, AccordionToggle, Icon } from '@patternfly/react-core';\nimport classNames from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport { typeFilter, getLastTime } from '@console/internal/components/events';\nimport { timeFormatter } from '@console/internal/components/utils/datetime';\nimport { ResourceIcon } from '@console/internal/components/utils/resource-icon';\nimport { ResourceLink } from '@console/internal/components/utils/resource-link';\nimport { EventKind, referenceFor } from '@console/internal/module/k8s';\nimport { YellowExclamationTriangleIcon } from '../../status';\n\nconst propsAreEqual = (prevProps: EventItemProps, nextProps: EventItemProps) =>\n prevProps.event.metadata.uid === nextProps.event.metadata.uid &&\n getLastTime(prevProps.event) === getLastTime(nextProps.event) &&\n prevProps.isExpanded === nextProps.isExpanded &&\n prevProps.onToggle === nextProps.onToggle;\n\nconst EventItem: React.FC<EventItemProps> = React.memo(({ event, isExpanded, onToggle }) => {\n const { t } = useTranslation();\n const { involvedObject, message, metadata } = event;\n const lastTime = getLastTime(event);\n const isWarning = typeFilter('warning', event);\n const expanded = isExpanded(metadata.uid);\n return (\n <div className=\"co-recent-item__body\">\n <AccordionItem>\n <AccordionToggle\n onClick={() => onToggle(metadata.uid)}\n isExpanded={expanded}\n id={metadata.uid}\n className={classNames('co-recent-item__toggle', {\n 'co-recent-item--warning': isWarning && expanded,\n })}\n >\n <div className=\"co-recent-item__title\">\n <div className=\"co-recent-item__title-timestamp text-secondary\">\n {lastTime ? (\n <span title={lastTime}>{timeFormatter.format(new Date(lastTime))}</span>\n ) : (\n '-'\n )}\n </div>\n <div className=\"co-recent-item__title-message\">\n {isWarning && (\n <Icon iconSize=\"md\" className=\"co-recent-item__icon\">\n <YellowExclamationTriangleIcon\n title={t('public~Warning')}\n className=\"co-recent-item__icon--warning\"\n />\n </Icon>\n )}\n {!expanded && (\n <>\n <ResourceIcon kind={involvedObject.kind} />\n <div className=\"co-recent-item__title-message-text\">{message}</div>\n </>\n )}\n </div>\n </div>\n </AccordionToggle>\n <AccordionContent\n isHidden={!expanded}\n className={classNames('co-recent-item__content', {\n 'co-recent-item--warning': isWarning,\n })}\n >\n <div>\n <div className=\"co-recent-item__content-header\">\n <ResourceLink\n className=\"co-recent-item__content-resourcelink\"\n kind={referenceFor(involvedObject)}\n namespace={involvedObject.namespace}\n name={involvedObject.name}\n title={involvedObject.uid}\n />\n </div>\n <div className=\"co-recent-item__content-message\">{message}</div>\n </div>\n </AccordionContent>\n </AccordionItem>\n </div>\n );\n}, propsAreEqual);\n\nexport default EventItem;\n\ntype EventItemProps = {\n event: EventKind;\n isExpanded: (key: string) => boolean;\n onToggle: (key: string) => void;\n};\n","import * as _ from 'lodash';\nimport * as semver from 'semver';\nimport { subscribeToDynamicPlugins } from '@console/plugin-sdk/src/api/pluginSubscriptionService';\nimport { StandardConsolePluginManifest } from '../build-types';\nimport { CustomError } from '../utils/error/custom-error';\nimport { getPluginID } from './plugin-utils';\n\nclass UnmetPluginDependenciesError extends CustomError {\n constructor(message: string, unmetDependencies: string[]) {\n super(`${message}:\\n${unmetDependencies.join('\\n')}`);\n }\n}\n\nconst unsubListenerMap = new Map<string, VoidFunction>();\n\nconst cleanupListener = (pluginID: string) => {\n if (unsubListenerMap.has(pluginID)) {\n unsubListenerMap.get(pluginID)();\n unsubListenerMap.delete(pluginID);\n }\n};\n\nconst formatPluginNames = (values: string[]) =>\n values.sort((a, b) => a.localeCompare(b)).join(', ');\n\nconst formatUnmetDependency = (depName: string, requiredRange: string, currentVersion: string) =>\n `${depName}: required ${requiredRange}, current ${currentVersion}`;\n\n/**\n * Resolve all dependencies within the given plugin manifest.\n *\n * `consolePluginAPIVersion` may be `null` which indicates that Console was not able to parse\n * the semver version properly. In that case, the corresponding dependency check will be skipped.\n */\nexport const resolvePluginDependencies = (\n manifest: StandardConsolePluginManifest,\n consolePluginAPIVersion: string,\n allowedPluginNames: string[],\n) => {\n const pluginID = getPluginID(manifest);\n const dependencies = manifest.dependencies || {};\n\n if (unsubListenerMap.has(pluginID)) {\n throw new Error(`Dependency resolution for plugin ${pluginID} is already in progress`);\n }\n\n // eslint-disable-next-line no-console\n console.info(`Resolving dependencies for plugin ${pluginID}`);\n\n // Include prerelease tag (if present) in the range check\n // https://github.com/npm/node-semver#prerelease-tags\n const semverOptions: semver.Options = { includePrerelease: true };\n\n // Ensure compatibility with current Console plugin API\n const pluginAPIDepName = '@console/pluginAPI';\n\n if (\n consolePluginAPIVersion &&\n dependencies[pluginAPIDepName] &&\n !semver.satisfies(consolePluginAPIVersion, dependencies[pluginAPIDepName], semverOptions)\n ) {\n throw new UnmetPluginDependenciesError('Unmet dependency on Console plugin API', [\n formatUnmetDependency(\n pluginAPIDepName,\n dependencies[pluginAPIDepName],\n consolePluginAPIVersion,\n ),\n ]);\n }\n\n // Ensure compatibility with other dynamic plugins\n const requiredPluginNames = _.difference(Object.keys(dependencies), [pluginAPIDepName]);\n const unavailablePluginNames = _.difference(requiredPluginNames, allowedPluginNames);\n\n if (requiredPluginNames.length === 0) {\n return Promise.resolve();\n }\n\n if (unavailablePluginNames.length > 0) {\n throw new Error(\n `Dependent plugins are not available: ${formatPluginNames(unavailablePluginNames)}`,\n );\n }\n\n // Wait for all dependent plugins to be loaded before resolving the Promise.\n // If some of them fail to load successfully, the Promise will be rejected.\n return new Promise<void>((resolve, reject) => {\n let promiseSettled = false;\n\n const resolvePromise = () => {\n promiseSettled = true;\n cleanupListener(pluginID);\n resolve();\n };\n\n const rejectPromise = (reason) => {\n promiseSettled = true;\n cleanupListener(pluginID);\n reject(reason);\n };\n\n const unsubListener = subscribeToDynamicPlugins((entries) => {\n const loadedPlugins = entries.reduce<Record<string, string>>((acc, e) => {\n if (e.status === 'Loaded' && requiredPluginNames.includes(e.metadata.name)) {\n acc[e.metadata.name] = e.metadata.version;\n }\n return acc;\n }, {});\n\n const failedPluginNames = entries.reduce<string[]>((acc, e) => {\n if (e.status === 'Failed' && requiredPluginNames.includes(e.pluginName)) {\n acc.push(e.pluginName);\n }\n return acc;\n }, []);\n\n if (failedPluginNames.length > 0) {\n rejectPromise(\n new Error(`Dependent plugins failed to load: ${formatPluginNames(failedPluginNames)}`),\n );\n } else if (_.isEqual(_.sortBy(requiredPluginNames), _.sortBy(Object.keys(loadedPlugins)))) {\n const unmetDependencies: string[] = [];\n\n requiredPluginNames.forEach((pluginName) => {\n if (\n !semver.satisfies(loadedPlugins[pluginName], dependencies[pluginName], semverOptions)\n ) {\n unmetDependencies.push(\n formatUnmetDependency(\n pluginName,\n dependencies[pluginName],\n loadedPlugins[pluginName],\n ),\n );\n }\n });\n\n if (unmetDependencies.length > 0) {\n rejectPromise(\n new UnmetPluginDependenciesError('Unmet dependencies on plugins', unmetDependencies),\n );\n } else {\n resolvePromise();\n }\n }\n });\n\n // subscribeToDynamicPlugins immediately invokes the provided listener,\n // which may cause the dependency resolution Promise to be settled already\n if (!promiseSettled) {\n unsubListenerMap.set(pluginID, unsubListener);\n }\n });\n};\n\nexport const getStateForTestPurposes = () => ({\n unsubListenerMap,\n});\n\nexport const resetStateAndEnvForTestPurposes = () => {\n unsubListenerMap.clear();\n};\n","import * as _ from 'lodash';\nimport { coFetch } from '@console/internal/co-fetch';\nimport { ConsolePluginManifestJSON } from '../schema/plugin-manifest';\nimport { resolveURL } from '../utils/url';\n\nexport const validatePluginManifestSchema = async (\n manifest: ConsolePluginManifestJSON,\n manifestURL: string,\n) => {\n // eslint-disable-next-line\n const schema = require('../../generated/schema/plugin-manifest.cjs').default;\n\n // Use dynamic import to avoid pulling ajv dependency tree into main vendors chunk\n const SchemaValidator = await import('../validation/SchemaValidator').then(\n (m) => m.SchemaValidator,\n );\n\n const validator = new SchemaValidator(manifestURL);\n validator.validate(schema, manifest, 'manifest');\n\n validator.result.assertions.validDNSSubdomainName(manifest.name, 'manifest.name');\n validator.result.assertions.validSemverString(manifest.version, 'manifest.version');\n\n if (_.isPlainObject(manifest.dependencies)) {\n Object.entries(manifest.dependencies).forEach(([depName, versionRange]) => {\n validator.result.assertions.validSemverRangeString(\n versionRange,\n `manifest.dependencies['${depName}']`,\n );\n });\n }\n\n return validator.result;\n};\n\nexport const fetchPluginManifest = async (baseURL: string) => {\n const url = resolveURL(baseURL, 'plugin-manifest.json');\n // eslint-disable-next-line no-console\n console.info(`Loading plugin manifest from ${url}`);\n\n const response: Response = await coFetch(url, { method: 'GET' });\n const manifest = (await response.json()) as ConsolePluginManifestJSON;\n\n (await validatePluginManifestSchema(manifest, url)).report();\n\n return manifest;\n};\n","import * as React from 'react';\nimport { AsyncComponent } from '@console/internal/components/utils';\n\nconst QuickStartDrawerAsync: React.FC = ({ children, ...props }) => (\n <AsyncComponent\n loader={() =>\n import('./QuickStartDrawer' /* webpackChunkName: \"quick-start\" */).then((c) => c.default)\n }\n {...props}\n >\n {children}\n </AsyncComponent>\n);\n\nexport default QuickStartDrawerAsync;\n","import * as React from 'react';\nimport { AlertVariant } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore-next-line\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n AdmissionWebhookWarning,\n CoreState,\n getAdmissionWebhookWarnings,\n removeAdmissionWebhookWarning,\n} from '@console/dynamic-plugin-sdk/src';\nimport { documentationURLs, getDocumentationURL } from '@console/internal/components/utils';\nimport { useToast } from '@console/shared/src';\n\ntype UseAdmissionWebhookWarnings = () => Map<string, AdmissionWebhookWarning>;\nconst useAdmissionWebhookWarnings: UseAdmissionWebhookWarnings = () =>\n useSelector<CoreState, Map<string, AdmissionWebhookWarning>>(getAdmissionWebhookWarnings);\n\nexport const AdmissionWebhookWarningNotifications = () => {\n const { t } = useTranslation();\n const toastContext = useToast();\n const dispatch = useDispatch();\n const admissionWebhookWarnings = useAdmissionWebhookWarnings();\n React.useEffect(() => {\n const docURL = getDocumentationURL(documentationURLs.admissionWebhookWarning);\n admissionWebhookWarnings.forEach((warning, id) => {\n toastContext.addToast({\n variant: AlertVariant.warning,\n title: t('public~Admission Webhook Warning'),\n content: t(`{{kind}} {{name}} violates policy {{warning}}`, {\n kind: warning.kind,\n name: warning.name,\n warning: warning.warning,\n }),\n actions: [\n {\n dismiss: true,\n label: t('public~Learn more'),\n callback: () => {\n window.open(docURL, '_blank');\n },\n component: 'a',\n dataTest: 'admission-webhook-warning-learn-more',\n },\n ],\n timeout: true,\n dismissible: true,\n dataTest: 'admission-webhook-warning',\n });\n dispatch(removeAdmissionWebhookWarning(id));\n });\n }, [dispatch, admissionWebhookWarnings, t, toastContext]);\n\n return null;\n};\n","import * as React from 'react';\nimport { consoleFetchJSON as coFetchJSON } from '@console/dynamic-plugin-sdk/src/utils/fetch';\n\nexport const usePackageManifestCheck = (\n operatorName: string,\n operatorNamespace: string,\n): [boolean, boolean, string] => {\n const [pmExists, setPMExists] = React.useState<boolean>(false);\n const [loaded, setLoaded] = React.useState(false);\n const [errorMessage, setErrorMessage] = React.useState('');\n\n React.useEffect(() => {\n const url = `${window.SERVER_FLAGS.basePath}api/check-package-manifest/?name=${operatorName}&namespace=${operatorNamespace}`;\n coFetchJSON(url)\n .then(() => {\n setPMExists(true);\n setLoaded(true);\n setErrorMessage('');\n })\n .catch((err) => {\n setPMExists(false);\n setLoaded(true);\n setErrorMessage(\n `Error loading PackageManifest for ${operatorName} in ${operatorNamespace}: ${err}`,\n );\n });\n }, [operatorName, operatorNamespace]);\n\n return [pmExists, loaded, errorMessage];\n};\n","import * as React from 'react';\nimport './status-card.scss';\n\nconst HealthBody: React.FC = ({ children }) => (\n <div className=\"co-status-card__health-body\">{children}</div>\n);\n\nexport default HealthBody;\n","import * as React from 'react';\nimport { ChartAxis, ChartContainer } from '@patternfly/react-charts';\nimport { Flex, FlexItem, Grid } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { UtilizationBodyProps } from '@console/dynamic-plugin-sdk/src/api/internal-types';\nimport { timeFormatter } from '@console/internal/components/utils/datetime';\nimport { useRefWidth } from '@console/internal/components/utils/ref-width-hook';\nimport { useUtilizationDuration } from '../../../hooks/useUtilizationDuration';\n\nimport './utilization-card.scss';\n\nconst UtilizationAxis: React.FC = () => {\n const [containerRef, width] = useRefWidth();\n const { startDate, endDate } = useUtilizationDuration();\n\n const { t } = useTranslation();\n return (\n <div ref={containerRef}>\n <ChartAxis\n containerComponent={<ChartContainer title={t('console-shared~time axis')} />}\n domain={{ x: [startDate, endDate] }}\n tickFormat={timeFormatter.format}\n orientation=\"top\"\n height={15}\n width={width}\n padding={{ top: 30, bottom: 0, left: 70, right: 0 }}\n style={{\n axis: { visibility: 'hidden' },\n }}\n fixLabelOverlap\n />\n </div>\n );\n};\n\nexport const UtilizationBody: React.FC<UtilizationBodyProps> = ({ children }) => {\n const { t } = useTranslation();\n const axis = (\n <div className=\"co-utilization-card__item co-utilization-card__item-header\">\n <Flex\n justifyContent={{ default: 'justifyContentSpaceBetween' }}\n className=\"co-utilization-card__item-section co-u-hidden co-u-visible-on-xl\"\n >\n <FlexItem className=\"co-utilization-card__item-text\" data-test=\"utilization-card-item-text\">\n {t('console-shared~Resource')}\n </FlexItem>\n <FlexItem className=\"co-utilization-card__item-text\" data-test=\"utilization-card-item-text\">\n {t('console-shared~Usage')}\n </FlexItem>\n </Flex>\n <div className=\"co-utilization-card__item-chart co-utilization-card__item-chart--times\">\n <UtilizationAxis />\n </div>\n </div>\n );\n\n return (\n <div className=\"co-utilization-card__body\">\n <Grid>\n {axis}\n {children}\n </Grid>\n </div>\n );\n};\n\nexport default UtilizationBody;\n","import * as React from 'react';\nimport {\n Select as SelectDeprecated,\n SelectOption as SelectOptionDeprecated,\n SelectVariant as SelectVariantDeprecated,\n} from '@patternfly/react-core/deprecated';\nimport { useTranslation } from 'react-i18next';\nimport { UtilizationDurationDropdownProps } from '@console/dynamic-plugin-sdk/src/api/internal-types';\nimport { DurationKeys, DURATION_VALUES } from '../../../constants/duration';\nimport { useUtilizationDuration } from '../../../hooks';\n\nexport const UtilizationDurationDropdown: React.FC<UtilizationDurationDropdownProps> = ({\n adjustDuration,\n}) => {\n const [isOpen, setOpen] = React.useState(false);\n const { t } = useTranslation();\n const { selectedKey, updateSelectedKey, updateDuration } = useUtilizationDuration(adjustDuration);\n const items = {\n [DurationKeys.OneHour]: t('console-shared~1 hour'),\n [DurationKeys.SixHours]: t('console-shared~6 hours'),\n [DurationKeys.TwentyFourHours]: t('console-shared~24 hours'),\n };\n\n const onSelect = React.useCallback(\n (event, newSelected) => {\n updateSelectedKey(newSelected);\n updateDuration(DURATION_VALUES[newSelected]);\n setOpen(false);\n },\n [updateDuration, updateSelectedKey],\n );\n\n return (\n <div data-test-id=\"duration-select\">\n <SelectDeprecated\n variant={SelectVariantDeprecated.single}\n onToggle={(_event, isExpanded: boolean) => setOpen(isExpanded)}\n onSelect={onSelect}\n selections={selectedKey}\n isOpen={isOpen}\n isPlain\n >\n {Object.keys(items).map((key) => (\n <SelectOptionDeprecated key={key} value={key}>\n {items[key]}\n </SelectOptionDeprecated>\n ))}\n </SelectDeprecated>\n </div>\n );\n};\n","import * as React from 'react';\nimport { Grid, GridItem } from '@patternfly/react-core';\nimport { global_breakpoint_lg as breakpointLG } from '@patternfly/react-tokens/dist/js/global_breakpoint_lg';\nimport { OverviewGridCard, OverviewGridProps } from '@console/dynamic-plugin-sdk';\nimport { useRefWidth } from '@console/internal/components/utils/ref-width-hook';\n\nimport './dashboard.scss';\n\nconst mapCardsToGrid = (\n cards: OverviewGridCard[] = [],\n keyPrefix: string,\n ignoreCardSpan: boolean = false,\n): React.ReactNode[] =>\n cards.map(({ Card, span = 12 }, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <GridItem key={`${keyPrefix}-${index}`} span={ignoreCardSpan ? 12 : span}>\n <Card />\n </GridItem>\n ));\n\nconst DashboardGrid: React.FC<OverviewGridProps> = ({ mainCards, leftCards, rightCards }) => {\n const [containerRef, width] = useRefWidth();\n const smallGrid = !!width && width <= parseInt(breakpointLG.value, 10);\n\n const mainGridCards = React.useMemo(() => mapCardsToGrid(mainCards, 'main', smallGrid), [\n mainCards,\n smallGrid,\n ]);\n const leftGridCards = React.useMemo(() => mapCardsToGrid(leftCards, 'left', smallGrid), [\n leftCards,\n smallGrid,\n ]);\n const rightGridCards = React.useMemo(() => mapCardsToGrid(rightCards, 'right', smallGrid), [\n rightCards,\n smallGrid,\n ]);\n\n return (\n <div ref={containerRef}>\n {smallGrid ? (\n <Grid className=\"co-dashboard-grid\">\n <GridItem lg={12} md={12} sm={12}>\n <Grid className=\"co-dashboard-grid\">{mainGridCards}</Grid>\n </GridItem>\n <GridItem lg={12} md={12} sm={12}>\n <Grid className=\"co-dashboard-grid\">{leftGridCards}</Grid>\n </GridItem>\n <GridItem lg={12} md={12} sm={12}>\n <Grid className=\"co-dashboard-grid\">{rightGridCards}</Grid>\n </GridItem>\n </Grid>\n ) : (\n <Grid className=\"co-dashboard-grid\">\n <GridItem lg={3} md={3} sm={3}>\n <Grid className=\"co-dashboard-grid\">{leftGridCards}</Grid>\n </GridItem>\n <GridItem lg={6} md={6} sm={6}>\n <Grid className=\"co-dashboard-grid\">{mainGridCards}</Grid>\n </GridItem>\n <GridItem lg={3} md={3} sm={3}>\n <Grid className=\"co-dashboard-grid\">{rightGridCards}</Grid>\n </GridItem>\n </Grid>\n )}\n </div>\n );\n};\n\nexport default DashboardGrid;\n","import * as React from 'react';\nimport {\n EmptyState,\n EmptyStateVariant,\n EmptyStateIcon,\n EmptyStateBody,\n EmptyStateHeader,\n} from '@patternfly/react-core';\nimport { UnknownIcon } from '@patternfly/react-icons/dist/esm/icons/unknown-icon';\nimport { useTranslation } from 'react-i18next';\nimport { AlertsBodyProps } from '@console/dynamic-plugin-sdk/src/api/internal-types';\n\nconst AlertsBody: React.FC<AlertsBodyProps> = ({ error = false, children }) => {\n const { t } = useTranslation();\n return (\n (error || !!React.Children.toArray(children).length) && (\n <div className=\"co-status-card__alerts-body\">\n {error ? (\n <EmptyState variant={EmptyStateVariant.full} className=\"co-status-card__alerts-msg\">\n <EmptyStateHeader\n icon={<EmptyStateIcon className=\"co-status-card__alerts-icon\" icon={UnknownIcon} />}\n />\n <EmptyStateBody>{t('console-shared~Alerts could not be loaded.')}</EmptyStateBody>\n </EmptyState>\n ) : (\n children\n )}\n </div>\n )\n );\n};\nexport default AlertsBody;\n","import * as React from 'react';\nimport { Button, ButtonVariant } from '@patternfly/react-core';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from 'react-router-dom-v5-compat';\nimport { isAlertAction, AlertAction, useResolvedExtensions } from '@console/dynamic-plugin-sdk';\nimport { AlertItemProps } from '@console/dynamic-plugin-sdk/src/api/internal-types';\nimport { useModal } from '@console/dynamic-plugin-sdk/src/lib-core';\nimport { alertURL } from '@console/internal/components/monitoring/utils';\nimport { getAlertActions } from '@console/internal/components/notification-drawer';\nimport { ExternalLink } from '@console/internal/components/utils';\nimport { Timestamp } from '@console/internal/components/utils/timestamp';\nimport { RedExclamationCircleIcon, YellowExclamationTriangleIcon } from '../../status/icons';\nimport {\n getAlertSeverity,\n getAlertMessage,\n getAlertDescription,\n getAlertTime,\n getAlertSummary,\n getAlertName,\n} from './alert-utils';\n\nconst CriticalIcon = () => <RedExclamationCircleIcon title=\"Critical\" />;\nconst WarningIcon = () => <YellowExclamationTriangleIcon title=\"Warning\" />;\nconst getSeverityIcon = (severity: string) => {\n switch (severity) {\n case 'critical':\n return CriticalIcon;\n case 'warning':\n default:\n return WarningIcon;\n }\n};\n\nexport const StatusItem: React.FC<StatusItemProps> = ({\n name,\n documentationLink,\n Icon,\n timestamp,\n message,\n children,\n}) => {\n const { t } = useTranslation();\n return (\n <div className=\"co-status-card__alert-item\">\n <div className=\"co-status-card__alert-item-icon co-dashboard-icon\">\n <Icon />\n </div>\n <div className=\"co-status-card__alert-item-text\">\n <div className=\"co-status-card__alert-item-message\">\n {name && <span className=\"co-status-card__alert-item-header\">{name}</span>}\n {timestamp && (\n <div\n className=\"co-health-card__alert-item-timestamp co-status-card__health-item-text text-secondary\"\n data-test=\"timestamp\"\n >\n <Timestamp simple timestamp={timestamp} />\n </div>\n )}\n <span className=\"co-status-card__health-item-text co-break-word\">{message}</span>\n {documentationLink && (\n <ExternalLink\n additionalClassName=\"co-status-card__alert-item-doc-link\"\n href={documentationLink}\n >\n {t('console-shared~Go to documentation')}\n </ExternalLink>\n )}\n </div>\n {children && <div className=\"co-status-card__alert-item-more\">{children}</div>}\n </div>\n </div>\n );\n};\n\nconst AlertItem: React.FC<AlertItemProps> = ({ alert, documentationLink }) => {\n const { t } = useTranslation();\n const launchModal = useModal();\n const [actionExtensions] = useResolvedExtensions<AlertAction>(\n React.useCallback(\n (e): e is AlertAction => isAlertAction(e) && e.properties.alert === alert.rule.name,\n [alert],\n ),\n );\n const alertName = getAlertName(alert);\n const actionObj = getAlertActions(actionExtensions).get(alert.rule.name);\n const { text, action } = actionObj || {};\n return (\n <StatusItem\n Icon={getSeverityIcon(getAlertSeverity(alert))}\n timestamp={getAlertTime(alert)}\n message={getAlertDescription(alert) || getAlertMessage(alert) || getAlertSummary(alert)}\n documentationLink={documentationLink}\n name={alertName}\n >\n {text && action ? (\n <Button variant={ButtonVariant.link} onClick={() => action(alert, launchModal)} isInline>\n {text}\n </Button>\n ) : (\n <Link to={alertURL(alert, alert.rule.id)}>{t('console-shared~View details')}</Link>\n )}\n </StatusItem>\n );\n};\n\nexport default AlertItem;\n\ntype StatusItemProps = {\n Icon: React.ComponentType<any>;\n timestamp?: string;\n message: string;\n name?: string;\n documentationLink?: string;\n};\n","import * as React from 'react';\nimport { Button, Popover, PopoverPosition } from '@patternfly/react-core';\nimport classNames from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport { HealthItemProps } from '@console/dynamic-plugin-sdk/src/api/internal-types';\nimport { SecondaryStatus } from '../../status';\nimport { HealthState, healthStateMapping, healthStateMessage } from './states';\n\nconst HealthItemIcon: React.FC<HealthItemIconProps> = ({ state, dataTest }) => (\n <div data-test={dataTest} className=\"co-dashboard-icon\">\n {(healthStateMapping[state] || healthStateMapping[HealthState.UNKNOWN]).icon}\n </div>\n);\n\nconst HealthItem: React.FC<HealthItemProps> = React.memo(\n ({\n className,\n state,\n title,\n details,\n popupTitle,\n popupClassname,\n popupBodyContent,\n popupKeepOnOutsideClick = false,\n noIcon = false,\n icon,\n children,\n }) => {\n const { t } = useTranslation();\n\n const detailMessage = details || healthStateMessage(state, t);\n\n return (\n <div\n className={classNames('co-status-card__health-item', className)}\n data-item-id={`${title}-health-item`}\n >\n {state === HealthState.LOADING ? (\n <div className=\"skeleton-health\">\n <span className=\"pf-v5-u-screen-reader\">\n {t('public~Loading {{title}} status', { title })}\n </span>\n </div>\n ) : (\n !noIcon &&\n (icon || <HealthItemIcon state={state} dataTest={`${title}-health-item-icon`} />)\n )}\n <div>\n <span className=\"co-status-card__health-item-text\">\n {(React.Children.toArray(children).length || popupBodyContent) &&\n state !== HealthState.LOADING ? (\n <Popover\n className={popupClassname}\n position={PopoverPosition.top}\n headerContent={popupTitle}\n bodyContent={popupBodyContent || children}\n enableFlip\n maxWidth=\"21rem\"\n hideOnOutsideClick={!popupKeepOnOutsideClick}\n >\n <Button\n variant=\"link\"\n isInline\n className=\"co-status-card__popup\"\n data-test={`${title}`}\n >\n {title}\n </Button>\n </Popover>\n ) : (\n title\n )}\n </span>\n {state !== HealthState.LOADING && detailMessage && (\n <SecondaryStatus\n status={detailMessage}\n className=\"co-status-card__health-item-text\"\n dataStatusID={`${title}-secondary-status`}\n />\n )}\n </div>\n </div>\n );\n },\n);\n\nexport default HealthItem;\n\ntype HealthItemIconProps = {\n state?: HealthState;\n dataTest?: string;\n};\n","import * as React from 'react';\nimport {\n Accordion,\n AccordionItem,\n AccordionToggle,\n AccordionContent,\n} from '@patternfly/react-core';\nimport { InProgressIcon } from '@patternfly/react-icons/dist/esm/icons/in-progress-icon';\nimport { QuestionCircleIcon } from '@patternfly/react-icons/dist/esm/icons/question-circle-icon';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from 'react-router-dom-v5-compat';\nimport {\n useResolvedExtensions,\n DashboardsInventoryItemGroup as DynamicDashboardsInventoryItemGroup,\n isDashboardsInventoryItemGroup as isDynamicDashboardsInventoryItemGroup,\n} from '@console/dynamic-plugin-sdk';\nimport { ResourceInventoryItemProps } from '@console/dynamic-plugin-sdk/src/api/internal-types';\nimport { pluralize } from '@console/internal/components/utils';\nimport { resourcePathFromModel } from '@console/internal/components/utils/resource-link';\nimport { K8sResourceKind, K8sKind, K8sResourceCommon } from '@console/internal/module/k8s';\nimport {\n useExtensions,\n DashboardsInventoryItemGroup,\n isDashboardsInventoryItemGroup,\n} from '@console/plugin-sdk';\nimport { RedExclamationCircleIcon, YellowExclamationTriangleIcon } from '../../status/icons';\nimport InventoryItemNew, {\n InventoryItemStatus,\n InventoryItemBody,\n InventoryItemLoading,\n} from './InventoryCard';\nimport { InventoryStatusGroup } from './status-group';\nimport './inventory-card.scss';\n\nconst defaultStatusGroupIcons = {\n [InventoryStatusGroup.WARN]: <YellowExclamationTriangleIcon />,\n [InventoryStatusGroup.ERROR]: <RedExclamationCircleIcon />,\n [InventoryStatusGroup.PROGRESS]: (\n <InProgressIcon className=\"co-inventory-card__status-icon--progress\" />\n ),\n [InventoryStatusGroup.UNKNOWN]: (\n <QuestionCircleIcon className=\"co-inventory-card__status-icon--question\" />\n ),\n};\n\nconst getStatusGroupIcons = (groups: DashboardsInventoryItemGroup['properties'][]) => {\n const groupStatusIcons = { ...defaultStatusGroupIcons };\n groups.forEach((group) => {\n if (!groupStatusIcons[group.id]) {\n groupStatusIcons[group.id] = group.icon;\n }\n });\n return groupStatusIcons;\n};\n\nconst getTop3Groups = (\n groups: DashboardsInventoryItemGroup['properties'][],\n groupIDs: string[],\n) => {\n const groupStatuses: (InventoryStatusGroup | string)[] = [\n InventoryStatusGroup.ERROR,\n InventoryStatusGroup.WARN,\n InventoryStatusGroup.PROGRESS,\n ];\n groups.forEach((group) => {\n if (!groupStatuses.includes(group.id)) {\n groupStatuses.push(group.id);\n }\n });\n groupStatuses.push(InventoryStatusGroup.UNKNOWN);\n return groupIDs.sort((a, b) => groupStatuses.indexOf(a) - groupStatuses.indexOf(b)).slice(0, 3);\n};\n\nexport const InventoryItem: React.FC<InventoryItemProps> = React.memo(\n ({\n isLoading,\n title,\n titlePlural,\n count,\n children,\n error = false,\n TitleComponent,\n ExpandedComponent,\n dataTest,\n }) => {\n const { t } = useTranslation();\n const [expanded, setExpanded] = React.useState(false);\n const onClick = React.useCallback(() => setExpanded(!expanded), [expanded]);\n const titleMessage = pluralize(count, title, titlePlural, !isLoading && !error);\n return ExpandedComponent ? (\n <Accordion\n asDefinitionList={false}\n headingLevel=\"h5\"\n className=\"co-inventory-card__accordion\"\n >\n <AccordionItem>\n <AccordionToggle\n onClick={onClick}\n isExpanded={expanded}\n id={title}\n className=\"co-inventory-card__accordion-toggle\"\n >\n <InventoryItemNew>\n <div\n className=\"co-inventory-card__item-title\"\n data-test={!TitleComponent ? dataTest : null}\n >\n {isLoading && !error && <div className=\"skeleton-inventory\" />}\n {TitleComponent ? <TitleComponent>{titleMessage}</TitleComponent> : titleMessage}\n </div>\n {!expanded && (error || !isLoading) && (\n <div className=\"co-inventory-card__item-status\">\n {error ? (\n <div className=\"text-secondary\">{t('console-shared~Not available')}</div>\n ) : (\n children\n )}\n </div>\n )}\n </InventoryItemNew>\n </AccordionToggle>\n <AccordionContent isHidden={!expanded} className=\"co-inventory-card__accordion-body\">\n <ExpandedComponent />\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n ) : (\n <InventoryItemNew>\n <div\n className=\"co-inventory-card__item-title\"\n data-test={!TitleComponent ? dataTest : null}\n >\n {isLoading && !error && <InventoryItemLoading />}\n {TitleComponent ? <TitleComponent>{titleMessage}</TitleComponent> : titleMessage}\n </div>\n <InventoryItemBody error={error}>{children}</InventoryItemBody>\n </InventoryItemNew>\n );\n },\n);\n\nexport const Status: React.FC<StatusProps> = ({ groupID, count }) => {\n const groupExtensions = useExtensions<DashboardsInventoryItemGroup>(\n isDashboardsInventoryItemGroup,\n );\n const [dynamicGroupExtensions] = useResolvedExtensions<DynamicDashboardsInventoryItemGroup>(\n isDynamicDashboardsInventoryItemGroup,\n );\n\n const statusGroupIcons = React.useMemo(() => {\n const mergedExtensions = [...groupExtensions, ...dynamicGroupExtensions].map(\n (e) => e.properties,\n );\n return getStatusGroupIcons(mergedExtensions);\n }, [dynamicGroupExtensions, groupExtensions]);\n\n if (groupID === InventoryStatusGroup.NOT_MAPPED || !count) {\n return null;\n }\n\n const groupIcon = statusGroupIcons[groupID] || statusGroupIcons[InventoryStatusGroup.UNKNOWN];\n\n return <InventoryItemStatus count={count} icon={groupIcon} />;\n};\n\nconst StatusLink: React.FC<StatusLinkProps> = ({\n groupID,\n count,\n statusIDs,\n kind,\n namespace,\n filterType,\n basePath,\n}) => {\n const groupExtensions = useExtensions<DashboardsInventoryItemGroup>(\n isDashboardsInventoryItemGroup,\n );\n\n const [dynamicGroupExtensions] = useResolvedExtensions<DynamicDashboardsInventoryItemGroup>(\n isDynamicDashboardsInventoryItemGroup,\n );\n\n const statusGroupIcons = React.useMemo(() => {\n const mergedExtensions = [...groupExtensions, ...dynamicGroupExtensions].map(\n (e) => e.properties,\n );\n return getStatusGroupIcons(mergedExtensions);\n }, [dynamicGroupExtensions, groupExtensions]);\n\n if (groupID === InventoryStatusGroup.NOT_MAPPED || !count) {\n return null;\n }\n\n const groupIcon = statusGroupIcons[groupID] || statusGroupIcons[InventoryStatusGroup.NOT_MAPPED];\n const statusItems = encodeURIComponent(statusIDs.join(','));\n const path = basePath || resourcePathFromModel(kind, null, namespace);\n const to =\n filterType && statusItems.length > 0 ? `${path}?rowFilter-${filterType}=${statusItems}` : path;\n\n return <InventoryItemStatus count={count} icon={groupIcon} linkTo={to} />;\n};\n\nconst ResourceTitleComponent: React.FC<ResourceTitleComponentComponent> = ({\n kind,\n namespace,\n children,\n basePath,\n dataTest,\n}) => (\n <Link to={basePath || resourcePathFromModel(kind, null, namespace)} data-test={dataTest}>\n {children}\n </Link>\n);\n\nexport const ResourceInventoryItem: React.FC<ResourceInventoryItemProps> = ({\n kind,\n TitleComponent,\n title,\n titlePlural,\n resources = [],\n additionalResources,\n isLoading,\n mapper,\n namespace,\n error,\n showLink = true,\n ExpandedComponent,\n basePath,\n dataTest,\n}) => {\n const { t } = useTranslation();\n let Title: React.ComponentType = React.useCallback(\n (props) => (\n <ResourceTitleComponent\n kind={kind}\n namespace={namespace}\n basePath={basePath}\n dataTest={dataTest}\n {...props}\n />\n ),\n [kind, namespace, basePath, dataTest],\n );\n\n if (TitleComponent) Title = TitleComponent;\n\n const groupExtensions = useExtensions<DashboardsInventoryItemGroup>(\n isDashboardsInventoryItemGroup,\n );\n const [dynamicGroupExtensions] = useResolvedExtensions<DynamicDashboardsInventoryItemGroup>(\n isDynamicDashboardsInventoryItemGroup,\n );\n\n const groups = React.useMemo(() => (mapper ? mapper(resources, additionalResources) : {}), [\n mapper,\n resources,\n additionalResources,\n ]);\n\n const top3Groups = React.useMemo(() => {\n const mergedExtensions = [...groupExtensions, ...dynamicGroupExtensions].map(\n (e) => e.properties,\n );\n return getTop3Groups(\n mergedExtensions,\n Object.keys(groups).filter((key) => groups[key].count > 0),\n );\n }, [dynamicGroupExtensions, groupExtensions, groups]);\n\n // The count can depend on additionalResources (like mixing of VM and VMI for kubevirt-plugin)\n const totalCount = React.useMemo(\n () =>\n mapper\n ? Object.keys(groups).reduce((acc, cur) => groups[cur].count + acc, 0)\n : resources.length,\n [mapper, groups, resources],\n );\n\n const titleLabel = title || (kind.labelKey ? t(kind.labelKey) : kind.label);\n const titlePluralLabel =\n titlePlural || (kind.labelPluralKey ? t(kind.labelPluralKey) : kind.labelPlural);\n\n return (\n <InventoryItem\n isLoading={isLoading}\n title={titleLabel}\n titlePlural={titlePluralLabel}\n count={totalCount}\n error={error}\n TitleComponent={showLink ? Title : null}\n ExpandedComponent={ExpandedComponent}\n dataTest={dataTest}\n >\n {top3Groups.map((key) =>\n showLink ? (\n <StatusLink\n key={key}\n kind={kind}\n namespace={namespace}\n groupID={key}\n count={groups[key].count}\n statusIDs={groups[key].statusIDs}\n filterType={groups[key].filterType}\n basePath={basePath}\n />\n ) : (\n <Status key={key} groupID={key} count={groups[key].count} />\n ),\n )}\n </InventoryItem>\n );\n};\n\nexport default InventoryItem;\n\ntype StatusGroup = {\n [key in InventoryStatusGroup | string]: {\n filterType?: string;\n statusIDs: string[];\n count: number;\n };\n};\n\nexport type StatusGroupMapper<\n T extends K8sResourceCommon = K8sResourceCommon,\n R extends { [key: string]: K8sResourceCommon[] } = { [key: string]: K8sResourceCommon[] }\n> = (resources: T[], additionalResources?: R) => StatusGroup;\n\ntype InventoryItemProps = {\n isLoading: boolean;\n title: string;\n titlePlural?: string;\n count: number;\n children?: React.ReactNode;\n error?: boolean;\n TitleComponent?: React.ComponentType<{}>;\n ExpandedComponent?: React.ComponentType<{}>;\n dataTest?: string;\n};\n\ntype StatusProps = {\n groupID: InventoryStatusGroup | string;\n count: number;\n};\n\ntype StatusLinkProps = StatusProps & {\n statusIDs: string[];\n kind: K8sKind;\n namespace?: string;\n filterType?: string;\n basePath?: string;\n};\n\nexport type ExpandedComponentProps = {\n resource: K8sResourceKind[];\n additionalResources?: { [key: string]: K8sResourceKind[] };\n};\n\ntype ResourceTitleComponentComponent = {\n kind: K8sKind;\n namespace: string;\n basePath?: string;\n dataTest?: string;\n};\n","import * as React from 'react';\nimport './details-card.scss';\nimport { DetailsBodyProps } from '@console/dynamic-plugin-sdk/src/api/internal-types';\n\nconst DetailsBody: React.FC<DetailsBodyProps> = ({ children }) => (\n <dl className=\"co-details-card__body\">{children}</dl>\n);\n\nexport default DetailsBody;\n","import * as React from 'react';\nimport { Flex, FlexItem } from '@patternfly/react-core';\nimport * as _ from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { Humanize, TopConsumerPopoverProps, LIMIT_STATE } from '@console/dynamic-plugin-sdk';\nimport { UtilizationItemProps } from '@console/dynamic-plugin-sdk/src/api/internal-types';\nimport { ColoredIconProps } from '@console/dynamic-plugin-sdk/src/app/components/status/icons';\nimport { DataPoint } from '@console/internal/components/graphs';\nimport {\n AreaChart,\n AreaChartStatus,\n chartStatusColors,\n} from '@console/internal/components/graphs/area';\nimport { mapLimitsRequests } from '@console/internal/components/graphs/utils';\nimport { ByteDataTypes } from '../../../graph-helper/data-utils';\nimport { useUtilizationDuration } from '../../../hooks';\nimport { YellowExclamationTriangleIcon, RedExclamationCircleIcon } from '../../status';\n\nconst lastTimeInSeries = (series: DataPoint[]) => new Date(_.last(series)?.x ?? 0).getTime();\nconst getMaxDate = (data: DataPoint[][]) =>\n new Date(Math.max(...(data?.map?.(lastTimeInSeries) ?? [])) ?? 0);\n\nexport const MultilineUtilizationItem: React.FC<MultilineUtilizationItemProps> = React.memo(\n ({\n title,\n data,\n dataUnits,\n humanizeValue,\n isLoading = false,\n queries,\n error,\n TopConsumerPopovers,\n byteDataType,\n }) => {\n const { t } = useTranslation();\n const { endDate, startDate, updateEndDate } = useUtilizationDuration();\n\n const getCurrentData = (\n description: string,\n originalData?: DataPoint[],\n dataUnitsValue?: string,\n ): string => {\n let current: string;\n if (originalData && originalData.length > 0) {\n const latestData = originalData[originalData.length - 1];\n current = humanizeValue(latestData.y).string;\n if (dataUnitsValue) {\n current += ` ${dataUnitsValue}`;\n }\n if (description === 'in') {\n current = t('console-shared~{{amount}} in', { amount: current });\n } else if (description === 'out') {\n current = t('console-shared~{{amount}} out', { amount: current });\n } else {\n current += ` ${description.toLowerCase()}`;\n }\n }\n\n return current;\n };\n\n const current = data.map((datum, index) =>\n getCurrentData(queries[index].desc, datum, dataUnits && dataUnits[index]),\n );\n const maxDate = getMaxDate(data);\n React.useEffect(() => updateEndDate(maxDate), [maxDate, updateEndDate]);\n\n const mapTranslatedData = (originalData: DataPoint[][]) => {\n if (!originalData || originalData.length === 0 || originalData[0].length === 0)\n return originalData;\n const translatedData = [];\n\n for (const query of originalData) {\n const currData = [];\n const desc = query[0].description;\n for (const item of query) {\n if (desc === 'in') {\n currData.push({ ...item, description: t('console-shared~in') });\n } else if (desc === 'out') {\n currData.push({ ...item, description: t('console-shared~out') });\n } else {\n currData.push(item);\n }\n }\n translatedData.push(currData);\n }\n return translatedData;\n };\n\n const translatedData = mapTranslatedData(data);\n const chart = (\n <AreaChart\n data={error ? [[]] : translatedData}\n domain={{ x: [startDate, endDate] }}\n loading={!error && isLoading}\n query={queries.map((q) => q.query)}\n xAxis={false}\n humanize={humanizeValue}\n padding={{ top: 13, left: 70, bottom: 0, right: 0 }}\n height={70}\n byteDataType={byteDataType}\n showAllTooltip\n ariaChartLinkLabel={t('console-shared~View {{title}} metrics in query browser', {\n title,\n })}\n ariaChartTitle={title}\n />\n );\n\n const currentValue = current.map((curr, index) => {\n const TopConsumerPopover = TopConsumerPopovers && TopConsumerPopovers[index];\n return TopConsumerPopover ? (\n <TopConsumerPopover key={queries[index].desc} current={curr} />\n ) : (\n <div key={queries[index].desc}>{curr}</div>\n );\n });\n\n return (\n <div className=\"co-utilization-card__item\" data-test-id=\"utilization-item\">\n <div className=\"co-utilization-card__item-description\">\n <div className=\"co-utilization-card__item-section-multiline\">\n <h4 className=\"pf-v5-c-title pf-m-md\" data-test=\"utilization-item-title\">\n {title}\n </h4>\n {error || (!isLoading && !(data.length && data.every((datum) => datum.length))) ? (\n <div className=\"text-secondary\">{t('console-shared~Not available')}</div>\n ) : (\n <div className=\"co-utilization-card__item-description\">{currentValue}</div>\n )}\n </div>\n </div>\n <div className=\"co-utilization-card__item-chart\">{chart}</div>\n </div>\n );\n },\n);\n\n// TODO (jon) Fix PrometheusMultilineUtilization so that x-values returned from multiple prometheus\n// queries are \"synced\" on the x-axis (same number of points with the same x-values). In order to do\n// so, we have to make sure that the same end time, samples, and duration are used across all\n// queries. This is a temporary work around. See https://issues.redhat.com/browse/CONSOLE-2424\nexport const trimSecondsXMutator = (x) => {\n const d = new Date(x * 1000);\n d.setSeconds(0, 0);\n return d;\n};\n\nexport const UtilizationItem: React.FC<UtilizationItemProps> = React.memo(\n ({\n title,\n utilization,\n humanizeValue,\n isLoading = false,\n query,\n error,\n max = null,\n TopConsumerPopover,\n byteDataType,\n limit,\n requested,\n setLimitReqState,\n }) => {\n const { t } = useTranslation();\n const { startDate, endDate, updateEndDate } = useUtilizationDuration();\n const { data, chartStyle } = mapLimitsRequests(\n utilization,\n limit,\n requested,\n trimSecondsXMutator,\n );\n const [utilizationData, limitData, requestedData] = data;\n const maxDate = getMaxDate([utilizationData]);\n React.useEffect(() => updateEndDate(maxDate), [updateEndDate, maxDate]);\n const current = utilizationData?.length ? utilizationData[utilizationData.length - 1].y : null;\n\n let humanMax: string;\n let humanAvailable: string;\n if (max) {\n const currentUtilization = current ?? 0;\n const percentage = (100 * currentUtilization) / max;\n humanMax = humanizeValue(max).string;\n\n if (percentage >= 90) {\n chartStyle[0] = { data: { fill: chartStatusColors[AreaChartStatus.ERROR] } };\n } else if (percentage >= 80) {\n chartStyle[0] = { data: { fill: chartStatusColors[AreaChartStatus.WARNING] } };\n }\n\n humanAvailable = humanizeValue(max - currentUtilization).string;\n }\n\n const chart = (\n <AreaChart\n domain={{ x: [startDate, endDate] }}\n ariaChartLinkLabel={t('console-shared~View {{title}} metrics in query browser', {\n title,\n })}\n ariaChartTitle={title}\n data={data}\n loading={!error && isLoading}\n query={query}\n xAxis={false}\n // Todo(bipuladh): Make huamnize type Humanize once unit.js is converted\n humanize={humanizeValue as Humanize}\n padding={{ top: 13, left: 70, bottom: 0, right: 0 }}\n height={70}\n chartStyle={chartStyle}\n byteDataType={byteDataType}\n mainDataName=\"usage\"\n />\n );\n\n let LimitIcon: React.ComponentType<ColoredIconProps>;\n let humanLimit: string;\n let limitState = LIMIT_STATE.OK;\n let requestedState = LIMIT_STATE.OK;\n\n const latestLimit = limitData?.length ? limitData[limitData.length - 1].y : null;\n const latestRequested = requestedData?.length\n ? requestedData[requestedData.length - 1].y\n : null;\n\n if (max) {\n if (latestLimit && latestRequested) {\n humanLimit = humanizeValue(latestLimit).string;\n const limitPercentage = (100 * latestLimit) / max;\n const reqPercentage = (100 * latestRequested) / max;\n if (limitPercentage > 100) {\n limitState = LIMIT_STATE.ERROR;\n } else if (limitPercentage >= 75) {\n limitState = LIMIT_STATE.WARN;\n }\n if (reqPercentage > 100) {\n requestedState = LIMIT_STATE.ERROR;\n } else if (reqPercentage >= 75) {\n requestedState = LIMIT_STATE.WARN;\n }\n if ([limitState, requestedState].includes(LIMIT_STATE.ERROR)) {\n LimitIcon = RedExclamationCircleIcon;\n } else if ([limitState, requestedState].includes(LIMIT_STATE.WARN)) {\n LimitIcon = YellowExclamationTriangleIcon;\n }\n setLimitReqState && setLimitReqState({ limit: limitState, requested: requestedState });\n }\n }\n\n const currentHumanized = !_.isNil(current) ? humanizeValue(current).string : null;\n\n return (\n <div className=\"co-utilization-card__item\" data-test-id=\"utilization-item\">\n <div className=\"co-utilization-card__item-description\">\n <Flex\n justifyContent={{ default: 'justifyContentSpaceBetween' }}\n className=\"co-utilization-card__item-section\"\n >\n <FlexItem>\n <h4 className=\"pf-v5-c-title pf-m-md\" data-test=\"utilization-item-title\">\n {title}\n </h4>\n </FlexItem>\n <FlexItem>\n {error || (!isLoading && !utilizationData?.length) ? (\n <div className=\"text-secondary\">{t('console-shared~Not available')}</div>\n ) : (\n <div>\n {LimitIcon && <LimitIcon className=\"co-utilization-card__item-icon\" />}\n {TopConsumerPopover ? (\n <TopConsumerPopover\n current={currentHumanized}\n limit={!_.isNil(latestLimit) ? humanizeValue(latestLimit).string : null}\n requested={\n !_.isNil(latestRequested) ? humanizeValue(latestRequested).string : null\n }\n available={humanAvailable}\n total={humanMax}\n limitState={limitState}\n requestedState={requestedState}\n />\n ) : (\n currentHumanized\n )}\n </div>\n )}\n </FlexItem>\n </Flex>\n {!error && (humanAvailable || humanLimit) && (\n <Flex\n justifyContent={{ default: 'justifyContentSpaceBetween' }}\n className=\"co-utilization-card__item-section\"\n >\n <FlexItem\n className=\"co-utilization-card__item-text\"\n data-test=\"utilization-card-item-text\"\n >\n {humanAvailable && humanMax && (\n <>\n {t('console-shared~{{humanAvailable}} available of {{humanMax}}', {\n humanAvailable,\n humanMax,\n })}\n </>\n )}\n {humanAvailable && !humanMax && (\n <>\n {t('console-shared~{{humanAvailable}} available', {\n humanAvailable,\n })}\n </>\n )}\n </FlexItem>\n {humanLimit && (\n <FlexItem\n className=\"co-utilization-card__item-text\"\n data-test=\"utilization-card-item-text\"\n >\n <>\n {t('console-shared~{{humanLimit}} total limit', {\n humanLimit,\n })}\n </>\n </FlexItem>\n )}\n </Flex>\n )}\n </div>\n <div className=\"co-utilization-card__item-chart\">{chart}</div>\n </div>\n );\n },\n);\n\nexport default UtilizationItem;\n\nexport type LimitRequested = {\n limit: LIMIT_STATE;\n requested: LIMIT_STATE;\n};\n\ntype MultilineUtilizationItemProps = {\n title: string;\n data?: DataPoint[][];\n dataUnits?: string[];\n dataDescription?: string[];\n isLoading: boolean;\n humanizeValue: Humanize;\n queries: QueryWithDescription[];\n error: boolean;\n byteDataType?: ByteDataTypes;\n TopConsumerPopovers?: React.ComponentType<TopConsumerPopoverProps>[];\n};\n\nexport type QueryWithDescription = {\n query: string;\n desc: string;\n};\n","import * as React from 'react';\nimport { Progress, ProgressSize } from '@patternfly/react-core';\nimport { InProgressIcon } from '@patternfly/react-icons/dist/esm/icons/in-progress-icon';\nimport classNames from 'classnames';\nimport { ActivityItemProps } from '@console/dynamic-plugin-sdk/src/api/internal-types';\n\nexport const ActivityProgress: React.FC<ActivityProgressProps> = ({\n title,\n progress,\n children,\n}) => (\n <>\n <Progress\n value={progress}\n title={title}\n size={ProgressSize.sm}\n className=\"co-activity-item__progress\"\n />\n <div>{children}</div>\n </>\n);\n\nconst ActivityItem: React.FC<ActivityItemProps> = ({ children, className }) => (\n <>\n <div className={classNames('co-activity-item', className)}>\n <InProgressIcon className=\"co-dashboard-icon co-activity-item__icon\" />\n {children}\n </div>\n </>\n);\n\nexport default ActivityItem;\n\ntype ActivityProgressProps = {\n title: string;\n progress: number;\n};\n","import * as React from 'react';\nimport { ResourceYAMLEditorProps } from '@console/dynamic-plugin-sdk';\n\nexport const AsyncResourceYAMLEditor: React.FC<ResourceYAMLEditorProps> = React.lazy(() =>\n import('@console/internal/components/droppable-edit-yaml').then((m) => ({\n default: m.ResourceYAMLEditor,\n })),\n);\n","/**\n * @file Entrypoint for the `@openshift-console/dynamic-plugin-sdk-internal` package published to npmjs.\n *\n * Internal package exposing additional code.\n */\n\nexport * from './api/internal-api';\n","import * as React from 'react';\nimport { UseDeleteModal } from '@console/dynamic-plugin-sdk/src';\nimport { ModalComponent } from '@console/dynamic-plugin-sdk/src/app/modal-support/ModalProvider';\nimport { useModal } from '@console/dynamic-plugin-sdk/src/app/modal-support/useModal';\nimport { useK8sModel } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sModel';\nimport { getGroupVersionKindForResource } from '@console/dynamic-plugin-sdk/src/utils/k8s/k8s-ref';\nimport { ModalWrapper } from '@console/internal/components/factory/modal';\nimport { DeleteModal, DeleteModalProps } from '@console/internal/components/modals/delete-modal';\n\nconst DeleteModalComponent: ModalComponent<DeleteModalProps> = ({\n btnText,\n closeModal,\n deleteAllResources,\n kind,\n message,\n redirectTo,\n resource,\n}) => {\n return (\n <ModalWrapper blocking onClose={closeModal}>\n <DeleteModal\n kind={kind}\n resource={resource}\n btnText={btnText}\n cancel={closeModal}\n close={closeModal}\n deleteAllResources={deleteAllResources}\n message={message}\n redirectTo={redirectTo}\n />\n </ModalWrapper>\n );\n};\n\nexport const useDeleteModal: UseDeleteModal = (\n resource,\n redirectTo,\n message,\n btnText,\n deleteAllResources,\n) => {\n const launcher = useModal();\n const groupVersionKind = getGroupVersionKindForResource(resource);\n const [kind] = useK8sModel(groupVersionKind);\n return React.useCallback(\n () =>\n resource &&\n kind &&\n launcher<DeleteModalProps>(DeleteModalComponent, {\n kind,\n resource,\n redirectTo,\n message,\n btnText,\n deleteAllResources,\n }),\n [resource, kind, launcher, btnText, deleteAllResources, message, redirectTo],\n );\n};\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { render } from 'react-dom';\nimport { Helmet } from 'react-helmet';\nimport { linkify } from 'react-linkify';\nimport { Provider, useSelector, useDispatch } from 'react-redux';\nimport { Router } from 'react-router-dom';\nimport { useParams, useLocation, CompatRouter, Routes, Route } from 'react-router-dom-v5-compat';\n// AbortController is not supported in some older browser versions\nimport 'abort-controller/polyfill';\nimport store, { applyReduxExtensions } from '../redux';\nimport { useTranslation } from 'react-i18next';\nimport { coFetchJSON, appInternalFetch } from '../co-fetch';\nimport { detectFeatures, setFlag } from '../actions/features';\nimport AppContents from './app-contents';\nimport { getBrandingDetails, Masthead } from './masthead';\nimport { ConsoleNotifier } from './console-notifier';\nimport { ConnectedNotificationDrawer } from './notification-drawer';\nimport { Navigation } from '@console/app/src/components/nav';\nimport { history, AsyncComponent, LoadingBox, useSafeFetch, usePoll } from './utils';\nimport * as UIActions from '../actions/ui';\nimport { fetchSwagger, getCachedResources } from '../module/k8s';\nimport { receivedResources, startAPIDiscovery } from '../actions/k8s';\nimport { pluginStore } from '../plugins';\n// cloud shell imports must come later than features\nimport CloudShell from '@console/webterminal-plugin/src/components/cloud-shell/CloudShell';\nimport CloudShellTab from '@console/webterminal-plugin/src/components/cloud-shell/CloudShellTab';\nimport DetectPerspective from '@console/app/src/components/detect-perspective/DetectPerspective';\nimport DetectNamespace from '@console/app/src/components/detect-namespace/DetectNamespace';\nimport DetectLanguage from '@console/app/src/components/detect-language/DetectLanguage';\nimport FeatureFlagExtensionLoader from '@console/app/src/components/flags/FeatureFlagExtensionLoader';\nimport { useExtensions } from '@console/plugin-sdk';\nimport {\n useResolvedExtensions,\n isContextProvider,\n isReduxReducer,\n isStandaloneRoutePage,\n AppInitSDK,\n getUser,\n useActivePerspective,\n} from '@console/dynamic-plugin-sdk';\nimport { initConsolePlugins } from '@console/dynamic-plugin-sdk/src/runtime/plugin-init';\nimport { GuidedTour } from '@console/app/src/components/tour';\nimport QuickStartDrawer from '@console/app/src/components/quick-starts/QuickStartDrawerAsync';\nimport { ModalProvider } from '@console/dynamic-plugin-sdk/src/app/modal-support/ModalProvider';\nimport { settleAllPromises } from '@console/dynamic-plugin-sdk/src/utils/promise';\nimport ToastProvider from '@console/shared/src/components/toast/ToastProvider';\nimport { useToast } from '@console/shared/src/components/toast';\nimport { useTelemetry } from '@console/shared/src/hooks/useTelemetry';\nimport { useDebounceCallback } from '@console/shared/src/hooks/debounce';\nimport { LOGIN_ERROR_PATH } from '@console/internal/module/auth';\nimport { URL_POLL_DEFAULT_DELAY } from '@console/internal/components/utils/url-poll-hook';\nimport { FLAGS } from '@console/shared';\nimport { useFlag } from '@console/shared/src/hooks/flag';\nimport Lightspeed from '@console/app/src/components/lightspeed/Lightspeed';\nimport { ThemeProvider } from './ThemeProvider';\nimport { init as initI18n } from '../i18n';\nimport { Page, SkipToContent, AlertVariant } from '@patternfly/react-core'; // PF4 Imports\nimport { AuthenticationErrorPage } from './error';\nimport '../vendor.scss';\nimport '../style.scss';\nimport '@patternfly/quickstarts/dist/quickstarts.min.css';\n// load dark theme here as MiniCssExtractPlugin ignores load order of sass and dark theme must load after all other css\nimport '@patternfly/patternfly/patternfly-charts-theme-dark.css';\n\nconst PF_BREAKPOINT_MD = 768;\nconst PF_BREAKPOINT_XL = 1200;\nconst NOTIFICATION_DRAWER_BREAKPOINT = 1800;\n// Edge lacks URLSearchParams\nimport 'url-search-params-polyfill';\nimport { withoutSensitiveInformations, getTelemetryTitle } from './utils/telemetry';\nimport { graphQLReady } from '../graphql/client';\nimport { AdmissionWebhookWarningNotifications } from '@console/app/src/components/admission-webhook-warnings/AdmissionWebhookWarningNotifications';\nimport { usePackageManifestCheck } from '@console/shared/src/hooks/usePackageManifestCheck';\n\ninitI18n();\n\n// Disable linkify 'fuzzy links' across the app.\n// Only linkify url strings beginning with a proper protocol scheme.\nlinkify.set({ fuzzyLink: false });\n\nconst EnhancedProvider = ({ provider: ContextProvider, useValueHook, children }) => {\n const value = useValueHook();\n return <ContextProvider value={value}>{children}</ContextProvider>;\n};\n\nconst App = (props) => {\n const { contextProviderExtensions } = props;\n\n const location = useLocation();\n const params = useParams();\n\n const isLargeLayout = () => {\n return window.innerWidth >= NOTIFICATION_DRAWER_BREAKPOINT;\n };\n\n const isDesktop = () => {\n return window.innerWidth >= PF_BREAKPOINT_XL;\n };\n\n const isMobile = () => {\n return window.innerWidth < PF_BREAKPOINT_MD;\n };\n\n const [prevLocation, setPrevLocation] = React.useState(location);\n const [prevParams, setPrevParams] = React.useState(params);\n\n const [isMastheadStacked, setIsMastheadStacked] = React.useState(isMobile());\n const [isNavOpen, setIsNavOpen] = React.useState(isDesktop());\n const [isDrawerInline, setIsDrawerInline] = React.useState(isLargeLayout());\n\n const previousDesktopState = React.useRef(isDesktop());\n const previousMobileState = React.useRef(isMobile());\n const previousDrawerInlineState = React.useRef(isLargeLayout());\n\n const onResize = React.useCallback(() => {\n const desktop = isDesktop();\n const mobile = isMobile();\n const drawerInline = isLargeLayout();\n if (previousDesktopState.current !== desktop) {\n setIsNavOpen(desktop);\n previousDesktopState.current = desktop;\n }\n if (previousMobileState.current !== mobile) {\n setIsMastheadStacked(mobile);\n previousMobileState.current = mobile;\n }\n if (previousDrawerInlineState.current !== drawerInline) {\n setIsDrawerInline(drawerInline);\n previousDrawerInlineState.current = drawerInline;\n }\n }, []);\n\n React.useEffect(() => {\n window.addEventListener('resize', onResize);\n return () => {\n window.removeEventListener('resize', onResize);\n };\n }, [onResize]);\n\n React.useLayoutEffect(() => {\n // Prevent infinite loop in case React Router decides to destroy & recreate the component (changing key)\n const oldLocation = _.omit(prevLocation, ['key']);\n const newLocation = _.omit(location, ['key']);\n if (_.isEqual(newLocation, oldLocation) && _.isEqual(params, prevParams)) {\n return;\n }\n const { pathname } = location;\n store.dispatch(UIActions.setCurrentLocation(pathname));\n setPrevLocation(location);\n setPrevParams(params);\n }, [location, params, prevLocation, prevParams]);\n\n const dispatch = useDispatch();\n const [, , errorMessage] = usePackageManifestCheck(\n 'lightspeed-operator',\n 'openshift-marketplace',\n );\n\n React.useEffect(() => {\n const lightspeedButtonCapability = window.SERVER_FLAGS?.capabilities?.find(\n (capability) => capability.name === 'LightspeedButton',\n );\n dispatch(\n setFlag(\n FLAGS.CONSOLE_CAPABILITY_LIGHTSPEEDBUTTON_IS_ENABLED,\n lightspeedButtonCapability?.visibility?.state === 'Enabled' ? true : false,\n ),\n );\n dispatch(setFlag(FLAGS.LIGHTSPEED_IS_AVAILABLE_TO_INSTALL, errorMessage === ''));\n }, [dispatch, errorMessage]);\n\n const consoleCapabilityLightspeedButtonIsEnabled = useFlag(\n FLAGS.CONSOLE_CAPABILITY_LIGHTSPEEDBUTTON_IS_ENABLED,\n );\n const lightspeedIsAvailableToInstall = useFlag(FLAGS.LIGHTSPEED_IS_AVAILABLE_TO_INSTALL);\n\n const onNavToggle = () => {\n // Some components, like svg charts, need to reflow when nav is toggled.\n // Fire event after a short delay to allow nav animation to complete.\n setTimeout(() => {\n window.dispatchEvent(new Event('sidebar_toggle'));\n }, 100);\n\n setIsNavOpen((prevState) => !prevState);\n };\n\n const onNotificationDrawerToggle = () => {\n if (isLargeLayout()) {\n // Fire event after the drawer animation speed delay.\n setTimeout(() => {\n window.dispatchEvent(new Event('sidebar_toggle'));\n }, 250);\n }\n };\n\n const onNavSelect = () => {\n //close nav on mobile nav selects\n if (!isDesktop()) {\n setIsNavOpen(false);\n }\n };\n\n const { productName } = getBrandingDetails();\n\n const content = (\n <>\n <Helmet titleTemplate={`%s · ${productName}`} defaultTitle={productName} />\n <ConsoleNotifier location=\"BannerTop\" />\n <QuickStartDrawer>\n <div id=\"app-content\" className=\"co-m-app__content\">\n <Page\n // Need to pass mainTabIndex=null to enable keyboard scrolling as default tabIndex is set to -1 by patternfly\n mainTabIndex={null}\n className=\"pf-c-page\" // legacy pf-c-page class needed for PF4 component styling\n header={\n <Masthead\n isNavOpen={isNavOpen}\n onNavToggle={onNavToggle}\n isMastheadStacked={isMastheadStacked}\n />\n }\n sidebar={\n <Navigation\n isNavOpen={isNavOpen}\n onNavSelect={onNavSelect}\n onPerspectiveSelected={onNavSelect}\n />\n }\n skipToContent={\n <SkipToContent href={`${location.pathname}${location.search}#content`}>\n Skip to Content\n </SkipToContent>\n }\n >\n <ConnectedNotificationDrawer\n isDesktop={isDrawerInline}\n onDrawerChange={onNotificationDrawerToggle}\n >\n <AppContents />\n </ConnectedNotificationDrawer>\n </Page>\n {consoleCapabilityLightspeedButtonIsEnabled && lightspeedIsAvailableToInstall && (\n <Lightspeed />\n )}\n <CloudShell />\n <GuidedTour />\n </div>\n <div id=\"modal-container\" role=\"dialog\" aria-modal=\"true\" />\n </QuickStartDrawer>\n <ConsoleNotifier location=\"BannerBottom\" />\n <FeatureFlagExtensionLoader />\n </>\n );\n\n return (\n <DetectPerspective>\n <CaptureTelemetry />\n <DetectNamespace>\n <ModalProvider>\n {contextProviderExtensions.reduce(\n (children, e) => (\n <EnhancedProvider key={e.uid} {...e.properties}>\n {children}\n </EnhancedProvider>\n ),\n content,\n )}\n </ModalProvider>\n </DetectNamespace>\n <DetectLanguage />\n </DetectPerspective>\n );\n};\n\nconst AppWithExtensions = (props) => {\n const [reduxReducerExtensions, reducersResolved] = useResolvedExtensions(isReduxReducer);\n const [contextProviderExtensions, providersResolved] = useResolvedExtensions(isContextProvider);\n\n if (reducersResolved && providersResolved) {\n applyReduxExtensions(reduxReducerExtensions);\n return <App contextProviderExtensions={contextProviderExtensions} {...props} />;\n }\n\n return <LoadingBox />;\n};\n\nrender(<LoadingBox />, document.getElementById('app'));\n\nconst AppRouter = () => {\n const standaloneRouteExtensions = useExtensions(isStandaloneRoutePage);\n // Treat the authentication error page as a standalone route. There is no need to render the rest\n // of the app if we know authentication has failed.\n return (\n <Router history={history} basename={window.SERVER_FLAGS.basePath}>\n <CompatRouter>\n <Routes>\n <Route path={LOGIN_ERROR_PATH} component={AuthenticationErrorPage} />\n {standaloneRouteExtensions.map((e) => (\n <Route\n key={e.uid}\n element={<AsyncComponent loader={e.properties.component} />}\n path={`${e.properties.path}${e.properties.exact ? '' : '/*'}`}\n />\n ))}\n <Route path=\"/terminal/*\" element={<CloudShellTab />} />\n <Route path=\"/*\" element={<AppWithExtensions />} />\n </Routes>\n </CompatRouter>\n </Router>\n );\n};\n\nconst CaptureTelemetry = React.memo(function CaptureTelemetry() {\n const [perspective] = useActivePerspective();\n const fireTelemetryEvent = useTelemetry();\n const [debounceTime, setDebounceTime] = React.useState(5000);\n const [titleOnLoad, setTitleOnLoad] = React.useState('');\n // notify of identity change\n const user = useSelector(getUser);\n const telemetryTitle = getTelemetryTitle();\n\n React.useEffect(\n () =>\n setTimeout(() => {\n setTitleOnLoad(telemetryTitle);\n setDebounceTime(500);\n }, 5000),\n [telemetryTitle],\n );\n\n React.useEffect(() => {\n if (user?.uid || user?.username) {\n fireTelemetryEvent('identify', { perspective, user });\n }\n // Only trigger identify event when the user identifier changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [user?.uid || user?.username, fireTelemetryEvent]);\n\n // notify url change events\n // Debouncing the url change events so that redirects don't fire multiple events.\n // Also because some pages update the URL as the user enters a search term.\n const fireUrlChangeEvent = useDebounceCallback((location) => {\n fireTelemetryEvent('page', {\n perspective,\n title: getTelemetryTitle(),\n ...withoutSensitiveInformations(location),\n });\n }, debounceTime);\n React.useEffect(() => {\n if (!titleOnLoad) {\n return;\n }\n fireUrlChangeEvent(history.location);\n let { pathname, search } = history.location;\n const unlisten = history.listen((location) => {\n const { pathname: nextPathname, search: nextSearch } = history.location;\n if (pathname !== nextPathname || search !== nextSearch) {\n pathname = nextPathname;\n search = nextSearch;\n fireUrlChangeEvent(location);\n }\n });\n return () => unlisten();\n }, [perspective, fireUrlChangeEvent, titleOnLoad]);\n\n return null;\n});\n\nconst PollConsoleUpdates = React.memo(function PollConsoleUpdates() {\n const toastContext = useToast();\n const { t } = useTranslation();\n\n const [isToastOpen, setToastOpen] = React.useState(false);\n const [pluginsChanged, setPluginsChanged] = React.useState(false);\n const [pluginVersionsChanged, setPluginVersionsChanged] = React.useState(false);\n const [consoleChanged, setConsoleChanged] = React.useState(false);\n const [isFetchingPluginEndpoints, setIsFetchingPluginEndpoints] = React.useState(false);\n const [allPluginEndpointsReady, setAllPluginEndpointsReady] = React.useState(false);\n\n const [updateData, setUpdateData] = React.useState();\n const [updateError, setUpdateError] = React.useState();\n const [newPlugins, setNewPlugins] = React.useState();\n const [pluginManifestsData, setPluginManifestsData] = React.useState();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const safeFetch = React.useCallback(useSafeFetch(), []);\n const fetchPluginManifest = (pluginName) =>\n coFetchJSON(\n `${window.SERVER_FLAGS.basePath}api/plugins/${pluginName}/plugin-manifest.json`,\n 'get',\n { cache: 'no-cache' },\n );\n const tick = React.useCallback(() => {\n safeFetch(`${window.SERVER_FLAGS.basePath}api/check-updates`)\n .then((response) => {\n setUpdateData(response);\n setUpdateError(null);\n const pluginManifests = response?.plugins?.map((pluginName) =>\n fetchPluginManifest(pluginName),\n );\n if (pluginManifests) {\n settleAllPromises(pluginManifests).then(([fulfilledValues]) => {\n setPluginManifestsData(fulfilledValues);\n });\n }\n })\n .catch(setUpdateError);\n }, [safeFetch]);\n usePoll(tick, URL_POLL_DEFAULT_DELAY);\n\n const prevUpdateDataRef = React.useRef();\n const prevPluginManifestsDataRef = React.useRef();\n React.useEffect(() => {\n prevUpdateDataRef.current = updateData;\n prevPluginManifestsDataRef.current = pluginManifestsData;\n });\n const prevUpdateData = prevUpdateDataRef.current;\n const prevPluginManifestsData = prevPluginManifestsDataRef.current;\n const stateInitialized = _.isEmpty(updateError) && !_.isEmpty(prevUpdateData);\n const pluginsAddedList = updateData?.plugins.filter((x) => !prevUpdateData?.plugins.includes(x));\n const pluginsRemovedList = prevUpdateData?.plugins.filter(\n (x) => !updateData?.plugins.includes(x),\n );\n const pluginsAdded = !_.isEmpty(pluginsAddedList);\n const pluginsRemoved = !_.isEmpty(pluginsRemovedList);\n\n if (stateInitialized && pluginsAdded && !pluginsChanged) {\n setPluginsChanged(true);\n setNewPlugins(pluginsAddedList);\n }\n\n if (stateInitialized && pluginsRemoved && !consoleChanged) {\n setConsoleChanged(true);\n }\n\n if (pluginsChanged && !allPluginEndpointsReady && !isFetchingPluginEndpoints) {\n const pluginEndpointsReady =\n newPlugins?.map((pluginName) => fetchPluginManifest(pluginName)) ?? [];\n if (!_.isEmpty(pluginEndpointsReady)) {\n settleAllPromises(pluginEndpointsReady).then(([, rejectedReasons]) => {\n if (!_.isEmpty(rejectedReasons)) {\n setAllPluginEndpointsReady(false);\n setTimeout(() => setIsFetchingPluginEndpoints(false), URL_POLL_DEFAULT_DELAY);\n return;\n }\n setAllPluginEndpointsReady(true);\n setIsFetchingPluginEndpoints(false);\n setNewPlugins(null);\n });\n setIsFetchingPluginEndpoints(true);\n } else {\n setAllPluginEndpointsReady(true);\n setIsFetchingPluginEndpoints(false);\n }\n }\n\n const pluginManifestsVersionsChanged = pluginManifestsData?.some((manifest) => {\n return prevPluginManifestsData?.some((previousManifest) => {\n return (\n manifest.name === previousManifest.name && manifest.version !== previousManifest.version\n );\n });\n });\n if (\n stateInitialized &&\n !_.isEmpty(prevPluginManifestsData) &&\n pluginManifestsVersionsChanged &&\n !pluginVersionsChanged\n ) {\n setPluginVersionsChanged(true);\n }\n\n const consoleCommitChanged = prevUpdateData?.consoleCommit !== updateData?.consoleCommit;\n if (stateInitialized && consoleCommitChanged && !consoleChanged) {\n setConsoleChanged(true);\n }\n\n if (isToastOpen || !stateInitialized) {\n return null;\n }\n\n if (!pluginsChanged && !pluginVersionsChanged && !consoleChanged) {\n return null;\n }\n\n if (pluginsChanged && !allPluginEndpointsReady) {\n return null;\n }\n\n const toastCallback = () => {\n setToastOpen(false);\n setPluginsChanged(false);\n setPluginVersionsChanged(false);\n setConsoleChanged(false);\n setAllPluginEndpointsReady(false);\n setIsFetchingPluginEndpoints(false);\n };\n\n toastContext.addToast({\n variant: AlertVariant.warning,\n title: t('public~Web console update is available'),\n content: t(\n 'public~There has been an update to the web console. Ensure any changes have been saved and refresh your browser to access the latest version.',\n ),\n timeout: false,\n dismissible: true,\n actions: [\n {\n dismiss: true,\n label: t('public~Refresh web console'),\n callback: () => {\n if (window.location.pathname.includes('/operatorhub/subscribe')) {\n window.location.href = '/operatorhub';\n } else {\n window.location.reload();\n }\n },\n dataTest: 'refresh-web-console',\n },\n ],\n onClose: toastCallback,\n onRemove: toastCallback,\n });\n\n setToastOpen(true);\n return null;\n});\n\nlet updateSwaggerInterval;\n\n/**\n * Fetch OpenAPI definitions immediately upon application start and\n * then poll swagger definitions every 5 minutes to ensure they stay up to date.\n */\nconst updateSwaggerDefinitionContinual = () => {\n fetchSwagger().catch((e) => {\n // eslint-disable-next-line no-console\n console.error('Could not fetch OpenAPI after application start:', e);\n });\n clearInterval(updateSwaggerInterval);\n updateSwaggerInterval = setInterval(() => {\n fetchSwagger().catch((e) => {\n // eslint-disable-next-line no-console\n console.error('Could not fetch OpenAPI to stay up to date:', e);\n });\n }, 5 * 60 * 1000);\n};\n\nconst initPlugins = (storeInstance) => {\n return initConsolePlugins(pluginStore, storeInstance);\n};\n// Load cached API resources from localStorage to speed up page load.\nconst initApiDiscovery = (storeInstance) => {\n getCachedResources()\n .then((resources) => {\n if (resources) {\n storeInstance.dispatch(receivedResources(resources));\n }\n // Still perform discovery to refresh the cache.\n storeInstance.dispatch(startAPIDiscovery());\n })\n .catch(() => storeInstance.dispatch(startAPIDiscovery()));\n updateSwaggerDefinitionContinual();\n};\n\ngraphQLReady.onReady(() => {\n store.dispatch(detectFeatures());\n\n // Global timer to ensure all <Timestamp> components update in sync\n setInterval(() => store.dispatch(UIActions.updateTimestamps(Date.now())), 10000);\n\n // Used by GUI tests to check for unhandled exceptions\n window.windowError = null;\n window.onerror = (message, source, lineno, colno, error) => {\n const formattedStack = error?.stack?.replace(/\\\\n/g, '\\n');\n const formattedMessage = `unhandled error: ${message} ${formattedStack || ''}`;\n window.windowError = formattedMessage;\n // eslint-disable-next-line no-console\n console.error(formattedMessage, error || message);\n };\n window.onunhandledrejection = (promiseRejectionEvent) => {\n const { reason } = promiseRejectionEvent;\n const formattedMessage = `unhandled promise rejection: ${reason}`;\n window.windowError = formattedMessage;\n // eslint-disable-next-line no-console\n console.error(formattedMessage, reason);\n };\n\n if ('serviceWorker' in navigator) {\n if (window.SERVER_FLAGS.loadTestFactor > 1) {\n // eslint-disable-next-line import/no-unresolved\n import('file-loader?name=load-test.sw.js!../load-test.sw.js')\n .then(() => navigator.serviceWorker.register('/load-test.sw.js'))\n .then(\n () =>\n new Promise((r) =>\n navigator.serviceWorker.controller\n ? r()\n : navigator.serviceWorker.addEventListener('controllerchange', () => r()),\n ),\n )\n .then(() =>\n navigator.serviceWorker.controller.postMessage({\n topic: 'setFactor',\n value: window.SERVER_FLAGS.loadTestFactor,\n }),\n );\n } else {\n navigator.serviceWorker\n .getRegistrations()\n .then((registrations) => registrations.forEach((reg) => reg.unregister()))\n // eslint-disable-next-line no-console\n .catch((e) => console.warn('Error unregistering service workers', e));\n }\n }\n\n render(\n <React.Suspense fallback={<LoadingBox />}>\n <Provider store={store}>\n <ThemeProvider>\n <AppInitSDK\n configurations={{\n appFetch: appInternalFetch,\n apiDiscovery: initApiDiscovery,\n initPlugins,\n }}\n >\n <ToastProvider>\n <PollConsoleUpdates />\n <AdmissionWebhookWarningNotifications />\n <AppRouter />\n </ToastProvider>\n </AppInitSDK>\n </ThemeProvider>\n </Provider>\n </React.Suspense>,\n document.getElementById('app'),\n );\n});\n","import * as _ from 'lodash';\nimport {\n ClusterVersionModel,\n NodeModel,\n PodModel,\n StorageClassModel,\n PersistentVolumeClaimModel,\n VolumeSnapshotContentModel,\n ClusterOperatorModel,\n ConsoleOperatorConfigModel,\n} from '@console/internal/models';\nimport { referenceForModel, ClusterOperator } from '@console/internal/module/k8s';\nimport {\n Plugin,\n ModelDefinition,\n RoutePage,\n DashboardsOverviewResourceActivity,\n DashboardsOverviewHealthURLSubsystem,\n DashboardsOverviewHealthPrometheusSubsystem,\n DashboardsOverviewInventoryItem,\n DashboardsOverviewHealthOperator,\n ResourceDetailsPage,\n ResourceListPage,\n ResourceTabPage,\n} from '@console/plugin-sdk';\nimport { FLAGS } from '@console/shared/src/constants';\nimport '@console/internal/i18n.js';\nimport {\n getClusterUpdateTimestamp,\n isClusterUpdateActivity,\n} from './components/dashboards-page/activity';\nimport {\n fetchK8sHealth,\n getK8sHealthState,\n getControlPlaneHealth,\n getClusterOperatorHealthStatus,\n} from './components/dashboards-page/status';\nimport { USER_PREFERENCES_BASE_URL } from './components/user-preferences/const';\nimport * as models from './models';\nimport {\n API_SERVERS_UP,\n API_SERVER_REQUESTS_SUCCESS,\n CONTROLLER_MANAGERS_UP,\n SCHEDULERS_UP,\n} from './queries';\n\ntype ConsumedExtensions =\n | ModelDefinition\n | RoutePage\n | DashboardsOverviewResourceActivity\n | DashboardsOverviewHealthURLSubsystem<any>\n | DashboardsOverviewHealthPrometheusSubsystem\n | DashboardsOverviewInventoryItem\n | DashboardsOverviewHealthOperator<ClusterOperator>\n | ResourceListPage\n | ResourceDetailsPage\n | ResourceTabPage;\n\nconst plugin: Plugin<ConsumedExtensions> = [\n {\n type: 'ModelDefinition',\n properties: {\n models: _.values(models),\n },\n },\n {\n type: 'Dashboards/Overview/Activity/Resource',\n properties: {\n k8sResource: {\n isList: true,\n prop: 'clusterVersion',\n kind: referenceForModel(ClusterVersionModel),\n namespaced: false,\n },\n isActivity: isClusterUpdateActivity,\n getTimestamp: getClusterUpdateTimestamp,\n loader: () =>\n import(\n './components/dashboards-page/ClusterUpdateActivity' /* webpackChunkName: \"console-app\" */\n ).then((m) => m.default),\n },\n flags: {\n required: [FLAGS.CLUSTER_VERSION],\n },\n },\n {\n type: 'Dashboards/Overview/Health/URL',\n properties: {\n // t('console-app~Cluster')\n title: '%console-app~Cluster%',\n url: 'healthz',\n fetch: fetchK8sHealth,\n healthHandler: getK8sHealthState,\n additionalResource: {\n kind: referenceForModel(ClusterVersionModel),\n namespaced: false,\n name: 'version',\n isList: false,\n prop: 'cv',\n optional: true,\n },\n },\n },\n {\n type: 'Dashboards/Overview/Health/Prometheus',\n properties: {\n // t('console-app~Control Plane')\n title: '%console-app~Control Plane%',\n queries: [API_SERVERS_UP, CONTROLLER_MANAGERS_UP, SCHEDULERS_UP, API_SERVER_REQUESTS_SUCCESS],\n healthHandler: getControlPlaneHealth,\n popupComponent: () =>\n import(\n './components/dashboards-page/ControlPlaneStatus' /* webpackChunkName: \"console-app\" */\n ).then((m) => m.default),\n // t('console-app~Control Plane status')\n popupTitle: '%console-app~Control Plane status%',\n disallowedControlPlaneTopology: ['External'],\n },\n },\n {\n type: 'Dashboards/Overview/Inventory/Item',\n properties: {\n model: NodeModel,\n mapper: () =>\n import(\n '@console/shared/src/components/dashboard/inventory-card/utils' /* webpackChunkName: \"console-app\" */\n ).then((m) => m.getNodeStatusGroups),\n },\n },\n {\n type: 'Dashboards/Overview/Inventory/Item',\n properties: {\n model: PodModel,\n mapper: () =>\n import(\n '@console/shared/src/components/dashboard/inventory-card/utils' /* webpackChunkName: \"console-app\" */\n ).then((m) => m.getPodStatusGroups),\n },\n },\n {\n type: 'Dashboards/Overview/Inventory/Item',\n properties: {\n model: StorageClassModel,\n },\n },\n {\n type: 'Dashboards/Overview/Inventory/Item',\n properties: {\n model: PersistentVolumeClaimModel,\n mapper: () =>\n import(\n '@console/shared/src/components/dashboard/inventory-card/utils' /* webpackChunkName: \"console-app\" */\n ).then((m) => m.getPVCStatusGroups),\n },\n },\n {\n type: 'Dashboards/Overview/Health/Operator',\n properties: {\n // t('console-app~Cluster operators')\n title: '%console-app~Cluster operators%',\n resources: [\n {\n kind: referenceForModel(ClusterOperatorModel),\n isList: true,\n namespaced: false,\n prop: 'clusterOperators',\n },\n ],\n getOperatorsWithStatuses: getClusterOperatorHealthStatus,\n operatorRowLoader: () =>\n import(\n './components/dashboards-page/OperatorStatus' /* webpackChunkName: \"console-app\" */\n ).then((c) => c.default),\n viewAllLink: '/settings/cluster/clusteroperators',\n },\n flags: {\n required: [FLAGS.CLUSTER_VERSION],\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: ['/quickstart/'],\n loader: async () =>\n (\n await import(\n './components/quick-starts/QuickStartCatalogPageAsync' /* webpackChunkName: \"quick-start\" */\n )\n ).default,\n },\n },\n {\n type: 'Page/Resource/List',\n properties: {\n model: VolumeSnapshotContentModel,\n loader: () =>\n import(\n './components/volume-snapshot/volume-snapshot-content' /* webpackChunkName: \"volume-snapshot-content-page\" */\n ).then((m) => m.default),\n },\n flags: {\n required: [FLAGS.CAN_LIST_VSC],\n },\n },\n {\n type: 'Page/Resource/Details',\n properties: {\n model: VolumeSnapshotContentModel,\n loader: () =>\n import(\n './components/volume-snapshot/volume-snapshot-content-details' /* webpackChunkName: \"volume-snapshot-content-details-page\" */\n ).then((m) => m.default),\n },\n flags: {\n required: [FLAGS.CAN_LIST_VSC],\n },\n },\n {\n type: 'Page/Resource/Tab',\n properties: {\n href: 'volumesnapshots',\n model: PersistentVolumeClaimModel,\n // t('console-app~VolumeSnapshots')\n name: '%console-app~VolumeSnapshots%',\n loader: () =>\n import(\n './components/volume-snapshot/volume-snapshot' /* webpackChunkName: \"volume-snapshot-page\" */\n ).then((m) => m.VolumeSnapshotPVCPage),\n },\n },\n {\n type: 'Page/Resource/Details',\n properties: {\n model: ConsoleOperatorConfigModel,\n loader: async () =>\n (\n await import(\n './components/console-operator/ConsoleOperatorConfig' /* webpackChunkName: \"console-operator-config\" */\n )\n ).ConsoleOperatorConfigDetailsPage,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: [USER_PREFERENCES_BASE_URL, `${USER_PREFERENCES_BASE_URL}/:group`],\n loader: async () =>\n (\n await import(\n './components/user-preferences/UserPreferencePage' /* webpackChunkName: \"co-user-preference\" */\n )\n ).default,\n },\n },\n];\n\nexport default plugin;\n","const plugin = [];\n\nexport default plugin;\n","import { referenceForModel } from '@console/internal/module/k8s';\nimport {\n Plugin,\n ModelDefinition,\n ModelFeatureFlag,\n ResourceListPage,\n DashboardsOverviewHealthURLSubsystem,\n DashboardsOverviewHealthResourceSubsystem,\n RoutePage,\n ResourceDetailsPage,\n HorizontalNavTab,\n} from '@console/plugin-sdk';\nimport { securityHealthHandler } from './components/summary';\nimport { ContainerSecurityFlag } from './const';\nimport { ImageManifestVulnModel } from './models';\nimport { WatchImageVuln } from './types';\n\ntype ConsumedExtensions =\n | ModelDefinition\n | ModelFeatureFlag\n | ResourceListPage\n | ResourceDetailsPage\n | DashboardsOverviewHealthURLSubsystem\n | DashboardsOverviewHealthResourceSubsystem<WatchImageVuln>\n | RoutePage\n | HorizontalNavTab;\n\nconst plugin: Plugin<ConsumedExtensions> = [\n {\n type: 'ModelDefinition',\n properties: {\n models: [ImageManifestVulnModel],\n },\n },\n {\n type: 'FeatureFlag/Model',\n properties: {\n model: ImageManifestVulnModel,\n flag: ContainerSecurityFlag,\n },\n },\n {\n type: 'Page/Resource/List',\n properties: {\n model: ImageManifestVulnModel,\n loader: async () =>\n (\n await import(\n './components/image-manifest-vuln' /* webpack-chunk-name: \"container-security\" */\n )\n ).ImageManifestVulnPage,\n },\n },\n {\n type: 'Page/Resource/Details',\n properties: {\n model: ImageManifestVulnModel,\n loader: () =>\n import(\n './components/image-manifest-vuln' /* webpackChunkName: \"container-security\" */\n ).then((m) => m.ImageManifestVulnDetailsPage),\n },\n },\n {\n type: 'Dashboards/Overview/Health/Resource',\n properties: {\n title: 'Image Vulnerabilities',\n resources: {\n imageManifestVuln: {\n kind: referenceForModel(ImageManifestVulnModel),\n namespaced: true,\n isList: true,\n },\n },\n healthHandler: securityHealthHandler,\n popupTitle: 'Image Vulnerabilities breakdown',\n popupComponent: () =>\n import('./components/summary' /* webpackChunkName: \"container-security\" */).then(\n (m) => m.SecurityBreakdownPopup,\n ),\n },\n flags: {\n required: [ContainerSecurityFlag],\n },\n },\n];\n\nexport default plugin;\n","import { applyCodeRefSymbol } from '@console/dynamic-plugin-sdk/src/coderefs/coderef-resolver';\nimport {\n Plugin,\n ModelFeatureFlag,\n KebabActions,\n ResourceListPage,\n ResourceDetailsPage,\n RoutePage,\n OverviewResourceTab,\n OverviewTabSection,\n GuidedTour,\n PostFormSubmissionAction,\n CustomFeatureFlag,\n} from '@console/plugin-sdk';\nimport { ALLOW_SERVICE_BINDING_FLAG } from '@console/service-binding-plugin/src/const';\nimport { TopologyDataModelFactory } from '@console/topology/src/extensions';\nimport { doConnectsToBinding } from '@console/topology/src/utils/connector-utils';\nimport { getGuidedTour } from './components/guided-tour';\nimport { getBindableServiceResources } from './components/topology/bindable-services/bindable-service-resources';\nimport { INCONTEXT_ACTIONS_CONNECTS_TO } from './const';\n\nconst getBindableServicesTopologyDataModel = () =>\n import(\n './components/topology/bindable-services/data-transformer' /* webpackChunkName: \"topology-bindable-services\" */\n ).then((m) => m.getBindableServicesTopologyDataModel);\n\nconst isServiceBindable = () =>\n import(\n './components/topology/bindable-services/isBindable' /* webpackChunkName: \"topology-bindable-services\" */\n ).then((m) => m.isServiceBindable);\n\ntype ConsumedExtensions =\n | ModelFeatureFlag\n | CustomFeatureFlag\n | ResourceListPage\n | ResourceDetailsPage\n | RoutePage\n | KebabActions\n | OverviewResourceTab\n | OverviewTabSection\n | GuidedTour\n | PostFormSubmissionAction\n | TopologyDataModelFactory;\n\nconst plugin: Plugin<ConsumedExtensions> = [\n {\n type: 'Overview/Resource',\n properties: {\n // t('devconsole~Observe')\n name: '%devconsole~Observe%',\n key: 'isMonitorable',\n loader: () =>\n import(\n './components/monitoring/overview/MonitoringTab' /* webpackChunkName: \"monitoring-overview\" */\n ).then((m) => m.default),\n },\n },\n {\n type: 'GuidedTour',\n properties: {\n perspective: 'dev',\n tour: getGuidedTour(),\n },\n },\n {\n type: 'PostFormSubmissionAction',\n properties: {\n type: INCONTEXT_ACTIONS_CONNECTS_TO,\n callback: doConnectsToBinding,\n },\n },\n {\n type: 'Topology/DataModelFactory',\n properties: {\n id: 'bindable-service-topology-model-factory',\n priority: 100,\n resources: getBindableServiceResources,\n getDataModel: applyCodeRefSymbol(getBindableServicesTopologyDataModel),\n isResourceDepicted: applyCodeRefSymbol(isServiceBindable),\n },\n flags: {\n required: [ALLOW_SERVICE_BINDING_FLAG],\n },\n },\n];\n\nexport default plugin;\n","import * as _ from 'lodash';\nimport { ModelDefinition, RoutePage, Plugin, ModelFeatureFlag } from '@console/plugin-sdk';\nimport { FLAG_OPENSHIFT_GITOPS } from './const';\nimport * as models from './models';\n\ntype ConsumedExtensions = ModelDefinition | ModelFeatureFlag | RoutePage;\n\nconst plugin: Plugin<ConsumedExtensions> = [\n {\n type: 'ModelDefinition',\n properties: {\n models: _.values(models),\n },\n },\n {\n type: 'FeatureFlag/Model',\n properties: {\n model: models.GitOpsServiceModel,\n flag: FLAG_OPENSHIFT_GITOPS,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: '/environments',\n loader: async () =>\n (\n await import(\n './components/GitOpsListPage' /* webpackChunkName: \"gitops-plugin-list-page\" */\n )\n ).default,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: false,\n path: '/environments/:appName',\n loader: async () =>\n (\n await import(\n './components/GitOpsDetailsPageTabs' /* webpackChunkName: \"gitops-plugin-details-page\" */\n )\n ).default,\n },\n },\n];\n\nexport default plugin;\n","const plugin = [];\n\nexport default plugin;\n","import { ClusterVersionModel } from '@console/internal/models';\nimport { referenceForModel } from '@console/internal/module/k8s';\nimport { Plugin, DashboardsOverviewHealthPrometheusSubsystem } from '@console/plugin-sdk';\nimport { getClusterInsightsStatus } from './components/InsightsPopup/status';\n\ntype ConsumedExtensions = DashboardsOverviewHealthPrometheusSubsystem;\n\nconst plugin: Plugin<ConsumedExtensions> = [\n {\n type: 'Dashboards/Overview/Health/Prometheus',\n properties: {\n // t('insights-plugin~Insights')\n title: '%insights-plugin~Insights%',\n queries: [\n 'health_statuses_insights{metric=~\"low|moderate|important|critical\"}',\n 'cluster_operator_conditions{name=\"insights\"}',\n 'insightsclient_last_gather_time',\n ],\n healthHandler: getClusterInsightsStatus,\n additionalResource: {\n kind: referenceForModel(ClusterVersionModel),\n namespaced: false,\n name: 'version',\n isList: false,\n prop: 'cluster',\n },\n popupComponent: () =>\n import('./components/InsightsPopup/index' /* webpackChunkName: \"insights-plugin\" */).then(\n (m) => m.InsightsPopup,\n ),\n // t('insights-plugin~Insights Advisor status')\n popupTitle: '%insights-plugin~Insights Advisor status%',\n },\n },\n];\n\nexport default plugin;\n","import {\n Plugin,\n ModelDefinition,\n OverviewResourceTab,\n ResourceListPage,\n ResourceDetailsPage,\n RoutePage,\n KebabActions,\n HorizontalNavTab,\n DetailPageBreadCrumbs,\n} from '@console/plugin-sdk';\nimport { FLAG_KNATIVE_EVENTING, FLAG_KNATIVE_SERVING_SERVICE } from './const';\nimport {\n eventSourceBreadcrumbsProvider,\n channelBreadcrumbsProvider,\n brokerBreadcrumbsProvider,\n eventSourceModelsProviderForBreadcrumbs,\n channelModelsProviderForBreadcrumbs,\n brokerModelProviderForBreadcrumbs,\n} from './providers';\nimport { TopologyConsumedExtensions, topologyPlugin } from './topology/topology-plugin';\nimport { getKebabActionsForKind, getKebabActionsForWorkload } from './utils/kebab-actions';\n\ntype ConsumedExtensions =\n | ModelDefinition\n | OverviewResourceTab\n | ResourceListPage\n | RoutePage\n | KebabActions\n | ResourceDetailsPage\n | TopologyConsumedExtensions\n | HorizontalNavTab\n | DetailPageBreadCrumbs;\n\nconst plugin: Plugin<ConsumedExtensions> = [\n {\n type: 'Overview/Resource',\n properties: {\n // t('knative-plugin~Resources')\n name: '%knative-plugin~Resources%',\n key: 'configurations',\n loader: () =>\n import(\n './components/overview/OverviewDetailsKnativeResourcesTab' /* webpackChunkName: \"knative-overview\" */\n ).then((m) => m.default),\n },\n },\n {\n type: 'KebabActions',\n properties: {\n getKebabActionsForKind,\n },\n flags: {\n required: [FLAG_KNATIVE_EVENTING],\n },\n },\n {\n type: 'KebabActions',\n flags: {\n required: [FLAG_KNATIVE_SERVING_SERVICE],\n },\n properties: {\n getKebabActionsForKind: getKebabActionsForWorkload,\n },\n },\n {\n type: 'DetailPageBreadCrumbs',\n properties: {\n getModels: eventSourceModelsProviderForBreadcrumbs,\n breadcrumbsProvider: eventSourceBreadcrumbsProvider,\n },\n flags: {\n required: [FLAG_KNATIVE_EVENTING],\n },\n },\n {\n type: 'DetailPageBreadCrumbs',\n properties: {\n getModels: channelModelsProviderForBreadcrumbs,\n breadcrumbsProvider: channelBreadcrumbsProvider,\n },\n flags: {\n required: [FLAG_KNATIVE_EVENTING],\n },\n },\n {\n type: 'DetailPageBreadCrumbs',\n properties: {\n getModels: brokerModelProviderForBreadcrumbs,\n breadcrumbsProvider: brokerBreadcrumbsProvider,\n },\n flags: {\n required: [FLAG_KNATIVE_EVENTING],\n },\n },\n ...topologyPlugin,\n];\n\nexport default plugin;\n","import * as _ from 'lodash';\nimport { NodeModel } from '@console/internal/models';\nimport { referenceForModel } from '@console/internal/module/k8s';\nimport { ClusterServiceVersionModel } from '@console/operator-lifecycle-manager';\nimport {\n CustomFeatureFlag,\n ModelDefinition,\n ModelFeatureFlag,\n Plugin,\n RoutePage,\n HorizontalNavTab,\n} from '@console/plugin-sdk';\nimport * as models from './models';\n\ntype ConsumedExtensions =\n | CustomFeatureFlag\n | HorizontalNavTab\n | ModelFeatureFlag\n | ModelDefinition\n | RoutePage;\n\nconst LSO_LOCAL_VOLUME_SET = 'LSO_LOCAL_VOLUME_SET';\nexport const LSO_DEVICE_DISCOVERY = 'LSO_DEVICE_DISCOVERY';\n\nconst plugin: Plugin<ConsumedExtensions> = [\n {\n type: 'ModelDefinition',\n properties: {\n models: _.values(models),\n },\n },\n {\n type: 'FeatureFlag/Model',\n properties: {\n model: models.LocalVolumeSetModel,\n flag: LSO_LOCAL_VOLUME_SET,\n },\n },\n {\n type: 'FeatureFlag/Model',\n properties: {\n model: models.LocalVolumeDiscovery,\n flag: LSO_DEVICE_DISCOVERY,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: [\n `/k8s/ns/:ns/${referenceForModel(ClusterServiceVersionModel)}/:appName/${referenceForModel(\n models.LocalVolumeSetModel,\n )}/~new`,\n `/k8s/ns/:ns/${ClusterServiceVersionModel.plural}/:appName/${referenceForModel(\n models.LocalVolumeSetModel,\n )}/~new`,\n ],\n loader: () =>\n import(\n './components/local-volume-set/create-local-volume-set' /* webpackChunkName: \"lso-create-local-volume-set\" */\n ).then((m) => m.default),\n },\n flags: {\n required: [LSO_LOCAL_VOLUME_SET],\n },\n },\n {\n type: 'HorizontalNavTab',\n properties: {\n model: NodeModel,\n page: {\n href: 'disks',\n // t('lso-plugin~Disks')\n name: '%lso-plugin~Disks%',\n },\n loader: () =>\n import(\n './components/disks-list/disks-list-page' /* webpackChunkName: \"lso-disks-list\" */\n ).then((m) => m.NodesDisksListPage),\n },\n flags: {\n required: [LSO_DEVICE_DISCOVERY],\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: [\n `/k8s/ns/:ns/${referenceForModel(ClusterServiceVersionModel)}/:appName/${referenceForModel(\n models.LocalVolumeDiscovery,\n )}/~new`,\n `/k8s/ns/:ns/${ClusterServiceVersionModel.plural}/:appName/${referenceForModel(\n models.LocalVolumeDiscovery,\n )}/~new`,\n ],\n loader: () =>\n import(\n './components/local-volume-discovery/create-local-volume-discovery' /* webpackChunkName: \"lso-create-local-volume-discovery\" */\n ).then((m) => m.CreateLocalVolumeDiscovery),\n },\n flags: {\n required: [LSO_DEVICE_DISCOVERY],\n },\n },\n];\n\nexport default plugin;\n","import * as React from 'react';\nimport { MaintenanceIcon } from '@patternfly/react-icons/dist/esm/icons/maintenance-icon';\nimport * as _ from 'lodash';\nimport '@console/internal/i18n.js';\nimport { MachineModel, NodeModel, CertificateSigningRequestModel } from '@console/internal/models';\nimport { referenceForModel } from '@console/internal/module/k8s';\nimport {\n DashboardsOverviewInventoryItem,\n Plugin,\n ResourceListPage,\n ResourceDetailsPage,\n RoutePage,\n ModelFeatureFlag,\n ModelDefinition,\n DashboardsOverviewResourceActivity,\n DashboardsOverviewInventoryItemReplacement,\n DashboardsInventoryItemGroup,\n CustomFeatureFlag,\n HorizontalNavTab,\n} from '@console/plugin-sdk';\n// TODO(jtomasek): change this to '@console/shared/src/utils' once @console/shared/src/utils modules\n// no longer import from @console/internal (cyclic deps issues)\nimport { HOST_POWER_STATUS_POWERING_OFF, HOST_POWER_STATUS_POWERING_ON } from './constants';\nimport {\n detectBaremetalPlatform,\n BAREMETAL_FLAG,\n NODE_MAINTENANCE_FLAG,\n detectBMOEnabled,\n NODE_MAINTENANCE_KV_BETA_FLAG,\n NODE_MAINTENANCE_KV_ALPHA_FLAG,\n} from './features';\nimport {\n BareMetalHostModel,\n NodeMaintenanceModel,\n NodeMaintenanceKubevirtAlphaModel,\n NodeMaintenanceKubevirtBetaModel,\n} from './models';\nimport { getHostPowerStatus, hasPowerManagement } from './selectors';\nimport { BareMetalHostKind } from './types';\n\ntype ConsumedExtensions =\n | DashboardsOverviewInventoryItem\n | DashboardsOverviewInventoryItemReplacement\n | DashboardsInventoryItemGroup\n | ResourceListPage\n | ResourceDetailsPage\n | RoutePage\n | ModelFeatureFlag\n | ModelDefinition\n | CustomFeatureFlag\n | DashboardsOverviewResourceActivity\n | HorizontalNavTab;\n\nconst METAL3_FLAG = 'METAL3';\n\nconst plugin: Plugin<ConsumedExtensions> = [\n {\n type: 'ModelDefinition',\n properties: {\n models: [\n BareMetalHostModel,\n NodeMaintenanceModel,\n NodeMaintenanceKubevirtAlphaModel,\n NodeMaintenanceKubevirtBetaModel,\n ],\n },\n },\n {\n type: 'FeatureFlag/Model',\n properties: {\n model: BareMetalHostModel,\n flag: METAL3_FLAG,\n },\n },\n {\n type: 'FeatureFlag/Model',\n properties: {\n model: NodeMaintenanceModel,\n flag: NODE_MAINTENANCE_FLAG,\n },\n },\n {\n type: 'FeatureFlag/Model',\n properties: {\n model: NodeMaintenanceKubevirtBetaModel,\n flag: NODE_MAINTENANCE_KV_BETA_FLAG,\n },\n },\n {\n type: 'FeatureFlag/Model',\n properties: {\n model: NodeMaintenanceKubevirtAlphaModel,\n flag: NODE_MAINTENANCE_KV_ALPHA_FLAG,\n },\n },\n {\n type: 'FeatureFlag/Custom',\n properties: {\n detect: detectBaremetalPlatform,\n },\n },\n {\n type: 'FeatureFlag/Custom',\n properties: {\n detect: detectBMOEnabled,\n },\n },\n {\n type: 'Page/Resource/List',\n properties: {\n model: BareMetalHostModel,\n loader: () =>\n import(\n './components/baremetal-hosts/BareMetalHostsPage' /* webpackChunkName: \"metal3-baremetalhost\" */\n ).then((m) => m.default),\n },\n },\n {\n type: 'Page/Resource/Details',\n properties: {\n model: BareMetalHostModel,\n loader: () =>\n import(\n './components/baremetal-hosts/BareMetalHostDetailsPage' /* webpackChunkName: \"metal3-baremetalhost\" */\n ).then((m) => m.default),\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: `/k8s/ns/:ns/${referenceForModel(BareMetalHostModel)}/~new/form`,\n loader: () =>\n import(\n './components/baremetal-hosts/add-baremetal-host/AddBareMetalHostPage' /* webpackChunkName: \"metal3-baremetalhost\" */\n ).then((m) => m.default),\n },\n flags: {\n required: [BAREMETAL_FLAG, METAL3_FLAG],\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: `/k8s/ns/:ns/${referenceForModel(BareMetalHostModel)}/:name/edit`,\n loader: () =>\n import(\n './components/baremetal-hosts/add-baremetal-host/AddBareMetalHostPage' /* webpackChunkName: \"metal3-baremetalhost\" */\n ).then((m) => m.default),\n },\n flags: {\n required: [BAREMETAL_FLAG, METAL3_FLAG],\n },\n },\n {\n type: 'Dashboards/Overview/Inventory/Item/Replacement',\n properties: {\n model: NodeModel,\n additionalResources: {\n kvAlphaMaintenances: {\n isList: true,\n kind: referenceForModel(NodeMaintenanceKubevirtAlphaModel),\n optional: true,\n },\n kvBetaMaintenances: {\n isList: true,\n kind: referenceForModel(NodeMaintenanceKubevirtBetaModel),\n optional: true,\n },\n maintenances: {\n isList: true,\n kind: referenceForModel(NodeMaintenanceModel),\n optional: true,\n },\n csrs: {\n isList: true,\n kind: CertificateSigningRequestModel.kind,\n optional: true,\n },\n },\n mapper: () =>\n import('./components/baremetal-nodes/dashboard/utils' /* webpackChunkName: \"node\" */).then(\n (m) => m.getBMNStatusGroups,\n ),\n },\n flags: {\n required: [BAREMETAL_FLAG, METAL3_FLAG],\n },\n },\n {\n type: 'Dashboards/Overview/Inventory/Item',\n properties: {\n additionalResources: {\n machines: {\n isList: true,\n kind: referenceForModel(MachineModel),\n },\n nodes: {\n isList: true,\n kind: NodeModel.kind,\n },\n kvAlphaMaintenances: {\n isList: true,\n kind: referenceForModel(NodeMaintenanceKubevirtAlphaModel),\n optional: true,\n },\n kvBetaMaintenances: {\n isList: true,\n kind: referenceForModel(NodeMaintenanceKubevirtBetaModel),\n optional: true,\n },\n maintenances: {\n isList: true,\n kind: referenceForModel(NodeMaintenanceModel),\n optional: true,\n },\n },\n model: BareMetalHostModel,\n mapper: () =>\n import(\n './components/baremetal-hosts/dashboard/utils' /* webpackChunkName: \"metal3-baremetalhost\" */\n ).then((m) => m.getBMHStatusGroups),\n },\n flags: {\n required: [BAREMETAL_FLAG, METAL3_FLAG],\n },\n },\n {\n type: 'Dashboards/Overview/Activity/Resource',\n properties: {\n k8sResource: {\n isList: true,\n kind: referenceForModel(NodeMaintenanceModel),\n prop: 'maintenances',\n },\n isActivity: (resource) => _.get(resource.status, 'phase') === 'Running',\n getTimestamp: (resource) => new Date(resource.metadata.creationTimestamp),\n loader: () =>\n import(\n './components/maintenance/MaintenanceDashboardActivity' /* webpackChunkName: \"node-maintenance\" */\n ).then((m) => m.default),\n },\n flags: {\n required: [BAREMETAL_FLAG, METAL3_FLAG, NODE_MAINTENANCE_FLAG],\n },\n },\n {\n type: 'Dashboards/Overview/Activity/Resource',\n properties: {\n k8sResource: {\n isList: true,\n kind: referenceForModel(NodeMaintenanceKubevirtAlphaModel),\n prop: 'maintenances',\n },\n isActivity: (resource) => _.get(resource.status, 'phase') === 'Running',\n getTimestamp: (resource) => new Date(resource.metadata.creationTimestamp),\n loader: () =>\n import(\n './components/maintenance/MaintenanceDashboardActivity' /* webpackChunkName: \"node-maintenance\" */\n ).then((m) => m.default),\n },\n flags: {\n required: [BAREMETAL_FLAG, METAL3_FLAG, NODE_MAINTENANCE_KV_ALPHA_FLAG],\n },\n },\n {\n type: 'Dashboards/Overview/Activity/Resource',\n properties: {\n k8sResource: {\n isList: true,\n kind: referenceForModel(NodeMaintenanceKubevirtBetaModel),\n prop: 'maintenances',\n },\n isActivity: (resource) => _.get(resource.status, 'phase') === 'Running',\n getTimestamp: (resource) => new Date(resource.metadata.creationTimestamp),\n loader: () =>\n import(\n './components/maintenance/MaintenanceDashboardActivity' /* webpackChunkName: \"node-maintenance\" */\n ).then((m) => m.default),\n },\n flags: {\n required: [BAREMETAL_FLAG, METAL3_FLAG, NODE_MAINTENANCE_KV_BETA_FLAG],\n },\n },\n {\n type: 'Dashboards/Inventory/Item/Group',\n properties: {\n id: 'node-maintenance',\n icon: <MaintenanceIcon />,\n },\n },\n {\n type: 'Dashboards/Overview/Activity/Resource',\n properties: {\n k8sResource: {\n kind: referenceForModel(BareMetalHostModel),\n prop: 'bmhs',\n isList: true,\n },\n isActivity: (resource: BareMetalHostKind) =>\n [HOST_POWER_STATUS_POWERING_OFF, HOST_POWER_STATUS_POWERING_ON].includes(\n getHostPowerStatus(resource),\n ) && hasPowerManagement(resource),\n loader: () =>\n import(\n './components/baremetal-hosts/dashboard/BareMetalStatusActivity' /* webpackChunkName: \"metal3-powering\" */\n ).then((m) => m.default),\n },\n flags: {\n required: [BAREMETAL_FLAG, METAL3_FLAG],\n },\n },\n];\n\nexport default plugin;\n","const plugin = [];\n\nexport default plugin;\n","import { Plugin } from '@console/plugin-sdk';\n\nconst plugin: Plugin<any> = [];\n\nexport default plugin;\n","import * as _ from 'lodash';\nimport { referenceForModel } from '@console/internal/module/k8s';\nimport {\n Plugin,\n ModelDefinition,\n ModelFeatureFlag,\n ResourceListPage,\n ResourceDetailsPage,\n RoutePage,\n DashboardsOverviewHealthOperator,\n} from '@console/plugin-sdk';\nimport { FLAGS } from '@console/shared/src/constants';\nimport { getClusterServiceVersionsWithStatuses } from './components/dashboard/utils';\nimport { Flags } from './const';\nimport * as models from './models';\nimport { ClusterServiceVersionKind } from './types';\n\nimport './style.scss';\n\ntype ConsumedExtensions =\n | ModelDefinition\n | ModelFeatureFlag\n | ResourceListPage\n | ResourceDetailsPage\n | RoutePage\n | DashboardsOverviewHealthOperator<ClusterServiceVersionKind>;\n\nconst plugin: Plugin<ConsumedExtensions> = [\n {\n type: 'ModelDefinition',\n properties: {\n models: _.values(models),\n },\n },\n {\n type: 'FeatureFlag/Model',\n properties: {\n model: models.ClusterServiceVersionModel,\n flag: Flags.OPERATOR_LIFECYCLE_MANAGER,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: `/k8s/ns/:ns/${referenceForModel(\n models.ClusterServiceVersionModel,\n )}/:csvName/:plural/~new`,\n loader: async () =>\n (\n await import(\n './components/operand/create-operand' /* webpackChunkName: \"create-operand\" */\n )\n ).default,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: `/k8s/ns/:ns/${models.ClusterServiceVersionModel.plural}/:csvName/:plural/~new`,\n loader: async () =>\n (\n await import(\n './components/operand/create-operand' /* webpackChunkName: \"create-operand\" */\n )\n ).default,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n path: `/k8s/ns/:ns/${models.ClusterServiceVersionModel.plural}/:appName/:plural/:name`,\n loader: async () =>\n (await import('./components/operand' /* webpackChunkName: \"operand\" */)).OperandDetailsPage,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n path: `/k8s/ns/:ns/${referenceForModel(\n models.ClusterServiceVersionModel,\n )}/:appName/:plural/:name`,\n loader: async () =>\n (await import('./components/operand' /* webpackChunkName: \"operand\" */)).OperandDetailsPage,\n },\n },\n {\n type: 'Page/Resource/List',\n properties: {\n model: models.SubscriptionModel,\n loader: async () =>\n (await import('./components/subscription' /* webpackChunkName: \"subscriptions\" */))\n .SubscriptionsPage,\n },\n },\n {\n type: 'Page/Resource/Details',\n properties: {\n model: models.SubscriptionModel,\n loader: async () =>\n (await import('./components/subscription' /* webpackChunkName: \"subscriptions\" */))\n .SubscriptionDetailsPage,\n },\n },\n {\n type: 'Page/Resource/List',\n properties: {\n model: models.ClusterServiceVersionModel,\n loader: async () =>\n (\n await import(\n './components/clusterserviceversion' /* webpackChunkName: \"clusterserviceversion\" */\n )\n ).ClusterServiceVersionsPage,\n },\n },\n {\n type: 'Page/Resource/List',\n properties: {\n model: models.PackageManifestModel,\n loader: async () =>\n (await import('./components/package-manifest' /* webpackChunkName: \"package-manifest\" */))\n .PackageManifestsPage,\n },\n },\n {\n type: 'Page/Resource/Details',\n properties: {\n model: models.ClusterServiceVersionModel,\n loader: async () =>\n (\n await import(\n './components/clusterserviceversion' /* webpackChunkName: \"clusterserviceversion\" */\n )\n ).ClusterServiceVersionDetailsPage,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: `/k8s/ns/:ns/${models.SubscriptionModel.plural}/~new`,\n loader: async () =>\n (\n await import(\n './components/catalog-source' /* webpackChunkName: \"create-subscription-yaml\" */\n )\n ).CreateSubscriptionYAML,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: '/operatorhub/all-namespaces',\n loader: async () =>\n (\n await import(\n './components/operator-hub/operator-hub-page' /* webpackChunkName: \"operator-hub\" */\n )\n ).OperatorHubPage,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: '/operatorhub/ns/:ns',\n loader: async () =>\n (\n await import(\n './components/operator-hub/operator-hub-page' /* webpackChunkName: \"operator-hub\" */\n )\n ).OperatorHubPage,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: '/operatorhub/subscribe',\n loader: async () =>\n (\n await import(\n './components/operator-hub/operator-hub-subscribe' /* webpackChunkName: \"operator-hub-subscribe\" */\n )\n ).OperatorHubSubscribePage,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: `/k8s/ns/:ns/${models.SubscriptionModel.plural}/~new`,\n loader: async () =>\n (\n await import(\n './components/catalog-source' /* webpackChunkName: \"create-subscription-yaml\" */\n )\n ).CreateSubscriptionYAML,\n },\n },\n {\n type: 'Page/Resource/Details',\n properties: {\n model: models.OperatorHubModel,\n loader: async () =>\n (await import('./components/operator-hub/operator-hub-details')).OperatorHubDetailsPage,\n },\n },\n {\n type: 'Page/Resource/Details',\n properties: {\n model: models.CatalogSourceModel,\n loader: async () =>\n (await import('./components/catalog-source' /* webpackChunkName: \"catalog-source\" */))\n .CatalogSourceDetailsPage,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: `/k8s/cluster/${referenceForModel(models.CatalogSourceModel)}/~new`,\n loader: async () => (await import('./components/create-catalog-source')).CreateCatalogSource,\n },\n },\n {\n type: 'Page/Route',\n properties: {\n exact: true,\n path: `/k8s/ns/:ns/${referenceForModel(models.CatalogSourceModel)}/~new`,\n loader: async () => (await import('./components/create-catalog-source')).CreateCatalogSource,\n },\n },\n {\n type: 'Page/Resource/Details',\n properties: {\n model: models.InstallPlanModel,\n loader: async () =>\n (await import('./components/install-plan' /* webpackChunkName: \"install-plan\" */))\n .InstallPlanDetailsPage,\n },\n },\n {\n type: 'Page/Resource/List',\n properties: {\n model: models.InstallPlanModel,\n loader: async () =>\n (await import('./components/install-plan' /* webpackChunkName: \"install-plan\" */))\n .InstallPlansPage,\n },\n },\n {\n type: 'Dashboards/Overview/Health/Operator',\n properties: {\n // t('olm~Operators')\n title: '%olm~Operators%',\n resources: [\n {\n kind: referenceForModel(models.ClusterServiceVersionModel),\n isList: true,\n prop: 'clusterServiceVersions',\n },\n {\n kind: referenceForModel(models.SubscriptionModel),\n prop: 'subscriptions',\n isList: true,\n },\n ],\n getOperatorsWithStatuses: getClusterServiceVersionsWithStatuses,\n operatorRowLoader: async () =>\n (\n await import(\n './components/dashboard/csv-status' /* webpackChunkName: \"csv-dashboard-status\" */\n )\n ).default,\n },\n flags: {\n required: [FLAGS.CAN_LIST_OPERATOR_GROUP],\n },\n },\n];\n\nexport default plugin;\n","const plugin = [];\n\nexport default plugin;\n","import * as _ from 'lodash';\nimport { ModelDefinition, Plugin } from '@console/plugin-sdk';\nimport * as models from './models';\n\ntype ConsumedExtensions = ModelDefinition;\n\nconst plugin: Plugin<ConsumedExtensions> = [\n {\n type: 'ModelDefinition',\n properties: {\n models: _.values(models),\n },\n },\n];\n\nexport default plugin;\n","// See console-extensions.json instead\nexport default [];\n","// See console-extensions.json instead\nexport default [];\n","import * as _ from 'lodash';\nimport { Plugin, ModelDefinition, ModelFeatureFlag } from '@console/plugin-sdk';\nimport { defaultDecoratorsPlugin } from './components/graph-view/components/nodes/decorators/defaultDecoratorsPlugin';\nimport { TopologyDecoratorProvider } from './extensions';\nimport * as models from './models';\nimport {\n OperatorsTopologyConsumedExtensions,\n operatorsTopologyPlugin,\n} from './operators/operatorsTopologyPlugin';\n\ntype ConsumedExtensions =\n | ModelDefinition\n | ModelFeatureFlag\n | TopologyDecoratorProvider\n | OperatorsTopologyConsumedExtensions;\n\nconst plugin: Plugin<ConsumedExtensions> = [\n {\n type: 'ModelDefinition',\n properties: {\n models: _.values(models),\n },\n },\n ...operatorsTopologyPlugin,\n ...defaultDecoratorsPlugin,\n];\n\nexport default plugin;\n","// See console-extensions.json instead\nexport default [];\n","// See console-extensions.json instead\nexport default [];\n","import * as _ from 'lodash-es';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as classNames from 'classnames';\nimport { sortable } from '@patternfly/react-table';\n\nimport { DetailsPage, ListPage, Table, TableData } from './factory';\nimport {\n DetailsItem,\n Kebab,\n LabelList,\n ResourceIcon,\n ResourceKebab,\n ResourceLink,\n ResourceSummary,\n SectionHeading,\n Selector,\n navFactory,\n} from './utils';\nimport { ServiceModel } from '../models';\n\nconst menuActions = [\n Kebab.factory.ModifyPodSelector,\n ...Kebab.getExtensionsActionsForKind(ServiceModel),\n ...Kebab.factory.common,\n];\n\nconst ServiceLocation = ({ s }) => {\n const { t } = useTranslation();\n switch (s.spec.type) {\n case 'NodePort': {\n const clusterIP = s.spec.clusterIP ? `${s.spec.clusterIP}:` : '';\n return _.map(s.spec.ports, (portObj, i) => {\n return (\n <div key={i} className=\"co-truncate co-select-to-copy\">\n {clusterIP}\n {portObj.nodePort}\n </div>\n );\n });\n }\n\n case 'LoadBalancer': {\n if (!s.status?.loadBalancer?.ingress?.length) {\n return <div className=\"co-truncate\">{t('public~Pending')}</div>;\n }\n return _.map(s.status.loadBalancer.ingress, (ingress, i) => {\n return (\n <div key={i} className=\"co-truncate co-select-to-copy\">\n {ingress.hostname || ingress.ip || '-'}\n </div>\n );\n });\n }\n\n case 'ExternalName': {\n return _.map(s.spec.ports, (portObj, i) => {\n const externalName = s.spec.externalName ? `${s.spec.externalName}:` : '';\n return (\n <div key={i} className=\"co-truncate co-select-to-copy\">\n {externalName}\n {portObj.port}\n </div>\n );\n });\n }\n\n default: {\n if (s.spec.clusterIP === 'None') {\n return <div className=\"co-truncate\">{t('public~None')}</div>;\n }\n return _.map(s.spec.ports, (portObj, i) => {\n const clusterIP = s.spec.clusterIP ? `${s.spec.clusterIP}:` : '';\n return (\n <div key={i} className=\"co-truncate co-select-to-copy\">\n {clusterIP}\n {portObj.port}\n </div>\n );\n });\n }\n }\n};\n\nconst kind = 'Service';\n\nconst tableColumnClasses = [\n 'pf-v5-u-w-25-on-xl',\n 'pf-m-hidden pf-m-visible-on-md',\n 'pf-m-hidden pf-m-visible-on-lg',\n 'pf-m-hidden pf-m-visible-on-xl',\n 'pf-m-hidden pf-m-visible-on-xl',\n Kebab.columnClass,\n];\n\nconst ServiceTableRow = ({ obj: s }) => {\n return (\n <>\n <TableData className={tableColumnClasses[0]}>\n <ResourceLink kind={kind} name={s.metadata.name} namespace={s.metadata.namespace} />\n </TableData>\n <TableData\n className={classNames(tableColumnClasses[1], 'co-break-word')}\n columnID=\"namespace\"\n >\n <ResourceLink kind=\"Namespace\" name={s.metadata.namespace} />\n </TableData>\n <TableData className={tableColumnClasses[2]}>\n <LabelList kind={kind} labels={s.metadata.labels} />\n </TableData>\n <TableData className={tableColumnClasses[3]}>\n <Selector selector={s.spec.selector} namespace={s.metadata.namespace} />\n </TableData>\n <TableData className={tableColumnClasses[4]}>\n <ServiceLocation s={s} />\n </TableData>\n <TableData className={tableColumnClasses[5]}>\n <ResourceKebab actions={menuActions} kind={kind} resource={s} />\n </TableData>\n </>\n );\n};\n\nconst ServiceAddress = ({ s }) => {\n const { t } = useTranslation();\n const ServiceIPsRow = (name, desc, ips, note = null) => (\n <div className=\"co-ip-row\">\n <div className=\"row\">\n <div className=\"col-xs-6\">\n <p className=\"ip-name\">{name}</p>\n <p className=\"ip-desc\">{desc}</p>\n </div>\n <div className=\"col-xs-6\">\n {note && <span className=\"text-muted\">{note}</span>}\n {ips.join(', ')}\n </div>\n </div>\n </div>\n );\n\n const ServiceType = (type) => {\n switch (type) {\n case 'NodePort':\n return ServiceIPsRow(\n t('public~Node port'),\n t('public~Accessible outside the cluster'),\n _.map(s.spec.ports, 'nodePort'),\n t('public~(all nodes): '),\n );\n case 'LoadBalancer':\n return ServiceIPsRow(\n t('public~External load balancer'),\n t('public~Ingress points of load balancer'),\n _.map(s.status.loadBalancer.ingress, (i) => i.hostname || i.ip || '-'),\n );\n case 'ExternalName':\n return ServiceIPsRow(\n t('public~External service name'),\n t('public~Location of the resource that backs the service'),\n [s.spec.externalName],\n );\n default:\n return ServiceIPsRow(\n t('public~Cluster IP'),\n t('public~Accessible within the cluster only'),\n [s.spec.clusterIP],\n );\n }\n };\n\n return (\n <div>\n <div className=\"row co-ip-header\">\n <div className=\"col-xs-6\">{t('public~Type')}</div>\n <div className=\"col-xs-6\">{t('public~Location')}</div>\n </div>\n <div className=\"rows\">\n {ServiceType(s.spec.type)}\n {s.spec.externalIPs &&\n ServiceIPsRow(\n t('public~External IP'),\n t('public~IP Addresses accepting traffic for service'),\n s.spec.externalIPs,\n )}\n </div>\n </div>\n );\n};\n\nconst ServicePortMapping = ({ ports }) => {\n const { t } = useTranslation();\n return (\n <div>\n <div className=\"row co-ip-header\">\n <div className=\"col-xs-3\">{t('public~Name')}</div>\n <div className=\"col-xs-3\">{t('public~Port')}</div>\n <div className=\"col-xs-3\">{t('public~Protocol')}</div>\n <div className=\"col-xs-3\">{t('public~Pod port or name')}</div>\n </div>\n <div className=\"rows\">\n {ports.map((portObj, i) => {\n return (\n <div className=\"co-ip-row\" key={i}>\n <div className=\"row\">\n <div className=\"col-xs-3 co-text-service\">\n <p>{portObj.name || '-'}</p>\n {portObj.nodePort && <p className=\"co-text-node\">{t('public~Node port')}</p>}\n </div>\n <div className=\"col-xs-3 co-text-service\">\n <p>\n <ResourceIcon kind=\"Service\" />\n <span>{portObj.port}</span>\n </p>\n {portObj.nodePort && (\n <p className=\"co-text-node\">\n <ResourceIcon kind=\"Node\" />\n <span>{portObj.nodePort}</span>\n </p>\n )}\n </div>\n <div className=\"col-xs-3\">\n <p>{portObj.protocol}</p>\n </div>\n <div className=\"col-xs-3 co-text-pod\">\n <p>\n <ResourceIcon kind=\"Pod\" />\n <span>{portObj.targetPort}</span>\n </p>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nconst Details = ({ obj: s }) => {\n const { t } = useTranslation();\n return (\n <div className=\"co-m-pane__body\">\n <div className=\"row\">\n <div className=\"col-md-6\">\n <SectionHeading text={t('public~Service details')} />\n <ResourceSummary resource={s} showPodSelector>\n <DetailsItem label={t('public~Session affinity')} obj={s} path=\"spec.sessionAffinity\" />\n </ResourceSummary>\n </div>\n <div className=\"col-md-6\">\n <SectionHeading text={t('public~Service routing')} />\n <dl>\n <dt>{t('public~Hostname')}</dt>\n <dd>\n <div className=\"co-select-to-copy\">\n {s.metadata.name}.{s.metadata.namespace}.svc.cluster.local\n </div>\n <div>{t('public~Accessible within the cluster only')}</div>\n </dd>\n <dt>{t('public~Service address')}</dt>\n <dd className=\"service-ips\">\n <ServiceAddress s={s} />\n </dd>\n <DetailsItem label={t('public~Service port mapping')} obj={s} path=\"spec.ports\">\n <div className=\"service-ips\">\n {s.spec.ports ? <ServicePortMapping ports={s.spec.ports} /> : '-'}\n </div>\n </DetailsItem>\n </dl>\n </div>\n </div>\n </div>\n );\n};\n\nconst ServicesDetailsPage = (props) => (\n <DetailsPage\n {...props}\n menuActions={menuActions}\n pages={[navFactory.details(Details), navFactory.editYaml(), navFactory.pods()]}\n />\n);\n\nconst ServicesList = (props) => {\n const { t } = useTranslation();\n const ServiceTableHeader = () => {\n return [\n {\n title: t('public~Name'),\n sortField: 'metadata.name',\n transforms: [sortable],\n props: { className: tableColumnClasses[0] },\n },\n {\n title: t('public~Namespace'),\n sortField: 'metadata.namespace',\n transforms: [sortable],\n props: { className: tableColumnClasses[1] },\n id: 'namespace',\n },\n {\n title: t('public~Labels'),\n sortField: 'metadata.labels',\n transforms: [sortable],\n props: { className: tableColumnClasses[2] },\n },\n {\n title: t('public~Pod selector'),\n sortField: 'spec.selector',\n transforms: [sortable],\n props: { className: tableColumnClasses[3] },\n },\n {\n title: t('public~Location'),\n sortField: 'spec.clusterIP',\n transforms: [sortable],\n props: { className: tableColumnClasses[4] },\n },\n {\n title: '',\n props: { className: tableColumnClasses[5] },\n },\n ];\n };\n return (\n <Table\n {...props}\n aria-label={t('public~Services')}\n Header={ServiceTableHeader}\n Row={ServiceTableRow}\n virtualize\n />\n );\n};\n\nconst ServicesPage = (props) => (\n <ListPage canCreate={true} ListComponent={ServicesList} {...props} />\n);\n\nexport { ServicesList, ServicesPage, ServicesDetailsPage };\n","import * as React from 'react';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n RequestMap,\n UseDashboardResources,\n} from '@console/dynamic-plugin-sdk/src/api/internal-types';\nimport {\n stopWatchPrometheusQuery,\n stopWatchURL,\n watchPrometheusQuery,\n watchURL,\n} from '@console/internal/actions/dashboards';\nimport { PrometheusResponse } from '@console/internal/components/graphs';\nimport { RESULTS_TYPE } from '@console/internal/reducers/dashboards';\nimport { useNotificationAlerts } from './useNotificationAlerts';\n\nexport const useDashboardResources: UseDashboardResources = ({\n prometheusQueries,\n urls,\n notificationAlertLabelSelectors,\n}) => {\n const [alerts, alertsLoaded, alertsLoadError] = useNotificationAlerts(\n notificationAlertLabelSelectors,\n );\n\n const dispatch = useDispatch();\n React.useEffect(() => {\n prometheusQueries?.forEach((query) =>\n dispatch(watchPrometheusQuery(query.query, null, query.timespan)),\n );\n urls?.forEach((url) => dispatch(watchURL(url?.url)));\n\n return () => {\n prometheusQueries?.forEach((query) => {\n dispatch(stopWatchPrometheusQuery(query.query, query.timespan));\n });\n urls?.forEach((url) => dispatch(stopWatchURL(url?.url)));\n };\n }, [dispatch, prometheusQueries, urls]);\n\n const urlResults = useSelector((state) => state.dashboards.get(RESULTS_TYPE.URL));\n const prometheusResults = useSelector(\n (state) => state.dashboards.get(RESULTS_TYPE.PROMETHEUS) as RequestMap<PrometheusResponse>,\n );\n\n return {\n urlResults,\n prometheusResults,\n notificationAlerts: {\n alerts,\n loaded: alertsLoaded,\n loadError: alertsLoadError,\n },\n };\n};\n","exports.default = {\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$ref\": \"#/definitions/AnyConsolePluginManifest\",\n \"description\": \"Schema of Console plugin's `plugin-manifest.json` file.\",\n \"definitions\": {\n \"AnyConsolePluginManifest\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/definitions/StandardConsolePluginManifest\"\n },\n {\n \"$ref\": \"#/definitions/LegacyConsolePluginManifest\"\n }\n ],\n \"description\": \"This type supports both standard and legacy Console dynamic plugin manifest formats.\\n\\nConsole application automatically adapts the manifest to standard format when loading the given plugin.\"\n },\n \"StandardConsolePluginManifest\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"baseURL\": {\n \"type\": \"string\"\n },\n \"extensions\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/Extension\"\n }\n },\n \"loadScripts\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"registrationMethod\": {\n \"$ref\": \"#/definitions/PluginRegistrationMethod\"\n },\n \"buildHash\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\"\n },\n \"dependencies\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"customProperties\": {\n \"type\": \"object\",\n \"properties\": {\n \"console\": {\n \"$ref\": \"#/definitions/ConsoleSupportedCustomProperties\"\n }\n },\n \"additionalProperties\": {}\n }\n },\n \"required\": [\n \"baseURL\",\n \"extensions\",\n \"loadScripts\",\n \"name\",\n \"registrationMethod\",\n \"version\"\n ],\n \"description\": \"Standard Console dynamic plugin manifest format.\"\n },\n \"Extension\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\"\n },\n \"properties\": {\n \"$ref\": \"#/definitions/AnyObject\"\n },\n \"flags\": {\n \"$ref\": \"#/definitions/ExtensionFlags\"\n }\n },\n \"required\": [\n \"type\",\n \"properties\"\n ],\n \"additionalProperties\": {}\n },\n \"AnyObject\": {\n \"type\": \"object\",\n \"additionalProperties\": {},\n \"description\": \"The type `{}` doesn't mean \\\"any empty object\\\", it means \\\"any non-nullish value\\\".\\n\\nUse the `AnyObject` type for objects whose structure is unknown.\"\n },\n \"ExtensionFlags\": {\n \"type\": \"object\",\n \"properties\": {\n \"required\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"disallowed\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n },\n \"additionalProperties\": false\n },\n \"PluginRegistrationMethod\": {\n \"type\": \"string\",\n \"enum\": [\n \"callback\",\n \"custom\"\n ]\n },\n \"ConsoleSupportedCustomProperties\": {\n \"type\": \"object\",\n \"properties\": {\n \"displayName\": {\n \"type\": \"string\",\n \"description\": \"User-friendly plugin name.\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"User-friendly plugin description.\"\n },\n \"disableStaticPlugins\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Disable the given static plugins when this plugin gets loaded.\"\n }\n },\n \"additionalProperties\": false,\n \"description\": \"Additional plugin metadata supported by the Console application.\"\n },\n \"LegacyConsolePluginManifest\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"displayName\": {\n \"type\": \"string\",\n \"description\": \"User-friendly plugin name.\"\n },\n \"description\": {\n \"type\": \"string\",\n \"description\": \"User-friendly plugin description.\"\n },\n \"disableStaticPlugins\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Disable the given static plugins when this plugin gets loaded.\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\"\n },\n \"dependencies\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"string\"\n }\n },\n \"extensions\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/Extension\"\n }\n }\n },\n \"required\": [\n \"extensions\",\n \"name\",\n \"version\"\n ],\n \"description\": \"Legacy Console dynamic plugin manifest format.\"\n }\n }\n};"],"sourceRoot":""}