From b8c78cd18f00e51cee4267b554639c709d6caa32 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 17 Feb 2021 13:39:27 +0200 Subject: [PATCH] fix: keep last selected row during navigation in the details panel (#2165) Signed-off-by: Roman --- .../kube-object/kube-object-details.tsx | 30 ++++++++++++------- src/renderer/navigation/page-param.ts | 2 +- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/renderer/components/kube-object/kube-object-details.tsx b/src/renderer/components/kube-object/kube-object-details.tsx index 40a247c2d8..b07b0753fb 100644 --- a/src/renderer/components/kube-object/kube-object-details.tsx +++ b/src/renderer/components/kube-object/kube-object-details.tsx @@ -13,11 +13,21 @@ import { CrdResourceDetails } from "../+custom-resources"; import { KubeObjectMenu } from "./kube-object-menu"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; +/** + * Used to store `object.selfLink` to show more info about resource in the details panel. + */ export const kubeDetailsUrlParam = createPageParam({ name: "kube-details", isSystem: true, }); +/** + * Used to highlight last active/selected table row with the resource. + * + * @example + * If we go to "Nodes (page) -> Node (details) -> Pod (details)", + * last clicked Node should be "active" while Pod details are shown). + */ export const kubeSelectedUrlParam = createPageParam({ name: "kube-selected", isSystem: true, @@ -26,8 +36,8 @@ export const kubeSelectedUrlParam = createPageParam({ } }); -export function showDetails(details = "", resetSelected = true) { - const detailsUrl = getDetailsUrl(details, resetSelected); +export function showDetails(selfLink = "", resetSelected = true) { + const detailsUrl = getDetailsUrl(selfLink, resetSelected); navigation.merge({ search: detailsUrl }); } @@ -36,18 +46,18 @@ export function hideDetails() { showDetails(); } -export function getDetailsUrl(details: string, resetSelected = false) { - const detailsUrl = kubeDetailsUrlParam.toSearchString({ value: details }); +export function getDetailsUrl(selfLink: string, resetSelected = false, mergeGlobals = true) { + const params = new URLSearchParams(mergeGlobals ? navigation.searchParams : ""); + + params.set(kubeDetailsUrlParam.urlName, selfLink); if (resetSelected) { - const params = new URLSearchParams(detailsUrl); - - params.delete(kubeSelectedUrlParam.name); - - return `?${params.toString()}`; + params.delete(kubeSelectedUrlParam.urlName); + } else { + params.set(kubeSelectedUrlParam.urlName, kubeSelectedUrlParam.get()); } - return detailsUrl; + return `?${params}`; } export interface KubeObjectDetailsProps { diff --git a/src/renderer/navigation/page-param.ts b/src/renderer/navigation/page-param.ts index e73da03c44..50f6008738 100644 --- a/src/renderer/navigation/page-param.ts +++ b/src/renderer/navigation/page-param.ts @@ -20,7 +20,7 @@ export class PageParam { static SYSTEM_PREFIX = "lens-"; readonly name: string; - protected urlName: string; + readonly urlName: string; constructor(readonly init: PageParamInit | PageSystemParamInit, protected history: IObservableHistory) { const { isSystem, name } = init as PageSystemParamInit;