Skip to content

feat(frontend): add label selector and resource type filtering in resource map - #6821

Open
Rucha0901 wants to merge 8 commits into
kubernetes-sigs:mainfrom
Rucha0901:feature/resource-map-label-kind-filtering
Open

feat(frontend): add label selector and resource type filtering in resource map#6821
Rucha0901 wants to merge 8 commits into
kubernetes-sigs:mainfrom
Rucha0901:feature/resource-map-label-kind-filtering

Conversation

@Rucha0901

Copy link
Copy Markdown
Contributor

Summary

This PR adds support for filtering Kubernetes resource types and label selectors in the Resource Map component.

Related Issue

Fixes #6820

Changes

  • Extended GraphFilter union type in graphFiltering.ts with resourceType and labelSelector variants.
  • Updated matchesAllFilters logic in graphFiltering.ts to filter nodes matching selected kinds and key-value label selectors.
  • Added UI inputs in GraphView.tsx for multi-select resource type dropdown and label search text field.
  • Updated computeFilterSig and buildFilters to serialize and merge resource type and label filters properly.
  • Added comprehensive unit tests in graphFiltering.test.ts to test resource kind and label selector filter matching.

Steps to Test

  1. Open Resource Map in Headlamp.
  2. Select resource types (e.g., Pod, Deployment, Service) from the Resource Types dropdown.
  3. Enter label selector key-value pairs (e.g. app=nginx, env=prod) in the Labels search field.
  4. Verify graph nodes update according to active filters while retaining connected/related nodes.

Screenshots (if applicable)

N/A

Notes for the Reviewer

  • All tests pass (vitest graphFiltering.test.ts).
  • Code formatted with Prettier and clean lint check (npm run ci-lint).
  • DCO signed off.

@kubernetes-prow kubernetes-prow Bot added the cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. label Aug 3, 2026
@kubernetes-prow

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: Rucha0901
Once this PR has been reviewed and has the lgtm label, please assign sniok for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@kubernetes-prow kubernetes-prow Bot added the size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. label Aug 3, 2026
@skoeva skoeva added frontend Issues related to the frontend resourceMap labels Aug 3, 2026
@skoeva skoeva added this to the v0.45.0 milestone Aug 3, 2026
@illume illume added documentation Improvements or additions to documentation gatewayAPI Related to gateway API functionality. headlamp-plugin Related to the headlamp-plugin NPM package. kind/feature Categorizes issue or PR as related to a new feature. plugins quality Related to improving the quality of the app search To do with searching. testing labels Aug 5, 2026
@Rucha0901

Copy link
Copy Markdown
Contributor Author

/assign
@kahirokunn I have already worked on this issue and raised the PR . Can you plzunassign it for me?

@illume
illume requested a lite review from Copilot August 5, 2026 07:32

@illume illume left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this PR.

A few of the commits don't quite follow the project guidelines. We use Linux kernel style for git commits — have a look at the contributing guide and previous commits with git log.

Commits that need attention
  • Address review feedback on plugin keyboard shortcuts types — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • refactor(frontend): standardize theme breakpoints and expose hook to plugins — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • test(frontend): normalize storybook css hashes and update snapshots — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • feat(frontend): add label selector and resource type filtering in resource map — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • test(frontend): update storybook snapshots for GraphView filtering UI controls — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • fix(frontend): add optional chaining for metadata resourceVersion in streamingApi — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • i18n(frontend): update translation catalogs for resource map filtering controls — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
Commit guidelines
  • Use atomic commits focused on a single change.
  • Use the title format <area>: <Description of changes> — description must start with a capital letter.
  • Keep the title under 72 characters (soft requirement).
  • Explain the intention and why the change is needed.
  • Make commit titles meaningful and describe what changed.
  • Do not add code that a later commit rewrites; squash or reorder commits instead.
  • Do not include Fixes #NN in commit messages.

Good examples:

  • frontend: HomeButton: Fix so it navigates to home
  • backend: config: Add enable-dynamic-clusters flag

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of files (300). Try reducing the number of changed files and requesting a review from Copilot again.

@illume
illume requested a lite review from Copilot August 5, 2026 18:17

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of files (300). Try reducing the number of changed files and requesting a review from Copilot again.

@illume illume left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this PR.

the PR has a merge-main commit; please rebase against main to keep the history clean.

Why this matters

Merge commits from main make the PR history harder to review. Please rebase your branch on top of the latest main instead, then update the PR with the rebased commits.

A few of the commits don't quite follow the project guidelines. We use Linux kernel style for git commits — have a look at the contributing guide and previous commits with git log.

Commits that need attention
  • Address review feedback on plugin keyboard shortcuts types — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • refactor(frontend): standardize theme breakpoints and expose hook to plugins — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • test(frontend): normalize storybook css hashes and update snapshots — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • feat(frontend): add label selector and resource type filtering in resource map — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • test(frontend): update storybook snapshots for GraphView filtering UI controls — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • fix(frontend): add optional chaining for metadata resourceVersion in streamingApi — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • i18n(frontend): update translation catalogs for resource map filtering controls — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • fix(frontend): resolve syntax error in plugin registry — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • chore(frontend): normalize emotion snapshots — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
Commit guidelines
  • Use atomic commits focused on a single change.
  • Use the title format <area>: <Description of changes> — description must start with a capital letter.
  • Keep the title under 72 characters (soft requirement).
  • Explain the intention and why the change is needed.
  • Make commit titles meaningful and describe what changed.
  • Do not add code that a later commit rewrites; squash or reorder commits instead.
  • Do not include Fixes #NN in commit messages.

Good examples:

  • frontend: HomeButton: Fix so it navigates to home
  • backend: config: Add enable-dynamic-clusters flag

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 862 files, which is 562 over the limit of 300.

To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 1efcbc35-b0db-49cb-bf1e-bcf543fc4c1a

📥 Commits

Reviewing files that changed from the base of the PR and between 0b82b6e and ea3a0cc.

