mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Fix crash and update unit test
Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
parent
7bcce5cb98
commit
eb84b6f47e
@ -350,8 +350,8 @@ describe("showing details for helm release", () => {
|
|||||||
expect(rendered.baseElement).toMatchSnapshot();
|
expect(rendered.baseElement).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("does not reload", () => {
|
it("does reload", () => {
|
||||||
expect(requestDetailedHelmReleaseMock).not.toHaveBeenCalled();
|
expect(requestDetailedHelmReleaseMock).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -11,10 +11,7 @@ import { Link } from "react-router-dom";
|
|||||||
import { DrawerItem, DrawerTitle } from "../../drawer";
|
import { DrawerItem, DrawerTitle } from "../../drawer";
|
||||||
import { stopPropagation } from "../../../utils";
|
import { stopPropagation } from "../../../utils";
|
||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
import type { IAsyncComputed } from "@ogre-tools/injectable-react";
|
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
|
||||||
import type { ConfigurationInput, MinimalResourceGroup, OnlyUserSuppliedValuesAreShownToggle, ReleaseDetailsModel } from "./release-details-model/release-details-model.injectable";
|
import type { ConfigurationInput, MinimalResourceGroup, OnlyUserSuppliedValuesAreShownToggle, ReleaseDetailsModel } from "./release-details-model/release-details-model.injectable";
|
||||||
import releaseDetailsModelInjectable from "./release-details-model/release-details-model.injectable";
|
|
||||||
import { Button } from "../../button";
|
import { Button } from "../../button";
|
||||||
import { kebabCase } from "lodash/fp";
|
import { kebabCase } from "lodash/fp";
|
||||||
import { Badge } from "../../badge";
|
import { Badge } from "../../badge";
|
||||||
@ -22,37 +19,22 @@ import { SubTitle } from "../../layout/sub-title";
|
|||||||
import { Table, TableCell, TableHead, TableRow } from "../../table";
|
import { Table, TableCell, TableHead, TableRow } from "../../table";
|
||||||
import { Checkbox } from "../../checkbox";
|
import { Checkbox } from "../../checkbox";
|
||||||
import { MonacoEditor } from "../../monaco-editor";
|
import { MonacoEditor } from "../../monaco-editor";
|
||||||
import { Spinner } from "../../spinner";
|
|
||||||
import type { TargetHelmRelease } from "./target-helm-release.injectable";
|
|
||||||
|
|
||||||
interface ReleaseDetailsContentProps {
|
interface ReleaseDetailsContentProps {
|
||||||
targetRelease: TargetHelmRelease;
|
model: ReleaseDetailsModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Dependencies {
|
export const ReleaseDetailsContent = observer(({ model }: ReleaseDetailsContentProps) => {
|
||||||
computedModel: IAsyncComputed<ReleaseDetailsModel>;
|
|
||||||
}
|
|
||||||
|
|
||||||
const NonInjectedReleaseDetailsContent = observer(({ computedModel }: Dependencies & ReleaseDetailsContentProps) => {
|
|
||||||
const model = computedModel.value.get();
|
|
||||||
|
|
||||||
if (!model) {
|
|
||||||
return <Spinner center data-testid="helm-release-detail-content-spinner" />;
|
|
||||||
}
|
|
||||||
|
|
||||||
const loadingError = model.loadingError.get();
|
const loadingError = model.loadingError.get();
|
||||||
|
|
||||||
if (loadingError) {
|
if (loadingError) {
|
||||||
return (
|
return (
|
||||||
<div data-testid="helm-release-detail-error">
|
<div data-testid="helm-release-detail-error">
|
||||||
Failed to load release:
|
{`Failed to load release: ${loadingError}`}
|
||||||
{" "}
|
|
||||||
{loadingError}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<DrawerItem name="Chart" className="chart">
|
<DrawerItem name="Chart" className="chart">
|
||||||
@ -94,9 +76,7 @@ const NonInjectedReleaseDetailsContent = observer(({ computedModel }: Dependenci
|
|||||||
<ReleaseValues
|
<ReleaseValues
|
||||||
releaseId={model.id}
|
releaseId={model.id}
|
||||||
configuration={model.configuration}
|
configuration={model.configuration}
|
||||||
onlyUserSuppliedValuesAreShown={
|
onlyUserSuppliedValuesAreShown={model.onlyUserSuppliedValuesAreShown}
|
||||||
model.onlyUserSuppliedValuesAreShown
|
|
||||||
}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<DrawerTitle>Notes</DrawerTitle>
|
<DrawerTitle>Notes</DrawerTitle>
|
||||||
@ -116,13 +96,6 @@ const NonInjectedReleaseDetailsContent = observer(({ computedModel }: Dependenci
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
export const ReleaseDetailsContent = withInjectables<Dependencies, ReleaseDetailsContentProps>(NonInjectedReleaseDetailsContent, {
|
|
||||||
getProps: (di, props) => ({
|
|
||||||
...props,
|
|
||||||
computedModel: di.inject(releaseDetailsModelInjectable, props.targetRelease),
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|
||||||
const ResourceGroup = ({
|
const ResourceGroup = ({
|
||||||
group: { kind, isNamespaced, resources },
|
group: { kind, isNamespaced, resources },
|
||||||
}: {
|
}: {
|
||||||
|
|||||||
@ -8,33 +8,23 @@ import "./release-details.scss";
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
|
|
||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
import type { IAsyncComputed } from "@ogre-tools/injectable-react";
|
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
import type { TargetHelmRelease } from "./target-helm-release.injectable";
|
|
||||||
import navigateToHelmReleasesInjectable from "../../../../common/front-end-routing/routes/cluster/helm/releases/navigate-to-helm-releases.injectable";
|
import navigateToHelmReleasesInjectable from "../../../../common/front-end-routing/routes/cluster/helm/releases/navigate-to-helm-releases.injectable";
|
||||||
import type { ReleaseDetailsModel } from "./release-details-model/release-details-model.injectable";
|
import type { ReleaseDetailsModel } from "./release-details-model/release-details-model.injectable";
|
||||||
import releaseDetailsModelInjectable from "./release-details-model/release-details-model.injectable";
|
|
||||||
import { HelmReleaseMenu } from "../release-menu";
|
import { HelmReleaseMenu } from "../release-menu";
|
||||||
|
|
||||||
interface ReleaseDetailsDrawerProps {
|
interface ReleaseDetailsDrawerProps {
|
||||||
targetRelease: TargetHelmRelease;
|
model: ReleaseDetailsModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
computedModel: IAsyncComputed<ReleaseDetailsModel>;
|
|
||||||
navigateToHelmReleases: () => void;
|
navigateToHelmReleases: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
const NonInjectedReleaseDetailsDrawerToolbar = observer(({
|
const NonInjectedReleaseDetailsDrawerToolbar = observer(({
|
||||||
computedModel,
|
model,
|
||||||
navigateToHelmReleases,
|
navigateToHelmReleases,
|
||||||
}: Dependencies & ReleaseDetailsDrawerProps) => {
|
}: Dependencies & ReleaseDetailsDrawerProps) => {
|
||||||
const model = computedModel.value.get();
|
|
||||||
|
|
||||||
if (!model) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (model.loadingError.get()) {
|
if (model.loadingError.get()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -51,7 +41,6 @@ const NonInjectedReleaseDetailsDrawerToolbar = observer(({
|
|||||||
export const ReleaseDetailsDrawerToolbar = withInjectables<Dependencies, ReleaseDetailsDrawerProps>(NonInjectedReleaseDetailsDrawerToolbar, {
|
export const ReleaseDetailsDrawerToolbar = withInjectables<Dependencies, ReleaseDetailsDrawerProps>(NonInjectedReleaseDetailsDrawerToolbar, {
|
||||||
getProps: (di, props) => ({
|
getProps: (di, props) => ({
|
||||||
...props,
|
...props,
|
||||||
computedModel: di.inject(releaseDetailsModelInjectable, props.targetRelease),
|
|
||||||
navigateToHelmReleases: di.inject(navigateToHelmReleasesInjectable),
|
navigateToHelmReleases: di.inject(navigateToHelmReleasesInjectable),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -17,6 +17,9 @@ import activeThemeTypeInjectable from "../../../themes/active-type.injectable";
|
|||||||
import { ReleaseDetailsContent } from "./release-details-content";
|
import { ReleaseDetailsContent } from "./release-details-content";
|
||||||
import navigateToHelmReleasesInjectable from "../../../../common/front-end-routing/routes/cluster/helm/releases/navigate-to-helm-releases.injectable";
|
import navigateToHelmReleasesInjectable from "../../../../common/front-end-routing/routes/cluster/helm/releases/navigate-to-helm-releases.injectable";
|
||||||
import { ReleaseDetailsDrawerToolbar } from "./release-details-drawer-toolbar";
|
import { ReleaseDetailsDrawerToolbar } from "./release-details-drawer-toolbar";
|
||||||
|
import type { ReleaseDetailsModel } from "./release-details-model/release-details-model.injectable";
|
||||||
|
import releaseDetailsModelInjectable from "./release-details-model/release-details-model.injectable";
|
||||||
|
import { Spinner } from "../../spinner";
|
||||||
|
|
||||||
interface ReleaseDetailsDrawerProps {
|
interface ReleaseDetailsDrawerProps {
|
||||||
targetRelease: TargetHelmRelease;
|
targetRelease: TargetHelmRelease;
|
||||||
@ -25,12 +28,14 @@ interface ReleaseDetailsDrawerProps {
|
|||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
activeThemeType: ActiveThemeType;
|
activeThemeType: ActiveThemeType;
|
||||||
closeDrawer: () => void;
|
closeDrawer: () => void;
|
||||||
|
model: ReleaseDetailsModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
const NonInjectedReleaseDetailsDrawer = observer(({
|
const NonInjectedReleaseDetailsDrawer = observer(({
|
||||||
activeThemeType,
|
activeThemeType,
|
||||||
closeDrawer,
|
closeDrawer,
|
||||||
targetRelease,
|
targetRelease,
|
||||||
|
model,
|
||||||
}: Dependencies & ReleaseDetailsDrawerProps) => (
|
}: Dependencies & ReleaseDetailsDrawerProps) => (
|
||||||
<Drawer
|
<Drawer
|
||||||
className={cssNames("ReleaseDetails", activeThemeType.get())}
|
className={cssNames("ReleaseDetails", activeThemeType.get())}
|
||||||
@ -39,20 +44,50 @@ const NonInjectedReleaseDetailsDrawer = observer(({
|
|||||||
title={targetRelease.name}
|
title={targetRelease.name}
|
||||||
onClose={closeDrawer}
|
onClose={closeDrawer}
|
||||||
testIdForClose="close-helm-release-detail"
|
testIdForClose="close-helm-release-detail"
|
||||||
toolbar={<ReleaseDetailsDrawerToolbar targetRelease={targetRelease} />}
|
toolbar={<ReleaseDetailsDrawerToolbar model={model} />}
|
||||||
data-testid={`helm-release-details-for-${targetRelease.namespace}/${targetRelease.name}`}
|
data-testid={`helm-release-details-for-${targetRelease.namespace}/${targetRelease.name}`}
|
||||||
>
|
>
|
||||||
<ReleaseDetailsContent targetRelease={targetRelease} />
|
<ReleaseDetailsContent model={model} />
|
||||||
</Drawer>
|
</Drawer>
|
||||||
));
|
));
|
||||||
|
|
||||||
export const ReleaseDetailsDrawer = withInjectables<
|
interface PlaceholderDependencies {
|
||||||
Dependencies,
|
activeThemeType: ActiveThemeType;
|
||||||
ReleaseDetailsDrawerProps
|
closeDrawer: () => void;
|
||||||
>(NonInjectedReleaseDetailsDrawer, {
|
}
|
||||||
|
|
||||||
|
const NonInjectedReleaseDetailsDrawerPlaceholder = observer(({
|
||||||
|
targetRelease,
|
||||||
|
activeThemeType,
|
||||||
|
closeDrawer,
|
||||||
|
}: ReleaseDetailsDrawerProps & PlaceholderDependencies) => (
|
||||||
|
<Drawer
|
||||||
|
className={cssNames("ReleaseDetails", activeThemeType.get())}
|
||||||
|
usePortal={true}
|
||||||
|
open={true}
|
||||||
|
title={targetRelease.name}
|
||||||
|
onClose={closeDrawer}
|
||||||
|
testIdForClose="close-helm-release-detail"
|
||||||
|
data-testid={`helm-release-details-for-${targetRelease.namespace}/${targetRelease.name}`}
|
||||||
|
>
|
||||||
|
<Spinner center data-testid="helm-release-detail-content-spinner" />
|
||||||
|
</Drawer>
|
||||||
|
));
|
||||||
|
|
||||||
|
const ReleaseDetailsDrawerPlaceholder = withInjectables<PlaceholderDependencies, ReleaseDetailsDrawerProps>(NonInjectedReleaseDetailsDrawerPlaceholder, {
|
||||||
getProps: (di, props) => ({
|
getProps: (di, props) => ({
|
||||||
|
...props,
|
||||||
activeThemeType: di.inject(activeThemeTypeInjectable),
|
activeThemeType: di.inject(activeThemeTypeInjectable),
|
||||||
closeDrawer: di.inject(navigateToHelmReleasesInjectable),
|
closeDrawer: di.inject(navigateToHelmReleasesInjectable),
|
||||||
...props,
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const ReleaseDetailsDrawer = withInjectables<Dependencies, ReleaseDetailsDrawerProps>(NonInjectedReleaseDetailsDrawer, {
|
||||||
|
getPlaceholder: ReleaseDetailsDrawerPlaceholder,
|
||||||
|
getProps: async (di, props) => ({
|
||||||
|
...props,
|
||||||
|
activeThemeType: di.inject(activeThemeTypeInjectable),
|
||||||
|
closeDrawer: di.inject(navigateToHelmReleasesInjectable),
|
||||||
|
model: await di.inject(releaseDetailsModelInjectable, props.targetRelease),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -31,15 +31,11 @@ import assert from "assert";
|
|||||||
import activeThemeInjectable from "../../../../themes/active.injectable";
|
import activeThemeInjectable from "../../../../themes/active.injectable";
|
||||||
import type { ToHelmRelease } from "../../to-helm-release.injectable";
|
import type { ToHelmRelease } from "../../to-helm-release.injectable";
|
||||||
import toHelmReleaseInjectable from "../../to-helm-release.injectable";
|
import toHelmReleaseInjectable from "../../to-helm-release.injectable";
|
||||||
import { asyncComputed } from "@ogre-tools/injectable-react";
|
|
||||||
import targetHelmReleaseInjectable from "../target-helm-release.injectable";
|
|
||||||
|
|
||||||
const releaseDetailsModelInjectable = getInjectable({
|
const releaseDetailsModelInjectable = getInjectable({
|
||||||
id: "release-details-model",
|
id: "release-details-model",
|
||||||
|
|
||||||
instantiate: (di, targetRelease: TargetHelmRelease) => {
|
instantiate: async (di, targetRelease: TargetHelmRelease) => {
|
||||||
const detailsHelmRelease = di.inject(targetHelmReleaseInjectable);
|
|
||||||
|
|
||||||
const model = new ReleaseDetailsModel({
|
const model = new ReleaseDetailsModel({
|
||||||
requestDetailedHelmRelease: di.inject(requestDetailedHelmReleaseInjectable),
|
requestDetailedHelmRelease: di.inject(requestDetailedHelmReleaseInjectable),
|
||||||
targetRelease,
|
targetRelease,
|
||||||
@ -54,27 +50,12 @@ const releaseDetailsModelInjectable = getInjectable({
|
|||||||
toHelmRelease: di.inject(toHelmReleaseInjectable),
|
toHelmRelease: di.inject(toHelmReleaseInjectable),
|
||||||
});
|
});
|
||||||
|
|
||||||
return asyncComputed<ReleaseDetailsModel>({
|
await model.load();
|
||||||
getValueFromObservedPromise: async () => {
|
|
||||||
const currentHelmRelease = detailsHelmRelease.get();
|
|
||||||
|
|
||||||
if (
|
return model;
|
||||||
currentHelmRelease
|
|
||||||
&& currentHelmRelease.name === targetRelease.name
|
|
||||||
&& currentHelmRelease.namespace === targetRelease.namespace
|
|
||||||
) {
|
|
||||||
await model.load();
|
|
||||||
}
|
|
||||||
|
|
||||||
return model;
|
|
||||||
},
|
|
||||||
betweenUpdates: "show-latest-value",
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
lifecycle: lifecycleEnum.keyedSingleton({
|
lifecycle: lifecycleEnum.transient,
|
||||||
getInstanceKey: (di, release: TargetHelmRelease) => `${release.namespace}/${release.name}`,
|
|
||||||
}),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export default releaseDetailsModelInjectable;
|
export default releaseDetailsModelInjectable;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user