import "./release-details.scss"; import React, { Component } from "react"; import groupBy from "lodash/groupBy"; import isEqual from "lodash/isEqual"; import { observable, reaction } from "mobx"; import { Link } from "react-router-dom"; import { t, Trans } from "@lingui/macro"; import kebabCase from "lodash/kebabCase"; import { HelmRelease, helmReleasesApi, ReleaseInfo } from "../../api/endpoints/helm-releases.api"; import { HelmReleaseMenu } from "./release-menu"; import { Drawer, DrawerItem, DrawerTitle } from "../drawer"; import { Badge } from "../badge"; import { cssNames, stopPropagation } from "../../utils"; import { disposeOnUnmount, observer } from "mobx-react"; import { Spinner } from "../spinner"; import { Table, TableCell, TableHead, TableRow } from "../table"; import { AceEditor } from "../ace-editor"; import { Button } from "../button"; import { releaseStore } from "./release.store"; import { Notifications } from "../notifications"; import { createUpgradeChartTab } from "../dock/upgrade-chart.store"; import { getDetailsUrl } from "../../navigation"; import { _i18n } from "../../i18n"; import { themeStore } from "../../theme.store"; import { apiManager } from "../../api/api-manager"; import { SubTitle } from "../layout/sub-title"; import { secretsStore } from "../+config-secrets/secrets.store"; import { Secret } from "../../api/endpoints"; interface Props { release: HelmRelease; hideDetails(): void; } @observer export class ReleaseDetails extends Component { @observable details: ReleaseInfo; @observable values = ""; @observable saving = false; @observable releaseSecret: Secret; @disposeOnUnmount releaseSelector = reaction(() => this.props.release, release => { if (!release) { return; } this.loadDetails(); this.loadValues(); this.releaseSecret = null; } ); @disposeOnUnmount secretWatcher = reaction(() => secretsStore.items.toJS(), () => { if (!this.props.release) { return; } const { getReleaseSecret } = releaseStore; const { release } = this.props; const secret = getReleaseSecret(release); if (this.releaseSecret) { if (isEqual(this.releaseSecret.getLabels(), secret.getLabels())) { return; } this.loadDetails(); } this.releaseSecret = secret; }); async loadDetails(): Promise { const { release } = this.props; this.details = null; this.details = await helmReleasesApi.get(release.getName(), release.namespace); } async loadValues(): Promise { const { release } = this.props; this.values = ""; this.values = await helmReleasesApi.getValues(release.getName(), release.namespace); } updateValues = async (): Promise => { const { release } = this.props; const { namespace, name} = release; const data = { chart: release.getChart(), repo: await release.getRepo(), version: release.getVersion(), values: this.values }; this.saving = true; try { await releaseStore.update(name, namespace, data); Notifications.ok(

Release {name} successfully updated!

); } catch (err) { Notifications.error(err); } this.saving = false; } upgradeVersion = (): void => { const { release, hideDetails } = this.props; createUpgradeChartTab(release); hideDetails(); } renderValues(): JSX.Element { const { values, saving } = this; return (
this.values = values} />
); } renderNotes(): JSX.Element { if (!this.details.info?.notes) { return null; } const { notes } = this.details.info; return (
{notes}
); } renderResources(): JSX.Element { const { resources } = this.details; if (!resources) { return null; } const groups = groupBy(resources, item => item.kind); const tables = Object.entries(groups).map(([kind, items]) => { return ( Name {items[0].getNs() && Namespace} Age {items.map(item => { const name = item.getName(); const namespace = item.getNs(); const api = apiManager.getApi(item.metadata.selfLink); const detailsUrl = api ? getDetailsUrl(api.getUrl({ name, namespace, })) : ""; return ( {detailsUrl ? {name} : name} {namespace && {namespace}} {item.getAge()} ); })}
); }); return (
{tables}
); } renderContent(): JSX.Element { const { release } = this.props; const { details } = this; if (!release) { return null; } if (!details) { return ; } return (
Chart} className="chart">
{release.getChart()}
Updated}> {release.getUpdated()} ago ({release.updated}) Namespace}> {release.namespace} Version} onClick={stopPropagation}>
{release.getVersion()}
Status} className="status" labelsOnly> {this.renderValues()} {this.renderNotes()} {this.renderResources()}
); } render(): JSX.Element { const { release, hideDetails } = this.props; const title = release ? Release: {release.getName()} : ""; const toolbar = ; return ( {this.renderContent()} ); } }