⛔ Files ignored due to path filters (1)
  • frontend/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (862)
  • docs/development/api/.nojekyll
  • docs/development/api/classes/lib_k8s_clusterRole.ClusterRole.md
  • docs/development/api/classes/lib_k8s_clusterRoleBinding.ClusterRoleBinding.md
  • docs/development/api/classes/lib_k8s_configMap.ConfigMap.md
  • docs/development/api/classes/lib_k8s_crd.CustomResourceDefinition.md
  • docs/development/api/classes/lib_k8s_cronJob.CronJob.md
  • docs/development/api/classes/lib_k8s_daemonSet.DaemonSet.md
  • docs/development/api/classes/lib_k8s_deployment.Deployment.md
  • docs/development/api/classes/lib_k8s_endpoints.Endpoints.md
  • docs/development/api/classes/lib_k8s_event.Event.md
  • docs/development/api/classes/lib_k8s_hpa.HPA.md
  • docs/development/api/classes/lib_k8s_ingress.Ingress.md
  • docs/development/api/classes/lib_k8s_ingressClass.IngressClass.md
  • docs/development/api/classes/lib_k8s_job.Job.md
  • docs/development/api/classes/lib_k8s_lease.Lease.md
  • docs/development/api/classes/lib_k8s_limitRange.LimitRange.md
  • docs/development/api/classes/lib_k8s_mutatingWebhookConfiguration.MutatingWebhookConfiguration.md
  • docs/development/api/classes/lib_k8s_namespace.Namespace.md
  • docs/development/api/classes/lib_k8s_networkpolicy.NetworkPolicy.md
  • docs/development/api/classes/lib_k8s_node.Node.md
  • docs/development/api/classes/lib_k8s_persistentVolume.PersistentVolume.md
  • docs/development/api/classes/lib_k8s_persistentVolumeClaim.PersistentVolumeClaim.md
  • docs/development/api/classes/lib_k8s_pod.Pod.md
  • docs/development/api/classes/lib_k8s_podDisruptionBudget.PDB.md
  • docs/development/api/classes/lib_k8s_priorityClass.PriorityClass.md
  • docs/development/api/classes/lib_k8s_replicaSet.ReplicaSet.md
  • docs/development/api/classes/lib_k8s_resourceQuota.ResourceQuota.md
  • docs/development/api/classes/lib_k8s_role.Role.md
  • docs/development/api/classes/lib_k8s_roleBinding.RoleBinding.md
  • docs/development/api/classes/lib_k8s_runtime.RuntimeClass.md
  • docs/development/api/classes/lib_k8s_secret.Secret.md
  • docs/development/api/classes/lib_k8s_service.Service.md
  • docs/development/api/classes/lib_k8s_serviceAccount.ServiceAccount.md
  • docs/development/api/classes/lib_k8s_statefulSet.StatefulSet.md
  • docs/development/api/classes/lib_k8s_storageClass.StorageClass.md
  • docs/development/api/classes/lib_k8s_validatingWebhookConfiguration.ValidatingWebhookConfiguration.md
  • docs/development/api/classes/lib_k8s_vpa.VPA.md
  • docs/development/api/classes/plugin_lib.Headlamp.md
  • docs/development/api/classes/plugin_lib.Plugin.md
  • docs/development/api/classes/plugin_registry.PluginManager.md
  • docs/development/api/classes/plugin_registry.Registry.md
  • docs/development/api/enums/plugin_registry.DefaultAppBarAction.md
  • docs/development/api/enums/plugin_registry.DefaultDetailsViewSection.md
  • docs/development/api/enums/plugin_registry.DefaultSidebars.md
  • docs/development/api/interfaces/lib_k8s_apiProxy.ApiError.md
  • docs/development/api/interfaces/lib_k8s_apiProxy.ApiInfo.md
  • docs/development/api/interfaces/lib_k8s_apiProxy.ClusterRequest.md
  • docs/development/api/interfaces/lib_k8s_apiProxy.ClusterRequestParams.md
  • docs/development/api/interfaces/lib_k8s_apiProxy.QueryParameters.md
  • docs/development/api/interfaces/lib_k8s_apiProxy.RequestParams.md
  • docs/development/api/interfaces/lib_k8s_apiProxy.StreamArgs.md
  • docs/development/api/interfaces/lib_k8s_apiProxy.StreamResultsParams.md
  • docs/development/api/interfaces/lib_k8s_cluster.ApiListOptions.md
  • docs/development/api/interfaces/lib_k8s_cluster.ApiListSingleNamespaceOptions.md
  • docs/development/api/interfaces/lib_k8s_cluster.AuthRequestResourceAttrs.md
  • docs/development/api/interfaces/lib_k8s_cluster.Cluster.md
  • docs/development/api/interfaces/lib_k8s_cluster.ContainerState.md
  • docs/development/api/interfaces/lib_k8s_cluster.KubeCondition.md
  • docs/development/api/interfaces/lib_k8s_cluster.KubeContainer.md
  • docs/development/api/interfaces/lib_k8s_cluster.KubeContainerProbe.md
  • docs/development/api/interfaces/lib_k8s_cluster.KubeContainerStatus.md
  • docs/development/api/interfaces/lib_k8s_cluster.KubeManagedFields.md
  • docs/development/api/interfaces/lib_k8s_cluster.KubeManagedFieldsEntry.md
  • docs/development/api/interfaces/lib_k8s_cluster.KubeMetadata.md
  • docs/development/api/interfaces/lib_k8s_cluster.KubeMetrics.md
  • docs/development/api/interfaces/lib_k8s_cluster.KubeObjectIface.md
  • docs/development/api/interfaces/lib_k8s_cluster.KubeObjectInterface.md
  • docs/development/api/interfaces/lib_k8s_cluster.KubeOwnerReference.md
  • docs/development/api/interfaces/lib_k8s_cluster.LabelSelector.md
  • docs/development/api/interfaces/lib_k8s_cluster.StringDict.md
  • docs/development/api/interfaces/lib_k8s_configMap.KubeConfigMap.md
  • docs/development/api/interfaces/lib_k8s_crd.CRClassArgs.md
  • docs/development/api/interfaces/lib_k8s_crd.KubeCRD.md
  • docs/development/api/interfaces/lib_k8s_cronJob.KubeCronJob.md
  • docs/development/api/interfaces/lib_k8s_daemonSet.KubeDaemonSet.md
  • docs/development/api/interfaces/lib_k8s_deployment.KubeDeployment.md
  • docs/development/api/interfaces/lib_k8s_endpoints.KubeEndpoint.md
  • docs/development/api/interfaces/lib_k8s_endpoints.KubeEndpointAddress.md
  • docs/development/api/interfaces/lib_k8s_endpoints.KubeEndpointPort.md
  • docs/development/api/interfaces/lib_k8s_endpoints.KubeEndpointSubset.md
  • docs/development/api/interfaces/lib_k8s_event.KubeEvent.md
  • docs/development/api/interfaces/lib_k8s_hpa.CrossVersionObjectReference.md
  • docs/development/api/interfaces/lib_k8s_hpa.KubeHPA.md
  • docs/development/api/interfaces/lib_k8s_ingress.IngressBackend.md
  • docs/development/api/interfaces/lib_k8s_ingress.IngressRule.md
  • docs/development/api/interfaces/lib_k8s_ingress.KubeIngress.md
  • docs/development/api/interfaces/lib_k8s_ingressClass.KubeIngressClass.md
  • docs/development/api/interfaces/lib_k8s_job.KubeJob.md
  • docs/development/api/interfaces/lib_k8s_kubeconfig.KubeconfigObject.md
  • docs/development/api/interfaces/lib_k8s_lease.KubeLease.md
  • docs/development/api/interfaces/lib_k8s_lease.LeaseSpec.md
  • docs/development/api/interfaces/lib_k8s_limitRange.KubeLimitRange.md
  • docs/development/api/interfaces/lib_k8s_limitRange.LimitRangeSpec.md
  • docs/development/api/interfaces/lib_k8s_mutatingWebhookConfiguration.KubeMutatingWebhookConfiguration.md
  • docs/development/api/interfaces/lib_k8s_mutatingWebhookConfiguration.KubeRuleWithOperations.md
  • docs/development/api/interfaces/lib_k8s_mutatingWebhookConfiguration.KubeWebhookClientConfig.md
  • docs/development/api/interfaces/lib_k8s_namespace.KubeNamespace.md
  • docs/development/api/interfaces/lib_k8s_networkpolicy.IPBlock.md
  • docs/development/api/interfaces/lib_k8s_networkpolicy.KubeNetworkPolicy.md
  • docs/development/api/interfaces/lib_k8s_networkpolicy.NetworkPolicyEgressRule.md
  • docs/development/api/interfaces/lib_k8s_networkpolicy.NetworkPolicyIngressRule.md
  • docs/development/api/interfaces/lib_k8s_networkpolicy.NetworkPolicyPeer.md
  • docs/development/api/interfaces/lib_k8s_networkpolicy.NetworkPolicyPort.md
  • docs/development/api/interfaces/lib_k8s_node.KubeNode.md
  • docs/development/api/interfaces/lib_k8s_persistentVolume.KubePersistentVolume.md
  • docs/development/api/interfaces/lib_k8s_persistentVolumeClaim.KubePersistentVolumeClaim.md
  • docs/development/api/interfaces/lib_k8s_pod.ExecOptions.md
  • docs/development/api/interfaces/lib_k8s_pod.KubePod.md
  • docs/development/api/interfaces/lib_k8s_pod.KubePodSpec.md
  • docs/development/api/interfaces/lib_k8s_pod.KubeVolume.md
  • docs/development/api/interfaces/lib_k8s_pod.LogOptions.md
  • docs/development/api/interfaces/lib_k8s_podDisruptionBudget.KubePDB.md
  • docs/development/api/interfaces/lib_k8s_priorityClass.KubePriorityClass.md
  • docs/development/api/interfaces/lib_k8s_replicaSet.KubeReplicaSet.md
  • docs/development/api/interfaces/lib_k8s_resourceQuota.KubeResourceQuota.md
  • docs/development/api/interfaces/lib_k8s_role.KubeRole.md
  • docs/development/api/interfaces/lib_k8s_roleBinding.KubeRoleBinding.md
  • docs/development/api/interfaces/lib_k8s_runtime.KubeRuntimeClass.md
  • docs/development/api/interfaces/lib_k8s_secret.KubeSecret.md
  • docs/development/api/interfaces/lib_k8s_service.KubeLoadBalancerIngress.md
  • docs/development/api/interfaces/lib_k8s_service.KubePortStatus.md
  • docs/development/api/interfaces/lib_k8s_service.KubeService.md
  • docs/development/api/interfaces/lib_k8s_serviceAccount.KubeServiceAccount.md
  • docs/development/api/interfaces/lib_k8s_statefulSet.KubeStatefulSet.md
  • docs/development/api/interfaces/lib_k8s_storageClass.KubeStorageClass.md
  • docs/development/api/interfaces/lib_k8s_token.KubeToken.md
  • docs/development/api/interfaces/lib_k8s_validatingWebhookConfiguration.KubeValidatingWebhookConfiguration.md
  • docs/development/api/interfaces/lib_k8s_vpa.KubeVPA.md
  • docs/development/api/interfaces/lib_router.Route.md
  • docs/development/api/interfaces/lib_router.RouteURLProps.md
  • docs/development/api/interfaces/lib_util.TimeAgoOptions.md
  • docs/development/api/interfaces/plugin_lib.AppMenu.md
  • docs/development/api/interfaces/plugin_registry.AppLogoProps.md
  • docs/development/api/interfaces/plugin_registry.ClusterChooserProps.md
  • docs/development/api/interfaces/plugin_registry.CreateResourceEvent.md
  • docs/development/api/interfaces/plugin_registry.DeleteResourceEvent.md
  • docs/development/api/interfaces/plugin_registry.DetailsViewSectionProps.md
  • docs/development/api/interfaces/plugin_registry.EditResourceEvent.md
  • docs/development/api/interfaces/plugin_registry.ErrorBoundaryEvent.md
  • docs/development/api/interfaces/plugin_registry.EventListEvent.md
  • docs/development/api/interfaces/plugin_registry.HeadlampEvent.md
  • docs/development/api/interfaces/plugin_registry.LogsEvent.md
  • docs/development/api/interfaces/plugin_registry.PluginLoadingErrorEvent.md
  • docs/development/api/interfaces/plugin_registry.PluginSettingsDetailsProps.md
  • docs/development/api/interfaces/plugin_registry.PluginsLoadedEvent.md
  • docs/development/api/interfaces/plugin_registry.PodAttachEvent.md
  • docs/development/api/interfaces/plugin_registry.ResourceDetailsViewLoadedEvent.md
  • docs/development/api/interfaces/plugin_registry.ResourceListViewLoadedEvent.md
  • docs/development/api/interfaces/plugin_registry.RestartResourceEvent.md
  • docs/development/api/interfaces/plugin_registry.ScaleResourceEvent.md
  • docs/development/api/interfaces/plugin_registry.SectionFuncProps.md
  • docs/development/api/interfaces/plugin_registry.SidebarEntryProps.md
  • docs/development/api/interfaces/plugin_registry.TerminalEvent.md
  • docs/development/api/modules/lib_k8s.md
  • docs/development/api/modules/lib_k8s_apiProxy.md
  • docs/development/api/modules/lib_k8s_cluster.md
  • docs/development/api/modules/lib_k8s_clusterRole.md
  • docs/development/api/modules/lib_k8s_clusterRoleBinding.md
  • docs/development/api/modules/lib_k8s_configMap.md
  • docs/development/api/modules/lib_k8s_crd.md
  • docs/development/api/modules/lib_k8s_cronJob.md
  • docs/development/api/modules/lib_k8s_daemonSet.md
  • docs/development/api/modules/lib_k8s_deployment.md
  • docs/development/api/modules/lib_k8s_endpoints.md
  • docs/development/api/modules/lib_k8s_event.md
  • docs/development/api/modules/lib_k8s_hpa.md
  • docs/development/api/modules/lib_k8s_ingress.md
  • docs/development/api/modules/lib_k8s_ingressClass.md
  • docs/development/api/modules/lib_k8s_job.md
  • docs/development/api/modules/lib_k8s_kubeconfig.md
  • docs/development/api/modules/lib_k8s_lease.md
  • docs/development/api/modules/lib_k8s_limitRange.md
  • docs/development/api/modules/lib_k8s_mutatingWebhookConfiguration.md
  • docs/development/api/modules/lib_k8s_namespace.md
  • docs/development/api/modules/lib_k8s_networkpolicy.md
  • docs/development/api/modules/lib_k8s_node.md
  • docs/development/api/modules/lib_k8s_persistentVolume.md
  • docs/development/api/modules/lib_k8s_persistentVolumeClaim.md
  • docs/development/api/modules/lib_k8s_pod.md
  • docs/development/api/modules/lib_k8s_podDisruptionBudget.md
  • docs/development/api/modules/lib_k8s_priorityClass.md
  • docs/development/api/modules/lib_k8s_priorityClasses.md
  • docs/development/api/modules/lib_k8s_replicaSet.md
  • docs/development/api/modules/lib_k8s_resourceQuota.md
  • docs/development/api/modules/lib_k8s_role.md
  • docs/development/api/modules/lib_k8s_roleBinding.md
  • docs/development/api/modules/lib_k8s_runtime.md
  • docs/development/api/modules/lib_k8s_secret.md
  • docs/development/api/modules/lib_k8s_service.md
  • docs/development/api/modules/lib_k8s_serviceAccount.md
  • docs/development/api/modules/lib_k8s_statefulSet.md
  • docs/development/api/modules/lib_k8s_storageClass.md
  • docs/development/api/modules/lib_k8s_token.md
  • docs/development/api/modules/lib_k8s_validatingWebhookConfiguration.md
  • docs/development/api/modules/lib_k8s_vpa.md
  • docs/development/api/modules/lib_router.md
  • docs/development/api/modules/lib_util.auth.md
  • docs/development/api/modules/lib_util.md
  • docs/development/api/modules/lib_util.units.md
  • docs/development/api/modules/plugin_lib.md
  • docs/development/api/modules/plugin_registry.md
  • frontend/package.json
  • frontend/src/components/404/__snapshots__/NotFoundComponent.Default.stories.storyshot
  • frontend/src/components/App/Home/__snapshots__/RecentClusters.MoreThanThreeClusters.stories.storyshot
  • frontend/src/components/App/Home/__snapshots__/RecentClusters.NoClusters.stories.storyshot
  • frontend/src/components/App/Home/__snapshots__/RecentClusters.OneExistingCluster.stories.storyshot
  • frontend/src/components/App/Home/__snapshots__/RecentClusters.OneRecentCluster.stories.storyshot
  • frontend/src/components/App/Home/__snapshots__/RecentClusters.ThreeClusters.stories.storyshot
  • frontend/src/components/App/Home/__snapshots__/RecentClusters.TwoExistingClusters.stories.storyshot
  • frontend/src/components/App/Home/__snapshots__/RecentClusters.TwoRecentClusters.stories.storyshot
  • frontend/src/components/App/Home/__snapshots__/RecentClusters.WithObsoleteClusters.stories.storyshot
  • frontend/src/components/App/Home/__snapshots__/SquareButton.Basic.stories.storyshot
  • frontend/src/components/App/Home/__snapshots__/SquareButton.DifferentIconColor.stories.storyshot
  • frontend/src/components/App/Home/__snapshots__/SquareButton.DifferentIconSize.stories.storyshot
  • frontend/src/components/App/Home/__snapshots__/SquareButton.Primary.stories.storyshot
  • frontend/src/components/App/Home/__snapshots__/index.Base.stories.storyshot
  • frontend/src/components/App/Home/__snapshots__/index.LoadingClusters.stories.storyshot
  • frontend/src/components/App/Notifications/__snapshots__/Notifications.MixedNotifications.stories.storyshot
  • frontend/src/components/App/Notifications/__snapshots__/Notifications.NoNotifications.stories.storyshot
  • frontend/src/components/App/Notifications/__snapshots__/Notifications.WithMultipleClusters.stories.storyshot
  • frontend/src/components/App/Notifications/__snapshots__/Notifications.WithReadNotifications.stories.storyshot
  • frontend/src/components/App/Notifications/__snapshots__/Notifications.WithUnreadNotifications.stories.storyshot
  • frontend/src/components/App/PluginSettings/__snapshots__/PluginSettings.DefaultSaveEnable.stories.storyshot
  • frontend/src/components/App/PluginSettings/__snapshots__/PluginSettings.Empty.stories.storyshot
  • frontend/src/components/App/PluginSettings/__snapshots__/PluginSettings.EmptyHomepageItems.stories.storyshot
  • frontend/src/components/App/PluginSettings/__snapshots__/PluginSettings.FewItems.stories.storyshot
  • frontend/src/components/App/PluginSettings/__snapshots__/PluginSettings.ManyItems.stories.storyshot
  • frontend/src/components/App/PluginSettings/__snapshots__/PluginSettings.MigrationScenario.stories.storyshot
  • frontend/src/components/App/PluginSettings/__snapshots__/PluginSettings.MoreItems.stories.storyshot
  • frontend/src/components/App/PluginSettings/__snapshots__/PluginSettings.MultipleLocations.stories.storyshot
  • frontend/src/components/App/PluginSettings/__snapshots__/PluginSettingsDetails.WithAutoSave.stories.storyshot
  • frontend/src/components/App/PluginSettings/__snapshots__/PluginSettingsDetails.WithoutAutoSave.stories.storyshot
  • frontend/src/components/App/Settings/ShortcutsSettings.tsx
  • frontend/src/components/App/Settings/__snapshots__/ClusterNameEditor.Default.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/ClusterNameEditor.WithInvalidName.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/ClusterNameEditor.WithNewName.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/ClusterSelector.Default.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/ColorPicker.CustomInvalidInitial.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/ColorPicker.CustomModeInitial.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/ColorPicker.CustomValidInitial.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/ColorPicker.Default.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/ColorPicker.PresetSelected.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/DrawerModeSettings.DrawerEnabled.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/DrawerModeSettings.FullPage.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/IconPicker.CustomIconModeEnabled.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/IconPicker.DefaultOpen.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/IconPicker.SelectedPresetIcon.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/NodeShellSettings.Default.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/NumRowsInput.Default.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/PodDebugSettings.Default.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/PodDebugSettings.Disabled.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/Settings.General.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsButton.Default.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsCluster.Default.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsCluster.DynamicCluster.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsCluster.InvalidCluster.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsCluster.MultipleAllowedNamespaces.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsCluster.NamespaceValidation.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsCluster.NoClusters.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsCluster.WithAppearance.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsCluster.WithSavedSettings.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsClusters.ClusterListDisplay.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsClusters.EmptyClusterList.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsClusters.LongNamesAndURLs.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsClusters.ManyClusters.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsClusters.NullClusterState.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsClusters.SingleCluster.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/SettingsClusters.VariousConfigurations.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/ShortcutsSettings.Default.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/ThemePreview.Dark.stories.storyshot
  • frontend/src/components/App/Settings/__snapshots__/ThemePreview.Light.stories.storyshot
  • frontend/src/components/App/__snapshots__/Layout.Default.stories.storyshot
  • frontend/src/components/App/__snapshots__/Layout.ErrorState.stories.storyshot
  • frontend/src/components/App/__snapshots__/Layout.MultiCluster.stories.storyshot
  • frontend/src/components/App/__snapshots__/Layout.WithClusterRoute.stories.storyshot
  • frontend/src/components/App/__snapshots__/RouteSwitcher.Default.stories.storyshot
  • frontend/src/components/App/__snapshots__/TopBar.EmptyUserInfo.stories.storyshot
  • frontend/src/components/App/__snapshots__/TopBar.MultiCluster.stories.storyshot
  • frontend/src/components/App/__snapshots__/TopBar.NoToken.stories.storyshot
  • frontend/src/components/App/__snapshots__/TopBar.OneCluster.stories.storyshot
  • frontend/src/components/App/__snapshots__/TopBar.ProcessorAction.stories.storyshot
  • frontend/src/components/App/__snapshots__/TopBar.Token.stories.storyshot
  • frontend/src/components/App/__snapshots__/TopBar.TwoCluster.stories.storyshot
  • frontend/src/components/App/__snapshots__/TopBar.UndefinedData.stories.storyshot
  • frontend/src/components/App/__snapshots__/TopBar.WithEmailOnly.stories.storyshot
  • frontend/src/components/App/__snapshots__/TopBar.WithUserInfo.stories.storyshot
  • frontend/src/components/App/__snapshots__/VersionDialog.VersionDialog.stories.storyshot
  • frontend/src/components/App/icons.test.ts
  • frontend/src/components/App/icons.ts
  • frontend/src/components/Sidebar/NavigationTabs.tsx
  • frontend/src/components/Sidebar/Sidebar.tsx
  • frontend/src/components/Sidebar/__snapshots__/ClusterBadge.Default.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/ClusterBadge.LongName.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/ClusterBadge.WithAccentColor.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/ClusterBadge.WithIcon.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/HeadlampButton.CollapsedSidebar.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/HeadlampButton.Disabled.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/HeadlampButton.ExpandedSidebar.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/HeadlampButton.MobileOnlyHidden.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/HeadlampButton.MobileOnlyVisible.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/ListItemLink.Default.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/ListItemLink.IconOnly.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/ListItemLink.IconOnlySelected.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/ListItemLink.NoIcon.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/ListItemLink.Selected.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/ListItemLink.SubItem.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/ListItemLink.SubItemSelected.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/ListItemLink.UsingFullWidthPropFalse.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/ListItemLink.UsingFullWidthPropTrue.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/ListItemLink.WithDivider.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/ListItemLink.WithSubtitle.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/NavigationTabs.ClusterParentSelected.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/NavigationTabs.ItemWithoutOwnURLSelected.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/NavigationTabs.NetworkPoliciesSelected.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/NavigationTabs.SettingsParentSelected.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/NavigationTabs.WorkloadsChildSelected.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/NavigationTabs.WorkloadsParentSelected.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/Sidebar.HomeSidebarClosed.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/Sidebar.HomeSidebarOpen.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/Sidebar.InClusterSidebarClosed.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/Sidebar.InClusterSidebarOpen.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/Sidebar.SelectedItemWithSidebarOmitted.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/Sidebaritem.CollapsedSectionHeader.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/Sidebaritem.SectionHeader.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/Sidebaritem.Selected.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/Sidebaritem.StyledSectionHeader.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/Sidebaritem.Sublist.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/Sidebaritem.SublistExpanded.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/Sidebaritem.Unselected.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/VersionButton.CollapsedSidebar.stories.storyshot
  • frontend/src/components/Sidebar/__snapshots__/VersionButton.Default.stories.storyshot
  • frontend/src/components/account/__snapshots__/AuthToken.ShowActions.stories.storyshot
  • frontend/src/components/account/__snapshots__/AuthToken.ShowError.stories.storyshot
  • frontend/src/components/activity/__snapshots__/Activity.Basic.stories.storyshot
  • frontend/src/components/activity/__snapshots__/Activity.EmptyBar.stories.storyshot
  • frontend/src/components/advancedSearch/__snapshots__/AdvancedSearch.Default.stories.storyshot
  • frontend/src/components/advancedSearch/__snapshots__/ApiResourcePicker.Default.stories.storyshot
  • frontend/src/components/advancedSearch/__snapshots__/EmptyResults.Default.stories.storyshot
  • frontend/src/components/advancedSearch/__snapshots__/ResourceSearch.Default.stories.storyshot
  • frontend/src/components/advancedSearch/__snapshots__/SearchSettings.Default.stories.storyshot
  • frontend/src/components/authchooser/__snapshots__/AuthChooser.AnError.stories.storyshot
  • frontend/src/components/authchooser/__snapshots__/AuthChooser.AuthTypeoidc.stories.storyshot
  • frontend/src/components/authchooser/__snapshots__/AuthChooser.BasicAuthChooser.stories.storyshot
  • frontend/src/components/authchooser/__snapshots__/AuthChooser.HaveClusters.stories.storyshot
  • frontend/src/components/authchooser/__snapshots__/AuthChooser.Testing.stories.storyshot
  • frontend/src/components/cluster/Charts/__snapshots__/ResourceCharts.CpuChartNoMetrics.stories.storyshot
  • frontend/src/components/cluster/Charts/__snapshots__/ResourceCharts.CpuChartPod.stories.storyshot
  • frontend/src/components/cluster/Charts/__snapshots__/ResourceCharts.CpuChartWithMetrics.stories.storyshot
  • frontend/src/components/cluster/Charts/__snapshots__/ResourceCharts.MemoryChartNoMetrics.stories.storyshot
  • frontend/src/components/cluster/Charts/__snapshots__/ResourceCharts.MemoryChartPod.stories.storyshot
  • frontend/src/components/cluster/Charts/__snapshots__/ResourceCharts.MemoryChartWithMetrics.stories.storyshot
  • frontend/src/components/cluster/Charts/__snapshots__/StatusCharts.NodesStatusEmpty.stories.storyshot
  • frontend/src/components/cluster/Charts/__snapshots__/StatusCharts.NodesStatusLoading.stories.storyshot
  • frontend/src/components/cluster/Charts/__snapshots__/StatusCharts.NodesStatusWithMixedStates.stories.storyshot
  • frontend/src/components/cluster/Charts/__snapshots__/StatusCharts.PodsStatusEmpty.stories.storyshot
  • frontend/src/components/cluster/Charts/__snapshots__/StatusCharts.PodsStatusLoading.stories.storyshot
  • frontend/src/components/cluster/Charts/__snapshots__/StatusCharts.PodsStatusWithMixedStates.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/Chooser.ManyClusters.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/Chooser.NoClusters.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/Chooser.Normal.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/Chooser.SingleCluster.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/ClusterChooser.LongClusterName.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/ClusterChooser.MultipleSelectedClustersCount.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/ClusterChooser.MultipleSelectedClustersInline.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/ClusterChooser.NoCluster.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/ClusterChooser.Normal.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/ClusterChooser.SpecialCharacters.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/ClusterChooserPopup.NoClustersButRecent.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/ClusterChooserPopup.NoRecentClusters.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/ClusterChooserPopup.Normal.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/ClusterChooserPopup.Scrollbar.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/ClusterGroupErrorMessage.WithClusterErrors.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/ClusterGroupErrorMessage.WithMutipleErrorsPerCluster.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/KubeConfigLoader.ConfiguringClusters.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/KubeConfigLoader.DuplicateClusterError.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/KubeConfigLoader.FileUpload.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/KubeConfigLoader.InvalidYAMLError.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/KubeConfigLoader.SelectingClusters.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/KubeConfigLoader.SuccessfulImport.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/KubeConfigLoader.TimeoutError.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/KubeConfigLoader.ValidatingClusters.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/Overview.EmptyState.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/Overview.ErrorState.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/Overview.Events.stories.storyshot
  • frontend/src/components/cluster/__snapshots__/Overview.MetricsUnavailableState.stories.storyshot
  • frontend/src/components/common/ActionButton/__snapshots__/ActionButton.Basic.stories.storyshot
  • frontend/src/components/common/ActionButton/__snapshots__/ActionButton.LargeAndColorful.stories.storyshot
  • frontend/src/components/common/ActionButton/__snapshots__/ActionButton.LongDescription.stories.storyshot
  • frontend/src/components/common/BackLink/__snapshots__/BackLink.CustomLink.stories.storyshot
  • frontend/src/components/common/BackLink/__snapshots__/BackLink.Default.stories.storyshot
  • frontend/src/components/common/Chart.stories/__snapshots__/PercentBar.NoData.stories.storyshot
  • frontend/src/components/common/Chart.stories/__snapshots__/PercentBar.Percent100.stories.storyshot
  • frontend/src/components/common/Chart.stories/__snapshots__/PercentBar.Percent50.stories.storyshot
  • frontend/src/components/common/Chart.stories/__snapshots__/PercentBar.Tooltip.stories.storyshot
  • frontend/src/components/common/Chart.stories/__snapshots__/PercentageCircle.NoData.stories.storyshot
  • frontend/src/components/common/Chart.stories/__snapshots__/PercentageCircle.Percent100.stories.storyshot
  • frontend/src/components/common/Chart.stories/__snapshots__/PercentageCircle.Percent50.stories.storyshot
  • frontend/src/components/common/ErrorPage/__snapshots__/ErrorPage.ComponentMessage.stories.storyshot
  • frontend/src/components/common/ErrorPage/__snapshots__/ErrorPage.ComponentTitle.stories.storyshot
  • frontend/src/components/common/ErrorPage/__snapshots__/ErrorPage.Default.stories.storyshot
  • frontend/src/components/common/ErrorPage/__snapshots__/ErrorPage.DifferentImage.stories.storyshot
  • frontend/src/components/common/ErrorPage/__snapshots__/ErrorPage.NumberGraphic.stories.storyshot
  • frontend/src/components/common/ErrorPage/__snapshots__/ErrorPage.StringGraphic.stories.storyshot
  • frontend/src/components/common/ErrorPage/__snapshots__/ErrorPage.StringMessage.stories.storyshot
  • frontend/src/components/common/ErrorPage/__snapshots__/ErrorPage.WithErrorStack.stories.storyshot
  • frontend/src/components/common/NameValueTable/__snapshots__/NameValueTable.Empty.stories.storyshot
  • frontend/src/components/common/NameValueTable/__snapshots__/NameValueTable.WithChildren.stories.storyshot
  • frontend/src/components/common/NameValueTable/__snapshots__/NameValueTable.WithHiddenLastChildren.stories.storyshot
  • frontend/src/components/common/ReleaseNotes/__snapshots__/ReleaseNotes.Default.stories.storyshot
  • frontend/src/components/common/ReleaseNotes/__snapshots__/ReleaseNotesModal.HtmlImage.stories.storyshot
  • frontend/src/components/common/ReleaseNotes/__snapshots__/ReleaseNotesModal.Show.stories.storyshot
  • frontend/src/components/common/ReleaseNotes/__snapshots__/ReleaseNotesModal.Table.stories.storyshot
  • frontend/src/components/common/ReleaseNotes/__snapshots__/UpdatePopup.FetchFailed.stories.storyshot
  • frontend/src/components/common/ReleaseNotes/__snapshots__/UpdatePopup.Fetching.stories.storyshot
  • frontend/src/components/common/ReleaseNotes/__snapshots__/UpdatePopup.Show.stories.storyshot
  • frontend/src/components/common/Resource/CreateResourceForm/__snapshots__/CreateResourceForm.Containers.stories.storyshot
  • frontend/src/components/common/Resource/CreateResourceForm/__snapshots__/CreateResourceForm.EmptyForm.stories.storyshot
  • frontend/src/components/common/Resource/CreateResourceForm/__snapshots__/CreateResourceForm.Labels.stories.storyshot
  • frontend/src/components/common/Resource/CreateResourceForm/__snapshots__/CreateResourceForm.MultipleSections.stories.storyshot
  • frontend/src/components/common/Resource/CreateResourceForm/__snapshots__/CreateResourceForm.NamespaceAutocomplete.stories.storyshot
  • frontend/src/components/common/Resource/CreateResourceForm/__snapshots__/CreateResourceForm.SelectField.stories.storyshot
  • frontend/src/components/common/Resource/CreateResourceForm/__snapshots__/CreateResourceForm.TextFields.stories.storyshot
  • frontend/src/components/common/Resource/MainInfoSection/__snapshots__/MainInfoSection.Normal.stories.storyshot
  • frontend/src/components/common/Resource/MainInfoSection/__snapshots__/MainInfoSection.NullBacklink.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/CopyButton.Default.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/CreateButton.Default.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/CreateButton.NarrowButton.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/DeleteButton.Default.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/DeleteButton.MenuButtonStyle.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/DeleteButton.PodEvict.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/DeleteButton.WithAfterConfirmCallback.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/DocsViewer.ErrorDocumentation.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/DocsViewer.NoDocumentation.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/DocsViewer.NoMatchingDocumentation.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/DocsViewer.TypicalDocumentation.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/DownloadButton.Default.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/DownloadButton.MenuStyle.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/DryRunPreviewDialog.LargeYaml.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/DryRunPreviewDialog.Open.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/EditorDialog.EditorDialogWithResource.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/EditorDialog.ExtraActions.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/EnvVarGrid.ComplexReferences.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/EnvVarGrid.Default.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/EnvVarGrid.EdgeCases.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/EnvVarGrid.ManyVariables.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/LogsButton.Enabled.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/LogsButton.NoLogsAvailable.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/MatchExpressions.Default.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/MatchExpressions.WithExpressions.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/MetadataDisplay.MetadataDisplay.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/MetadataDisplay.WithExtraRows.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/MetadataDisplay.WithManyLabels.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/MetadataDisplay.WithOwnerReferences.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ResourceListView.OneHiddenColumn.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ResourceTable.NameSearch.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ResourceTable.NoFilter.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ResourceTable.WithHiddenCols.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ResourceTableColumnChooser.AllColumnsHidden.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ResourceTableColumnChooser.AllColumnsVisible.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ResourceTableColumnChooser.Closed.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ResourceTableColumnChooser.Default.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ResourceTableColumnChooser.ManyColumns.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ResourceTableMultiActions.Default.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ResourceTableMultiActions.EmptySelection.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ResourceTableMultiActions.WithMixedItems.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ResourceTableMultiActions.WithNonRestartableItems.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ResourceTableMultiActions.WithRestartableItems.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/RestartButton.DeploymentExample.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/RestartButton.StatefulSetExample.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/RestartMultipleButton.AfterConfirmCallback.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/RestartMultipleButton.Default.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/RestartMultipleButton.MenuButtonStyle.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/RollbackButton.DaemonSetExample.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/RollbackButton.DeploymentExample.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/RollbackButton.StatefulSetExample.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ScaleButton.DeploymentExample.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ScaleButton.ReplicaSetExample.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ScaleButton.StatefulSetExample.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ScaleMultipleButton.AfterConfirmCallback.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ScaleMultipleButton.Default.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ScaleMultipleButton.MenuButtonStyle.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ScaleMultipleButton.SingleItem.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/SimpleEditor.Simple.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/UploadDialog.Default.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ViewButton.View.stories.storyshot
  • frontend/src/components/common/Resource/__snapshots__/ViewButton.ViewOpen.stories.storyshot
  • frontend/src/components/common/ShowHideLabel/__snapshots__/ShowHideLabel.Basic.stories.storyshot
  • frontend/src/components/common/ShowHideLabel/__snapshots__/ShowHideLabel.Empty.stories.storyshot
  • frontend/src/components/common/ShowHideLabel/__snapshots__/ShowHideLabel.Expanded.stories.storyshot
  • frontend/src/components/common/ShowHideLabel/__snapshots__/ShowHideLabel.ShortText.stories.storyshot
  • frontend/src/components/common/Table/__snapshots__/Table.Datum.stories.storyshot
  • frontend/src/components/common/Table/__snapshots__/Table.Getter.stories.storyshot
  • frontend/src/components/common/Table/__snapshots__/Table.LabelSearch.stories.storyshot
  • frontend/src/components/common/Table/__snapshots__/Table.NameSearch.stories.storyshot
  • frontend/src/components/common/Table/__snapshots__/Table.NamespaceSearch.stories.storyshot
  • frontend/src/components/common/Table/__snapshots__/Table.NamespaceSelect.stories.storyshot
  • frontend/src/components/common/Table/__snapshots__/Table.NotFoundMessage.stories.storyshot
  • frontend/src/components/common/Table/__snapshots__/Table.NumberSearch.stories.storyshot
  • frontend/src/components/common/Table/__snapshots__/Table.ReflectInURL.stories.storyshot
  • frontend/src/components/common/Table/__snapshots__/Table.ReflectInURLWithPrefix.stories.storyshot
  • frontend/src/components/common/Table/__snapshots__/Table.UIDSearch.stories.storyshot
  • frontend/src/components/common/Table/__snapshots__/Table.WithFilterMultiSelect.stories.storyshot
  • frontend/src/components/common/Table/__snapshots__/Table.WithGlobalFilter.stories.storyshot
  • frontend/src/components/common/Table/__snapshots__/Table.WithSorting.stories.storyshot
  • frontend/src/components/common/TileChart/__snapshots__/TileChart.WithProgress.stories.storyshot
  • frontend/src/components/common/TileChart/__snapshots__/TileChart.WithoutProgress.stories.storyshot
  • frontend/src/components/common/TimezoneSelect/__snapshots__/TimezoneSelect.Default.stories.storyshot
  • frontend/src/components/common/TimezoneSelect/__snapshots__/TimezoneSelect.NoInitialValue.stories.storyshot
  • frontend/src/components/common/Tooltip/__snapshots__/TooltipIcon.JustText.stories.storyshot
  • frontend/src/components/common/Tooltip/__snapshots__/TooltipIcon.WithIcon.stories.storyshot
  • frontend/src/components/common/Tooltip/__snapshots__/TooltipLight.Add.stories.storyshot
  • frontend/src/components/common/Tooltip/__snapshots__/TooltipLight.Interactive.stories.storyshot
  • frontend/src/components/common/Tooltip/__snapshots__/TooltipLight.NotInteractive.stories.storyshot
  • frontend/src/components/common/__snapshots__/ActionsNotifier.Some.stories.storyshot
  • frontend/src/components/common/__snapshots__/AlertNotification.ErrorOnCheck.stories.storyshot
  • frontend/src/components/common/__snapshots__/ConditionList.Default.stories.storyshot
  • frontend/src/components/common/__snapshots__/ConditionList.WithLastUpdate.stories.storyshot
  • frontend/src/components/common/__snapshots__/ConfirmButton.Confirm.stories.storyshot
  • frontend/src/components/common/__snapshots__/ConfirmButton.ExtendsButton.stories.storyshot
  • frontend/src/components/common/__snapshots__/ConfirmDialog.ConfirmDialog.stories.storyshot
  • frontend/src/components/common/__snapshots__/ConfirmDialog.ConfirmDialogCancelHidden.stories.storyshot
  • frontend/src/components/common/__snapshots__/Dialog.Dialog.stories.storyshot
  • frontend/src/components/common/__snapshots__/Dialog.DialogAlreadyInFullScreen.stories.storyshot
  • frontend/src/components/common/__snapshots__/Dialog.DialogWithCloseButton.stories.storyshot
  • frontend/src/components/common/__snapshots__/Dialog.DialogWithFullScreenButton.stories.storyshot
  • frontend/src/components/common/__snapshots__/DropZoneBox.UploadFiles.stories.storyshot
  • frontend/src/components/common/__snapshots__/EmptyContent.Default.stories.storyshot
  • frontend/src/components/common/__snapshots__/EmptyContent.Empty.stories.storyshot
  • frontend/src/components/common/__snapshots__/EmptyContent.WithCustomColor.stories.storyshot
  • frontend/src/components/common/__snapshots__/EmptyContent.WithMultipleChildren.stories.storyshot
  • frontend/src/components/common/__snapshots__/InnerTable.Default.stories.storyshot
  • frontend/src/components/common/__snapshots__/InnerTable.EmptyTable.stories.storyshot
  • frontend/src/components/common/__snapshots__/InnerTable.InsideAnotherComponent.stories.storyshot
  • frontend/src/components/common/__snapshots__/InnerTable.WithFewRows.stories.storyshot
  • frontend/src/components/common/__snapshots__/InnerTable.WithoutTableHeader.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.DateLabelDefault.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.DateLabelMini.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.HeaderLabelDefault.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.HeaderLabelToolTip.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.HoverInfoLabelDefault.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.HoverInfoLabelIconPosition.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.HoverInfoLabelInfo.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.HoverInfoLabelPropsStory.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.HoverInfoLabelWithoutIcon.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.InfoLabelDefault.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.NameLabelDefault.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.StatusLabelError.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.StatusLabelSuccess.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.StatusLabelWarning.stories.storyshot
  • frontend/src/components/common/__snapshots__/Label.ValueLabelDefault.stories.storyshot
  • frontend/src/components/common/__snapshots__/LabelListItem.List.stories.storyshot
  • frontend/src/components/common/__snapshots__/Link.AutoTooltip.stories.storyshot
  • frontend/src/components/common/__snapshots__/Link.Basic.stories.storyshot
  • frontend/src/components/common/__snapshots__/Link.ExplicitTooltip.stories.storyshot
  • frontend/src/components/common/__snapshots__/Link.Params.stories.storyshot
  • frontend/src/components/common/__snapshots__/Loader.CustomColor.stories.storyshot
  • frontend/src/components/common/__snapshots__/Loader.CustomSize.stories.storyshot
  • frontend/src/components/common/__snapshots__/Loader.DefaultWithContainer.stories.storyshot
  • frontend/src/components/common/__snapshots__/Loader.InlineNoContainer.stories.storyshot
  • frontend/src/components/common/__snapshots__/Loader.InsideAComponent.stories.storyshot
  • frontend/src/components/common/__snapshots__/Loader.NoTitleProvided.stories.storyshot
  • frontend/src/components/common/__snapshots__/NamespacesAutocomplete.Some.stories.storyshot
  • frontend/src/components/common/__snapshots__/ObjectEventList.ErrorFetching.stories.storyshot
  • frontend/src/components/common/__snapshots__/ObjectEventList.NoEventsForObject.stories.storyshot
  • frontend/src/components/common/__snapshots__/ObjectEventList.WithEvents.stories.storyshot
  • frontend/src/components/common/__snapshots__/PhaseLabel.Error.stories.storyshot
  • frontend/src/components/common/__snapshots__/PhaseLabel.Success.stories.storyshot
  • frontend/src/components/common/__snapshots__/PhaseLabel.Warning.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionBox.CustomTitle.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionBox.HeaderProps.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionBox.Titled.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionBox.TitledChildren.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionBox.WithChildren.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionFilterHeader.Default.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionFilterHeader.NoNamespaceFilter.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionFilterHeader.WithActions.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionFilterHeader.WithNamespaceFilter.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionHeader.LabelStyle.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionHeader.LongTitle.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionHeader.MainStyle.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionHeader.NoActionsOrSubtitle.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionHeader.NormalStyle.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionHeader.SubSectionStyle.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionHeader.WithActions.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionHeader.WithNoPadding.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionHeader.WithReactNodeAsTitle.stories.storyshot
  • frontend/src/components/common/__snapshots__/SectionHeader.WithTitleSideActions.stories.storyshot
  • frontend/src/components/common/__snapshots__/SimpleTable.Datum.stories.storyshot
  • frontend/src/components/common/__snapshots__/SimpleTable.Getter.stories.storyshot
  • frontend/src/components/common/__snapshots__/SimpleTable.LabelSearch.stories.storyshot
  • frontend/src/components/common/__snapshots__/SimpleTable.NameSearch.stories.storyshot
  • frontend/src/components/common/__snapshots__/SimpleTable.NamespaceSearch.stories.storyshot
  • frontend/src/components/common/__snapshots__/SimpleTable.NamespaceSelect.stories.storyshot
  • frontend/src/components/common/__snapshots__/SimpleTable.NotFoundMessage.stories.storyshot
  • frontend/src/components/common/__snapshots__/SimpleTable.NumberSearch.stories.storyshot
  • frontend/src/components/common/__snapshots__/SimpleTable.ReflectInURL.stories.storyshot
  • frontend/src/components/common/__snapshots__/SimpleTable.ReflectInURLWithPrefix.stories.storyshot
  • frontend/src/components/common/__snapshots__/SimpleTable.UIDSearch.stories.storyshot
  • frontend/src/components/common/__snapshots__/Tabs.BasicTabs.stories.storyshot
  • frontend/src/components/common/__snapshots__/Tabs.StartingTab.stories.storyshot
  • frontend/src/components/common/__snapshots__/Terminal.TerminalAttachEmptyFirstOutput.stories.storyshot
  • frontend/src/components/common/__snapshots__/Terminal.TerminalConnectedAndReady.stories.storyshot
  • frontend/src/components/common/__snapshots__/Terminal.TerminalConnectionFailed.stories.storyshot
  • frontend/src/components/common/__snapshots__/Terminal.TerminalConnectionLoading.stories.storyshot
  • frontend/src/components/common/__snapshots__/Terminal.TerminalDefaultNodeSelector.stories.storyshot
  • frontend/src/components/common/__snapshots__/Terminal.TerminalDisconnected.stories.storyshot
  • frontend/src/components/common/__snapshots__/Terminal.TerminalInitAndEphemeralContainers.stories.storyshot
  • frontend/src/components/common/__snapshots__/Terminal.TerminalNoDialog.stories.storyshot
  • frontend/src/components/common/__snapshots__/Terminal.TerminalShellNotFoundTryNext.stories.storyshot
  • frontend/src/components/common/__snapshots__/Terminal.TerminalWindowsNodeSelector.stories.storyshot
  • frontend/src/components/common/__snapshots__/Terminal.TerminalWindowsShellNotFound.stories.storyshot
  • frontend/src/components/common/__snapshots__/Terminal.TerminalWithCommandOutput.stories.storyshot
  • frontend/src/components/configmap/__snapshots__/Details.Empty.stories.storyshot
  • frontend/src/components/configmap/__snapshots__/Details.WithBinaryData.stories.storyshot
  • frontend/src/components/configmap/__snapshots__/Details.WithBinaryDataAndData.stories.storyshot
  • frontend/src/components/configmap/__snapshots__/Details.WithData.stories.storyshot
  • frontend/src/components/configmap/__snapshots__/List.Items.stories.storyshot
  • frontend/src/components/crd/__snapshots__/CustomResourceDefinition.Details.stories.storyshot
  • frontend/src/components/crd/__snapshots__/CustomResourceDefinition.List.stories.storyshot
  • frontend/src/components/crd/__snapshots__/CustomResourceDetails.ErrorGettingCR.stories.storyshot
  • frontend/src/components/crd/__snapshots__/CustomResourceDetails.ErrorGettingCRD.stories.storyshot
  • frontend/src/components/crd/__snapshots__/CustomResourceDetails.NoError.stories.storyshot
  • frontend/src/components/crd/__snapshots__/CustomResourceList.List.stories.storyshot
  • frontend/src/components/cronjob/__snapshots__/CreateCronJobForm.Default.stories.storyshot
  • frontend/src/components/cronjob/__snapshots__/CreateCronJobForm.Empty.stories.storyshot
  • frontend/src/components/cronjob/__snapshots__/CreateCronJobForm.Filled.stories.storyshot
  • frontend/src/components/cronjob/__snapshots__/CronJobDetails.EveryAst.stories.storyshot
  • frontend/src/components/cronjob/__snapshots__/CronJobDetails.EveryMinute.stories.storyshot
  • frontend/src/components/cronjob/__snapshots__/List.Items.stories.storyshot
  • frontend/src/components/daemonset/__snapshots__/Details.Default.stories.storyshot
  • frontend/src/components/daemonset/__snapshots__/Details.NoTolerations.stories.storyshot
  • frontend/src/components/daemonset/__snapshots__/List.DaemonSets.stories.storyshot
  • frontend/src/components/daemonset/__snapshots__/List.Empty.stories.storyshot
  • frontend/src/components/daemonset/__snapshots__/List.Error.stories.storyshot
  • frontend/src/components/daemonset/__snapshots__/List.LongName.stories.storyshot
  • frontend/src/components/deployments/__snapshots__/CreateDeploymentForm.Default.stories.storyshot
  • frontend/src/components/deployments/__snapshots__/CreateDeploymentForm.Empty.stories.storyshot
  • frontend/src/components/deployments/__snapshots__/CreateDeploymentForm.Filled.stories.storyshot
  • frontend/src/components/deployments/__snapshots__/CreateDeploymentForm.PodTemplateExtras.stories.storyshot
  • frontend/src/components/deployments/__snapshots__/List.Deployments.stories.storyshot
  • frontend/src/components/diagnostics/__snapshots__/Diagnostics.PodHealthy.stories.storyshot
  • frontend/src/components/diagnostics/__snapshots__/Diagnostics.PodWithIssues.stories.storyshot
  • frontend/src/components/diagnostics/__snapshots__/Diagnostics.WorkloadHealthy.stories.storyshot
  • frontend/src/components/diagnostics/__snapshots__/Diagnostics.WorkloadLoading.stories.storyshot
  • frontend/src/components/diagnostics/__snapshots__/Diagnostics.WorkloadPodsError.stories.storyshot
  • frontend/src/components/diagnostics/__snapshots__/Diagnostics.WorkloadWithIssues.stories.storyshot
  • frontend/src/components/endpointSlices/__snapshots__/EndpointSliceDetails.Default.stories.storyshot
  • frontend/src/components/endpointSlices/__snapshots__/EndpointSliceDetails.Error.stories.storyshot
  • frontend/src/components/endpointSlices/__snapshots__/EndpointSliceList.Items.stories.storyshot
  • frontend/src/components/endpoints/__snapshots__/EndpointDetails.Default.stories.storyshot
  • frontend/src/components/endpoints/__snapshots__/EndpointDetails.Error.stories.storyshot
  • frontend/src/components/endpoints/__snapshots__/EndpointList.Items.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/BackendTLSPolicyDetails.Basic.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/BackendTLSPolicyList.Items.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/BackendTrafficPolicyDetails.Basic.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/BackendTrafficPolicyList.Items.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/ClassDetails.Basic.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/ClassList.Items.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/GRPCRouteDetails.Basic.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/GRPCRouteList.Items.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/GatewayDetails.Basic.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/GatewayList.BrokenSpec.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/GatewayList.Items.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/HTTPRouteDetails.Basic.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/HTTPRouteDetails.Empty.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/HTTPRouteList.Items.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/ReferenceGrantDetails.Basic.stories.storyshot
  • frontend/src/components/gateway/__snapshots__/ReferenceGrantList.Items.stories.storyshot
  • frontend/src/components/globalSearch/__snapshots__/GlobalSearch.BasicExample.stories.storyshot
  • frontend/src/components/globalSearch/__snapshots__/GlobalSearchContent.BareNamespaceQuery.stories.storyshot
  • frontend/src/components/globalSearch/__snapshots__/GlobalSearchContent.CombinedNamespaceQuery.stories.storyshot
  • frontend/src/components/globalSearch/__snapshots__/GlobalSearchContent.FoundSomeResults.stories.storyshot
  • frontend/src/components/globalSearch/__snapshots__/GlobalSearchContent.WithEmptyInput.stories.storyshot
  • frontend/src/components/horizontalPodAutoscaler/__snapshots__/HPADetails.Default.stories.storyshot
  • frontend/src/components/horizontalPodAutoscaler/__snapshots__/HPADetails.Error.stories.storyshot
  • frontend/src/components/horizontalPodAutoscaler/__snapshots__/HPAList.Items.stories.storyshot
  • frontend/src/components/ingress/__snapshots__/ClassDetails.Basic.stories.storyshot
  • frontend/src/components/ingress/__snapshots__/ClassDetails.WithDefault.stories.storyshot
  • frontend/src/components/ingress/__snapshots__/ClassList.Items.stories.storyshot
  • frontend/src/components/ingress/__snapshots__/Details.WithResource.stories.storyshot
  • frontend/src/components/ingress/__snapshots__/Details.WithTLS.stories.storyshot
  • frontend/src/components/ingress/__snapshots__/Details.WithWildcardTLS.stories.storyshot
  • frontend/src/components/ingress/__snapshots__/LinkStringFormat.Empty.stories.storyshot
  • frontend/src/components/ingress/__snapshots__/LinkStringFormat.morePath.stories.storyshot
  • frontend/src/components/ingress/__snapshots__/LinkStringFormat.soloPath.stories.storyshot
  • frontend/src/components/ingress/__snapshots__/List.Items.stories.storyshot
  • frontend/src/components/job/__snapshots__/CreateJobForm.Default.stories.storyshot
  • frontend/src/components/job/__snapshots__/CreateJobForm.Empty.stories.storyshot
  • frontend/src/components/job/__snapshots__/CreateJobForm.Filled.stories.storyshot
  • frontend/src/components/job/__snapshots__/CreateJobForm.PodTemplateExtras.stories.storyshot
  • frontend/src/components/job/__snapshots__/Details.Default.stories.storyshot
  • frontend/src/components/job/__snapshots__/Details.Running.stories.storyshot
  • frontend/src/components/job/__snapshots__/JobList.Items.stories.storyshot
  • frontend/src/components/jobset/__snapshots__/JobSetList.Items.stories.storyshot
  • frontend/src/components/lease/__snapshots__/Details.LeaseDetail.stories.storyshot
  • frontend/src/components/lease/__snapshots__/List.Items.stories.storyshot
  • frontend/src/components/limitRange/__snapshots__/Details.LimitRangeDetail.stories.storyshot
  • frontend/src/components/limitRange/__snapshots__/List.Items.stories.storyshot
  • frontend/src/components/namespace/__snapshots__/NamespaceDetails.Active.stories.storyshot
  • frontend/src/components/namespace/__snapshots__/NamespaceList.Regular.stories.storyshot
  • frontend/src/components/networkpolicy/__snapshots__/Details.Default.stories.storyshot
  • frontend/src/components/networkpolicy/__snapshots__/List.Items.stories.storyshot
  • frontend/src/components/node/__snapshots__/Charts.CpuUsage.stories.storyshot
  • frontend/src/components/node/__snapshots__/Charts.MemoryUsage.stories.storyshot
  • frontend/src/components/node/__snapshots__/Charts.NoMetrics.stories.storyshot
  • frontend/src/components/node/__snapshots__/Details.Default.stories.storyshot
  • frontend/src/components/node/__snapshots__/Details.NoMetrics.stories.storyshot
  • frontend/src/components/node/__snapshots__/List.NoNodePools.stories.storyshot
  • frontend/src/components/node/__snapshots__/List.Nodes.stories.storyshot
  • frontend/src/components/node/__snapshots__/UpgradeVisualizationPanel.AllIdle.stories.storyshot
  • frontend/src/components/node/__snapshots__/UpgradeVisualizationPanel.Upgrading.stories.storyshot
  • frontend/src/components/oidcauth/__snapshots__/OauthPopup.Default.stories.storyshot
  • frontend/src/components/oidcauth/__snapshots__/OauthPopup.WithDimensions.stories.storyshot
  • frontend/src/components/pod/__snapshots__/CreatePodForm.Empty.stories.storyshot
  • frontend/src/components/pod/__snapshots__/CreatePodForm.MultipleContainers.stories.storyshot
  • frontend/src/components/pod/__snapshots__/CreatePodForm.Prefilled.stories.storyshot
  • frontend/src/components/pod/__snapshots__/CreatePodForm.WithNodeName.stories.storyshot
  • frontend/src/components/pod/__snapshots__/PodDebugTerminal.Default.stories.storyshot
  • frontend/src/components/pod/__snapshots__/PodDetails.DebugDisabled.stories.storyshot
  • frontend/src/components/pod/__snapshots__/PodDetails.Error.stories.storyshot
  • frontend/src/components/pod/__snapshots__/PodDetails.Initializing.stories.storyshot
  • frontend/src/components/pod/__snapshots__/PodDetails.LivenessFailed.stories.storyshot
  • frontend/src/components/pod/__snapshots__/PodDetails.PullBackOff.stories.storyshot
  • frontend/src/components/pod/__snapshots__/PodDetails.Running.stories.storyshot
  • frontend/src/components/pod/__snapshots__/PodDetails.Successful.stories.storyshot
  • frontend/src/components/pod/__snapshots__/PodList.Items.stories.storyshot
  • frontend/src/components/pod/__snapshots__/PodLogs.BigJsonLogs.stories.storyshot
  • frontend/src/components/pod/__snapshots__/PodLogs.FormattedJsonLogs.stories.storyshot
  • frontend/src/components/pod/__snapshots__/PodLogs.FormattingLogs.stories.storyshot
  • frontend/src/components/pod/__snapshots__/PodLogs.JsonLogs.stories.storyshot
  • frontend/src/components/pod/__snapshots__/PodLogs.PlainLogs.stories.storyshot
  • frontend/src/components/pod/__snapshots__/podDetailsVolumeSection.Empty.stories.storyshot
  • frontend/src/components/pod/__snapshots__/podDetailsVolumeSection.Short.stories.storyshot
  • frontend/src/components/pod/__snapshots__/podDetailsVolumeSection.Successful.stories.storyshot
  • frontend/src/components/podDisruptionBudget/__snapshots__/pdbDetails.Default.stories.storyshot
  • frontend/src/components/podDisruptionBudget/__snapshots__/pdbDetails.Error.stories.storyshot
  • frontend/src/components/podDisruptionBudget/__snapshots__/pdbList.Items.stories.storyshot
  • frontend/src/components/priorityClass/__snapshots__/priorityClassDetails.Default.stories.storyshot
  • frontend/src/components/priorityClass/__snapshots__/priorityClassDetails.Error.stories.storyshot
  • frontend/src/components/priorityClass/__snapshots__/priorityClassList.Items.stories.storyshot
  • frontend/src/components/project/__snapshots__/NewProjectPopup.Default.stories.storyshot
  • frontend/src/components/project/__snapshots__/NewProjectPopup.WithExistingProjects.stories.storyshot
  • frontend/src/components/project/__snapshots__/ProjectCreateFromYaml.Default.stories.storyshot
  • frontend/src/components/project/__snapshots__/ProjectCreateFromYaml.WithExistingProjects.stories.storyshot
  • frontend/src/components/project/__snapshots__/ProjectDetails.EmptyProject.stories.storyshot
  • frontend/src/components/project/__snapshots__/ProjectList.Empty.stories.storyshot
  • frontend/src/components/project/__snapshots__/ProjectResourcesTab.Empty.stories.storyshot
  • frontend/src/components/project/__snapshots__/ProjectResourcesTab.WithWorkloads.stories.storyshot
  • frontend/src/components/replicaset/__snapshots__/CreateReplicaSetForm.Default.stories.storyshot
  • frontend/src/components/replicaset/__snapshots__/CreateReplicaSetForm.Empty.stories.storyshot
  • frontend/src/components/replicaset/__snapshots__/CreateReplicaSetForm.Filled.stories.storyshot
  • frontend/src/components/replicaset/__snapshots__/CreateReplicaSetForm.PodTemplateExtras.stories.storyshot
  • frontend/src/components/replicaset/__snapshots__/List.ReplicaSets.stories.storyshot
  • frontend/src/components/resourceMap/GraphView.tsx
  • frontend/src/components/resourceMap/__snapshots__/GraphView.BasicExample.stories.storyshot
  • frontend/src/components/resourceMap/__snapshots__/GraphView.PerformanceTest100000Pods.stories.storyshot
  • frontend/src/components/resourceMap/__snapshots__/GraphView.PerformanceTest20000Pods.stories.storyshot
  • frontend/src/components/resourceMap/__snapshots__/GraphView.PerformanceTest2000Pods.stories.storyshot
  • frontend/src/components/resourceMap/__snapshots__/GraphView.PerformanceTest5000Pods.stories.storyshot
  • frontend/src/components/resourceMap/__snapshots__/GraphView.PerformanceTest500Pods.stories.storyshot
  • frontend/src/components/resourceMap/graph/graphFiltering.test.ts
  • frontend/src/components/resourceMap/graph/graphFiltering.ts
  • frontend/src/components/resourceQuota/__snapshots__/resourceQuotaDetails.Default.stories.storyshot
  • frontend/src/components/resourceQuota/__snapshots__/resourceQuotaDetails.Error.stories.storyshot
  • frontend/src/components/resourceQuota/__snapshots__/resourceQuotaList.Items.stories.storyshot
  • frontend/src/components/role/__snapshots__/BindingDetails.ClusterRoleBinding.stories.storyshot
  • frontend/src/components/role/__snapshots__/BindingDetails.RoleBinding.stories.storyshot
  • frontend/src/components/role/__snapshots__/BindingList.Empty.stories.storyshot
  • frontend/src/components/role/__snapshots__/BindingList.Error.stories.storyshot
  • frontend/src/components/role/__snapshots__/BindingList.RoleBindings.stories.storyshot
  • frontend/src/components/role/__snapshots__/Details.ClusterRole.stories.storyshot
  • frontend/src/components/role/__snapshots__/Details.Role.stories.storyshot
  • frontend/src/components/role/__snapshots__/List.Empty.stories.storyshot
  • frontend/src/components/role/__snapshots__/List.Error.stories.storyshot
  • frontend/src/components/role/__snapshots__/List.Roles.stories.storyshot
  • frontend/src/components/runtimeClass/__snapshots__/Details.Base.stories.storyshot
  • frontend/src/components/runtimeClass/__snapshots__/List.Items.stories.storyshot
  • frontend/src/components/secret/__snapshots__/Details.Empty.stories.storyshot
  • frontend/src/components/secret/__snapshots__/Details.WithBase.stories.storyshot
  • frontend/src/components/secret/__snapshots__/List.Items.stories.storyshot
  • frontend/src/components/service/__snapshots__/ServiceDetails.Default.stories.storyshot
  • frontend/src/components/service/__snapshots__/ServiceDetails.ErrorWithEndpoints.stories.storyshot
  • frontend/src/components/service/__snapshots__/ServiceDetails.ExternalName.stories.storyshot
  • frontend/src/components/service/__snapshots__/ServiceDetails.LoadBalancer.stories.storyshot
  • frontend/src/components/service/__snapshots__/ServiceDetails.NodePort.stories.storyshot
  • frontend/src/components/service/__snapshots__/ServiceDetails.WithA8RAnnotations.stories.storyshot
  • frontend/src/components/service/__snapshots__/ServiceDetails.WithA8ROwnerOnly.stories.storyshot
  • frontend/src/components/service/__snapshots__/ServiceList.Items.stories.storyshot
  • frontend/src/components/service/__snapshots__/ServiceList.WithOwnerAnnotation.stories.storyshot
  • frontend/src/components/serviceaccount/__snapshots__/Details.Empty.stories.storyshot
  • frontend/src/components/serviceaccount/__snapshots__/Details.ListError.stories.storyshot
  • frontend/src/components/serviceaccount/__snapshots__/Details.WithBase.stories.storyshot
  • frontend/src/components/serviceaccount/__snapshots__/Details.WithBindings.stories.storyshot
  • frontend/src/components/serviceaccount/__snapshots__/List.Empty.stories.storyshot
  • frontend/src/components/serviceaccount/__snapshots__/List.Items.stories.storyshot
  • frontend/src/components/statefulset/__snapshots__/Details.Default.stories.storyshot
  • frontend/src/components/statefulset/__snapshots__/Details.WithComplexSelector.stories.storyshot
  • frontend/src/components/statefulset/__snapshots__/Details.WithMultipleContainers.stories.storyshot
  • frontend/src/components/statefulset/__snapshots__/Details.WithOnDeleteStrategy.stories.storyshot
  • frontend/src/components/statefulset/__snapshots__/List.Default.stories.storyshot
  • frontend/src/components/statefulset/__snapshots__/List.EmptyList.stories.storyshot
  • frontend/src/components/statefulset/__snapshots__/List.SingleItem.stories.storyshot
  • frontend/src/components/statefulset/__snapshots__/List.WithNotReadyReplicas.stories.storyshot
  • frontend/src/components/storage/__snapshots__/ClaimDetails.Base.stories.storyshot
  • frontend/src/components/storage/__snapshots__/ClaimList.Items.stories.storyshot
  • frontend/src/components/storage/__snapshots__/ClassDetails.Base.stories.storyshot
  • frontend/src/components/storage/__snapshots__/ClassList.Items.stories.storyshot
  • frontend/src/components/storage/__snapshots__/VolumeAttributesClassDetails.Base.stories.storyshot
  • frontend/src/components/storage/__snapshots__/VolumeAttributesClassList.Items.stories.storyshot
  • frontend/src/components/storage/__snapshots__/VolumeDetails.Base.stories.storyshot
  • frontend/src/components/storage/__snapshots__/VolumeList.Items.stories.storyshot
  • frontend/src/components/verticalPodAutoscaler/__snapshots__/VPADetails.Default.stories.storyshot
  • frontend/src/components/verticalPodAutoscaler/__snapshots__/VPADetails.Error.stories.storyshot
  • frontend/src/components/verticalPodAutoscaler/__snapshots__/VPAList.List.stories.storyshot
  • frontend/src/components/webhookconfiguration/__snapshots__/MutatingWebhookConfigDetails.WithService.stories.storyshot
  • frontend/src/components/webhookconfiguration/__snapshots__/MutatingWebhookConfigDetails.WithURL.stories.storyshot
  • frontend/src/components/webhookconfiguration/__snapshots__/MutatingWebhookConfigList.Items.stories.storyshot
  • frontend/src/components/webhookconfiguration/__snapshots__/ValidatingWebhookConfigDetails.WithService.stories.storyshot
  • frontend/src/components/webhookconfiguration/__snapshots__/ValidatingWebhookConfigDetails.WithURL.stories.storyshot
  • frontend/src/components/webhookconfiguration/__snapshots__/ValidatingWebhookConfigList.Items.stories.storyshot
  • frontend/src/components/workload/__snapshots__/Charts.AllFailedDeployment.stories.storyshot
  • frontend/src/components/workload/__snapshots__/Charts.AllFailedStatefulSet.stories.storyshot
  • frontend/src/components/workload/__snapshots__/Charts.AllRunningDeployment.stories.storyshot
  • frontend/src/components/workload/__snapshots__/Charts.AllRunningStatefulSet.stories.storyshot
  • frontend/src/components/workload/__snapshots__/Charts.DefaultDeployment.stories.storyshot
  • frontend/src/components/workload/__snapshots__/Charts.DefaultStatefulSet.stories.storyshot
  • frontend/src/components/workload/__snapshots__/Charts.Empty.stories.storyshot
  • frontend/src/components/workload/__snapshots__/Charts.LoadingWorkload.stories.storyshot
  • frontend/src/components/workload/__snapshots__/Charts.MixedWorkloads.stories.storyshot
  • frontend/src/components/workload/__snapshots__/Overview.Workloads.stories.storyshot
  • frontend/src/components/workload/__snapshots__/extraInfo.Completed.stories.storyshot
  • frontend/src/components/workload/__snapshots__/extraInfo.Running.stories.storyshot
  • frontend/src/i18n/LocaleSelect/__snapshots__/LocaleSelect.Initial.stories.storyshot
  • frontend/src/i18n/locales/ar/translation.json
  • frontend/src/i18n/locales/bn/translation.json
  • frontend/src/i18n/locales/de/translation.json
  • frontend/src/i18n/locales/en/translation.json
  • frontend/src/i18n/locales/es/translation.json
  • frontend/src/i18n/locales/fr/translation.json
  • frontend/src/i18n/locales/he/translation.json
  • frontend/src/i18n/locales/hi/translation.json
  • frontend/src/i18n/locales/it/translation.json
  • frontend/src/i18n/locales/ja/translation.json
  • frontend/src/i18n/locales/ko/translation.json
  • frontend/src/i18n/locales/pt/translation.json
  • frontend/src/i18n/locales/ru/translation.json
  • frontend/src/i18n/locales/ta/translation.json
  • frontend/src/i18n/locales/ur/translation.json
  • frontend/src/i18n/locales/zh-tw/translation.json
  • frontend/src/i18n/locales/zh/translation.json
  • frontend/src/lib/k8s/api/v1/streamingApi.ts
  • frontend/src/lib/themes.ts
  • frontend/src/plugin/__snapshots__/pluginLib.snapshot
  • frontend/src/plugin/lib.ts
  • frontend/src/plugin/registry.tsx
  • frontend/src/plugin/registryBreakpoints.test.tsx
  • frontend/src/redux/shortcutsSlice.test.ts
  • frontend/src/redux/shortcutsSlice.ts
  • frontend/src/setupTests.ts
  • frontend/src/storybook.test.tsx
  • plugins/headlamp-plugin/dependencies-sync.js
  • plugins/headlamp-plugin/src/index.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

