diff --git a/packages/core/src/common/k8s-api/endpoints/pod.api.ts b/packages/core/src/common/k8s-api/endpoints/pod.api.ts index d0c0178d8d..1db41957b2 100644 --- a/packages/core/src/common/k8s-api/endpoints/pod.api.ts +++ b/packages/core/src/common/k8s-api/endpoints/pod.api.ts @@ -80,6 +80,8 @@ export interface ContainerState { terminated?: ContainerStateTerminated; } +export type ContainerStateValues = Partial; + export interface PodContainerStatus { name: string; state?: ContainerState; @@ -649,7 +651,7 @@ export class Pod extends KubeObject< .filter(({ name }) => runningContainerNames.has(name)); } - getContainerStatuses(includeInitContainers = true) { + getContainerStatuses(includeInitContainers = true): PodContainerStatus[] { const { containerStatuses = [], initContainerStatuses = [] } = this.status ?? {}; if (includeInitContainers) { diff --git a/packages/core/src/renderer/components/+workloads-pods/pods.tsx b/packages/core/src/renderer/components/+workloads-pods/pods.tsx index 3f310c2b76..849a101ae1 100644 --- a/packages/core/src/renderer/components/+workloads-pods/pods.tsx +++ b/packages/core/src/renderer/components/+workloads-pods/pods.tsx @@ -5,11 +5,11 @@ import "./pods.scss"; -import React, { Fragment } from "react"; +import React from "react"; import { observer } from "mobx-react"; import { Link } from "react-router-dom"; import { KubeObjectListLayout } from "../kube-object-list-layout"; -import type { NodeApi, Pod } from "../../../common/k8s-api/endpoints"; +import type { ContainerStateValues, NodeApi, Pod } from "../../../common/k8s-api/endpoints"; import { StatusBrick } from "../status-brick"; import { cssNames, getConvertedParts, object, stopPropagation } from "@k8slens/utilities"; import startCase from "lodash/startCase"; @@ -21,8 +21,8 @@ import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout"; import { KubeObjectAge } from "../kube-object/age"; import { withInjectables } from "@ogre-tools/injectable-react"; import type { GetDetailsUrl } from "../kube-detail-params/get-details-url.injectable"; -import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable"; import getDetailsUrlInjectable from "../kube-detail-params/get-details-url.injectable"; +import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable"; import type { EventStore } from "../+events/store"; import type { PodStore } from "./store"; import nodeApiInjectable from "../../../common/k8s-api/endpoints/node.api.injectable"; @@ -52,8 +52,12 @@ interface Dependencies { @observer class NonInjectedPods extends React.Component { - renderState(name: string, ready: boolean, key: string, data: Partial> | undefined) { - return data && ( + renderState(name: string, ready: boolean, key: string, data?: ContainerStateValues) { + if (!data) { + return; + } + + return ( <>
{name} @@ -64,40 +68,37 @@ class NonInjectedPods extends React.Component {
{object.entries(data).map(([name, value]) => ( -
-
- {startCase(name)} -
-
- {value} -
-
+ +
{startCase(name)}
+
{value}
+
))} ); } renderContainersStatus(pod: Pod) { - return pod.getContainerStatuses() - .map(({ name, state = {}, ready }) => ( - - - {this.renderState(name, ready, "running", state.running)} - {this.renderState(name, ready, "waiting", state.waiting)} - {this.renderState(name, ready, "terminated", state.terminated)} - - ), - }} - /> - - )); + return pod.getContainerStatuses().map(({ name, state, ready }) => { + return ( + + {this.renderState(name, ready, "running", state?.running)} + {this.renderState(name, ready, "waiting", state?.waiting)} + {this.renderState(name, ready, "terminated", state?.terminated)} + + ), + }} + /> + ); + }); } render() { diff --git a/packages/core/src/renderer/components/tooltip/tooltip.scss b/packages/core/src/renderer/components/tooltip/tooltip.scss index 10b7669679..d90d91f52e 100644 --- a/packages/core/src/renderer/components/tooltip/tooltip.scss +++ b/packages/core/src/renderer/components/tooltip/tooltip.scss @@ -63,27 +63,36 @@ } &.tableView { - min-width: 200px; + display: grid; + gap: var(--padding); + grid-template-columns: max-content 1fr; + grid-template-rows: repeat(2, 1fr); - > :not(:last-child) { - margin-bottom: var(--flex-gap); + // backward compatibility: skips element in DOM to consider only children in grid-flow + > .flex { + display: contents; + } + + > * { + white-space: pre-wrap; + word-break: break-word; } .title { + grid-column: 1 / 3; // merge color: var(--textColorAccent); text-align: center; + font-weight: bold; } .name { - color: var(--textColorAccent); text-align: right; - flex: 0 0 35%; + color: var(--textColorAccent); } .value { text-align: left; - max-width: 300px; - word-break: break-word; + color: var(--textColorSecondary); } } }