@illume
illume requested a lite review from Copilot August 6, 2026 07:37

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of files (300). Try reducing the number of changed files and requesting a review from Copilot again.

@illume illume left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution.

it looks like there's a merge-main commit in this PR — could you rebase onto main instead?

Why this matters

Merge commits from main make the PR history harder to review. Please rebase your branch on top of the latest main instead, then update the PR with the rebased commits.

Could you take a look at the commit messages in this PR? We follow a Linux kernel style for git commits — see the contributing guide and git log for examples.

Commits that need attention
  • Address review feedback on plugin keyboard shortcuts types — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • refactor(frontend): standardize theme breakpoints and expose hook to plugins — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • test(frontend): normalize storybook css hashes and update snapshots — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • feat(frontend): add label selector and resource type filtering in resource map — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • test(frontend): update storybook snapshots for GraphView filtering UI controls — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • fix(frontend): add optional chaining for metadata resourceVersion in streamingApi — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • i18n(frontend): update translation catalogs for resource map filtering controls — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • fix(frontend): resolve syntax error in plugin registry — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • chore(frontend): normalize emotion snapshots — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • ci: exclude plugin-only dependency '@emotion/jest' from being copied to frontend — Description must start with a capital letter — e.g. frontend: HomeButton: Fix the button not frontend: HomeButton: fix the button.
Commit guidelines
  • Use atomic commits focused on a single change.
  • Use the title format <area>: <Description of changes> — description must start with a capital letter.
  • Keep the title under 72 characters (soft requirement).
  • Explain the intention and why the change is needed.
  • Make commit titles meaningful and describe what changed.
  • Do not add code that a later commit rewrites; squash or reorder commits instead.
  • Do not include Fixes #NN in commit messages.

Good examples:

  • frontend: HomeButton: Fix so it navigates to home
  • backend: config: Add enable-dynamic-clusters flag

The GitHub CI test job has snapshot failures. Run cd frontend && npm run test -- -u to regenerate the snapshots.

How to update snapshots

Run cd frontend && npm run test -- -u to regenerate all snapshots. Review the diff to make sure the visual changes are intentional, then commit the updated snapshot files.

@illume
illume requested a lite review from Copilot August 7, 2026 08:55
@Rucha0901
Rucha0901 force-pushed the feature/resource-map-label-kind-filtering branch from 2129d11 to a782509 Compare August 8, 2026 21:37
@Rucha0901

Copy link
Copy Markdown
Contributor Author

Hi @illume ,
Sorry for the massive PR originally. I had accidentally squashed several unrelated features together, which caused 500+ unrelated Storybook snapshots to regenerate.
I just rebased and force-pushed. This PR is now clean and strictly contains only the Resource Map Label & Kind Filtering code.
I moved the other features (Plugin Keyboard Shortcuts, Offline Asset Bundling, Theme Breakpoints, and some minor bug fixes) into separate branches. Should I open separate PRs for those?

@illume
illume requested a balanced review from Copilot August 9, 2026 07:07

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 46 changed files in this pull request and generated no new comments.

Suppressed comments (5)

frontend/src/components/resourceMap/graph/graphFiltering.ts:63

  • Use an own-property check here. in also matches inherited names such as the valid label key toString, so an existence selector for that key accepts every normally deserialized labels object even when the label is absent.
          return key in nodeLabels;

frontend/src/components/resourceMap/graph/graphFiltering.ts:62

  • An empty string cannot represent both a bare-key existence selector and an equality selector with an empty value. Kubernetes permits empty label values, but input env= is parsed as '' and this branch then matches every object that merely has env, including env=prod. Preserve whether = was present so empty-value equality remains exact.
        if (!value) {

frontend/src/components/resourceMap/GraphView.tsx:577

  • Every keystroke changes the filter signature, forcing full graph filtering, regrouping, and a new asynchronous layout. On the supported 100,000-node graphs, typing one selector launches several expensive passes and can make the input unresponsive. Debounce applying the parsed selector or commit it on Enter/apply rather than filtering on each character.
                  onChange={e => setLabelInput(e.target.value)}

frontend/src/components/resourceMap/GraphView.tsx:216

  • The new text-to-selector parser and controls have no behavioral tests; the added tests construct GraphFilter objects directly, so parsing comma/space-separated input and wiring selected kinds into filtering can regress while they still pass. Add GraphView interaction tests that enter selectors/select kinds and assert the resulting visible nodes, including invalid and empty-value input.
  // Parsed label selector entries from search input
  const parsedLabels = useMemo(() => {

frontend/src/plugin/registry.tsx:1251

  • This blank-line edit is unrelated to Resource Map filtering. The PR also contains no-op DryRun snapshot rewrites and glossary-only Service Name reordering; please revert this unrelated churn so the change remains focused and generated snapshots only record this feature's UI changes.

@Rucha0901
Rucha0901 force-pushed the feature/resource-map-label-kind-filtering branch from a806d96 to a782509 Compare August 9, 2026 09:52
@illume
illume requested a balanced review from Copilot August 9, 2026 12:44

@illume illume left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for these changes.

Can you please have a look at the git commits to see if they meet the contribution guidelines? We use a Linux kernel style of git commits. See the contributing guide for general context, and please see previous git commits with git log for examples.

Commits that need attention
  • fix(resourceMap): resolve label filtering issues and add interaction tests — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
Commit guidelines
  • Use atomic commits focused on a single change.
  • Use the title format <area>: <Description of changes> — description must start with a capital letter.
  • Keep the title under 72 characters (soft requirement).
  • Explain the intention and why the change is needed.
  • Make commit titles meaningful and describe what changed.
  • Do not add code that a later commit rewrites; squash or reorder commits instead.
  • Do not include Fixes #NN in commit messages.

Good examples:

  • frontend: HomeButton: Fix so it navigates to home
  • backend: config: Add enable-dynamic-clusters flag

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 45 out of 47 changed files in this pull request and generated 1 comment.

Suppressed comments (3)

frontend/src/components/resourceMap/GraphView.tsx:574

  • The new interaction test exercises only the label field; it never selects an option from this multi-select. Add a GraphView interaction test that selects a kind and verifies filterGraph receives a resourceType filter with the selected Set, so this UI wiring is covered.
                  onChange={(_, newValue) => setSelectedKinds(newValue)}

frontend/src/plugin/registry.tsx:1251

  • This blank-line edit is unrelated to Resource Map filtering. The PR also contains no-op DryRun snapshot rewrites and Service Name glossary reordering; revert this unrelated generated churn so the diff remains focused on the feature and its GraphView snapshots.
    frontend/src/components/resourceMap/GraphView.test.tsx:98
  • The final fix(resourceMap): ... commit adds this test while also correcting label semantics introduced by the first feature commit, leaving one logical change split across a corrective pass. Please squash/reorder these changes into the feature commit and rename the commit to the repository's <area>: <description> format (for example, frontend: resourceMap: Add resource and label filtering).
  it('filters nodes based on label input', async () => {

Comment thread frontend/src/components/resourceMap/graph/graphFiltering.test.ts Outdated

@illume illume left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for these changes.

Can you please address the open review comments? Once you've resolved each one, please mark it as resolved.

@Rucha0901
Rucha0901 requested a review from illume August 9, 2026 19:21
@illume
illume requested a balanced review from Copilot August 9, 2026 22:52

@illume illume left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution.

Could you take a look at the commit messages in this PR? We follow a Linux kernel style for git commits — see the contributing guide and git log for examples.

Commits that need attention
  • fix(resourceMap): resolve label filtering issues and add interaction tests — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • test(graphFiltering): use null instead of empty string for label existence check — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
Commit guidelines
  • Use atomic commits focused on a single change.
  • Use the title format <area>: <Description of changes> — description must start with a capital letter.
  • Keep the title under 72 characters (soft requirement).
  • Explain the intention and why the change is needed.
  • Make commit titles meaningful and describe what changed.
  • Do not add code that a later commit rewrites; squash or reorder commits instead.
  • Do not include Fixes #NN in commit messages.

Good examples:

  • frontend: HomeButton: Fix so it navigates to home
  • backend: config: Add enable-dynamic-clusters flag

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 45 out of 47 changed files in this pull request and generated no new comments.

Suppressed comments (7)

frontend/src/i18n/locales/zh/translation.json:1

  • Adding empty-string translations for new UI keys can cause those labels/placeholders to render blank (and potentially block fallback behavior depending on i18n configuration). Prefer omitting untranslated keys so fallback can apply, or temporarily set them to the English value until proper translations are provided.
    frontend/src/plugin/registry.tsx:1
  • The added blank line directly after /** is unusual for JSDoc/TSDoc formatting and adds noise without adding documentation value. Consider removing the extra empty line to keep comment style consistent.
    frontend/src/components/resourceMap/graph/graphFiltering.test.ts:1587
  • These tests construct Service/Deployment nodes using the Pod class with an overridden kind. This is brittle because a future change to the Pod constructor (or type definitions) could normalize/override kind back to Pod, silently breaking the intent of the test. Prefer using a minimal kubeObject shape ({ kind, metadata }) or the correct resource classes for Service/Deployment.
  describe('resourceType filter', () => {
    const podNode: GraphNode = {
      id: 'pod1',
      kubeObject: new Pod({
        kind: 'Pod',
        metadata: { namespace: 'ns1', name: 'pod1' },
      } as any),
    };
    const svcNode: GraphNode = {
      id: 'svc1',
      kubeObject: new Pod({
        kind: 'Service',
        metadata: { namespace: 'ns1', name: 'svc1' },
      } as any),
    };

frontend/src/components/resourceMap/GraphView.tsx:221

  • When nodes change, availableKinds can drop previously-selected kinds, but selectedKinds is not reconciled. This can leave stale selections that still apply filtering (potentially hiding all nodes) while no longer being present in the dropdown options. Consider pruning selectedKinds in an effect when availableKinds changes (e.g., keep only selections still present in availableKinds).
  // Available resource kinds from current graph nodes
  const availableKinds = useMemo(() => {
    const kinds = new Set<string>();
    nodes.forEach(node => {
      if (node.kubeObject?.kind) {
        kinds.add(node.kubeObject.kind);
      }
    });
    return Array.from(kinds).sort();
  }, [nodes]);

frontend/src/components/resourceMap/graph/graphFiltering.ts:67

  • This path allocates new arrays for Object.keys(...) and Object.entries(...) for every node evaluation. On large graphs (which this component explicitly targets), that can add measurable overhead. Consider computing the entries once per filter evaluation (e.g., cache Object.entries(filter.labels) or store a precomputed entries array alongside the filter when building filters).
    if (filter.type === 'labelSelector' && Object.keys(filter.labels).length > 0) {
      const nodeLabels = node.kubeObject?.metadata?.labels;
      if (!nodeLabels) return false;
      return Object.entries(filter.labels).every(([key, value]) => {
        if (value === null) {
          return Object.prototype.hasOwnProperty.call(nodeLabels, key);
        }
        return nodeLabels[key] === value;
      });
    }

frontend/src/components/resourceMap/GraphView.test.tsx:127

  • This test mixes fake timers with waitFor, which internally relies on timers for polling; that can lead to flaky/hanging tests depending on the test runner configuration. Prefer asserting synchronously after flushing the debounce (or explicitly advancing timers for waitFor’s polling), and ensure vi.useRealTimers() runs in a finally/afterEach so timers are always restored even if an assertion fails.
    vi.useFakeTimers();
    render(
      <TestContext>
        <GraphView />
      </TestContext>
    );

    const input = await screen.findByPlaceholderText(/Labels/);

    // Type an empty value equality selector
    fireEvent.change(input, { target: { value: 'env=' } });

    act(() => {
      vi.advanceTimersByTime(600);
    });

    await waitFor(() => {
      expect(mocks.filterGraphSpy).toHaveBeenCalledWith(
        expect.any(Array),
        expect.any(Array),
        expect.arrayContaining([
          expect.objectContaining({
            type: 'labelSelector',
            labels: { env: '' },
          }),
        ])
      );
    });

frontend/src/components/resourceMap/GraphView.test.tsx:148

  • This test mixes fake timers with waitFor, which internally relies on timers for polling; that can lead to flaky/hanging tests depending on the test runner configuration. Prefer asserting synchronously after flushing the debounce (or explicitly advancing timers for waitFor’s polling), and ensure vi.useRealTimers() runs in a finally/afterEach so timers are always restored even if an assertion fails.
    vi.useRealTimers();

@Rucha0901
Rucha0901 requested a review from illume August 10, 2026 07:50
@kubernetes-prow kubernetes-prow Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Aug 12, 2026
@kubernetes-prow kubernetes-prow Bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Aug 15, 2026
@illume
illume requested a balanced review from Copilot August 16, 2026 06:34

@illume illume left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this PR.

the PR has a merge-main commit; please rebase against main to keep the history clean.

Why this matters

Merge commits from main make the PR history harder to review. Please rebase your branch on top of the latest main instead, then update the PR with the rebased commits.

A few of the commits don't quite follow the project guidelines. We use Linux kernel style for git commits — have a look at the contributing guide and previous commits with git log.

Commits that need attention
  • fix(resourceMap): resolve label filtering issues and add interaction tests — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • test(graphFiltering): use null instead of empty string for label existence check — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
  • chore: fix missing i18n strings in pt-br translation — Missing area: description prefix — e.g. frontend: HomeButton: Fix so it navigates to home or backend: config: Add enable-dynamic-clusters flag.
Commit guidelines
  • Use atomic commits focused on a single change.
  • Use the title format <area>: <Description of changes> — description must start with a capital letter.
  • Keep the title under 72 characters (soft requirement).
  • Explain the intention and why the change is needed.
  • Make commit titles meaningful and describe what changed.
  • Do not add code that a later commit rewrites; squash or reorder commits instead.
  • Do not include Fixes #NN in commit messages.

Good examples:

  • frontend: HomeButton: Fix so it navigates to home
  • backend: config: Add enable-dynamic-clusters flag

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 29 out of 31 changed files in this pull request and generated no new comments.

Suppressed comments (6)

frontend/src/components/resourceMap/GraphView.tsx:226

  • Duplicate keys are silently overwritten here. For example, env=prod,env=dev becomes only { env: 'dev' } and matches dev nodes, even though label requirements are combined with AND and this selector should match nothing (or be rejected as invalid). Please reject duplicate keys with validation feedback or preserve requirements as an array so none are discarded.
        const k = part.substring(0, eqIdx).trim();
        const v = part.substring(eqIdx + 1).trim();
        if (k) {
          labels[k] = v;

frontend/src/components/resourceMap/GraphView.tsx:268

  • This filter still does not meet issue #6820's example of hiding Pods when only Service/Deployment are selected. filterGraph expands each direct match through every incoming and outgoing edge (graphFiltering.ts:112-155), so connected non-selected kinds—and potentially the whole connected component—remain visible. The PR test plan says to retain related nodes, which conflicts with the linked issue; please resolve that contract and either make resource-type filtering strict or explicitly revise the acceptance criteria.
    if (selectedKinds.length > 0) {
      filters.push({ type: 'resourceType', kinds: new Set(selectedKinds) });

frontend/src/components/resourceMap/GraphView.tsx:573

  • The new resource-type control has no interaction coverage: GraphView.test.tsx exercises only the label field, while the lower-level predicate tests cannot catch broken Autocomplete wiring. Add a test that selects one or more kinds and verifies filterGraph receives the expected resourceType filter and Set.
                  onChange={(_, newValue) => setSelectedKinds(newValue)}

frontend/src/components/resourceMap/GraphView.test.tsx:98

  • The PR range still contains merge commit 805ef45c and later corrective commits (86549621, cde5c9a9) that rewrite the feature's label semantics/tests. Repository policy requires a linear, coherent history: rebase onto the base branch, squash/reorder those corrections into the feature commit, and rename the remaining fix(...), test(...), and chore: titles to the documented <area>: <description> format.
  it('filters nodes based on label input', async () => {

frontend/src/plugin/registry.tsx:1298

  • This added blank JSDoc line is unrelated to Resource Map filtering and leaves an empty line immediately after /**. Revert it to keep this feature diff focused.
    frontend/src/components/resourceMap/GraphView.tsx:568
  • This is a visible toolbar change, but the PR marks screenshots as N/A. Repository frontend guidance requires screenshots for UI changes; please add a Resource Map screenshot showing both controls (and ideally an active filter state) so reviewers can verify layout and visual impact.
                <Autocomplete

@kubernetes-prow

Copy link
Copy Markdown
Contributor

PR needs rebase.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@kubernetes-prow kubernetes-prow Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Aug 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. documentation Improvements or additions to documentation frontend Issues related to the frontend gatewayAPI Related to gateway API functionality. headlamp-plugin Related to the headlamp-plugin NPM package. kind/feature Categorizes issue or PR as related to a new feature. needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. plugins quality Related to improving the quality of the app resourceMap search To do with searching. size/XXL Denotes a PR that changes 1000+ lines, ignoring generated files. testing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add Support for Label Selectors and Resource Types in Resource Map Filtering

5 participants