/** * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ import "./dialog.scss"; import React from "react"; import type { IObservableValue } from "mobx"; import { computed, observable, runInAction } from "mobx"; import { observer } from "mobx-react"; import type { DialogProps } from "../../dialog"; import { Dialog } from "../../dialog"; import { Wizard, WizardStep } from "../../wizard"; import type { HelmRelease } from "../../../../common/k8s-api/endpoints/helm-releases.api"; import { Select } from "../../select"; import { Notifications } from "../../notifications"; import orderBy from "lodash/orderBy"; import { withInjectables } from "@ogre-tools/injectable-react"; import releaseRollbackDialogStateInjectable from "./state.injectable"; import type { RollbackRelease } from "../rollback-release/rollback-release.injectable"; import rollbackReleaseInjectable from "../rollback-release/rollback-release.injectable"; import type { HelmReleaseRevision, RequestHelmReleaseHistory } from "../../../../common/k8s-api/endpoints/helm-releases.api/request-history.injectable"; import requestHelmReleaseHistoryInjectable from "../../../../common/k8s-api/endpoints/helm-releases.api/request-history.injectable"; export interface ReleaseRollbackDialogProps extends DialogProps { } interface Dependencies { rollbackRelease: RollbackRelease; state: IObservableValue; requestHelmReleaseHistory: RequestHelmReleaseHistory; } @observer class NonInjectedReleaseRollbackDialog extends React.Component { readonly isLoading = observable.box(false); readonly revision = observable.box(); readonly revisions = observable.array(); readonly revisionOptions = computed(() => ( this.revisions.map(revision => ({ value: revision, label: `${revision.revision} - ${revision.chart} - ${revision.app_version}, updated: ${new Date(revision.updated).toLocaleString()}`, })) )); close = () => { this.props.state.set(undefined); }; onOpen = async (release: HelmRelease) => { this.isLoading.set(true); const releases = await this.props.requestHelmReleaseHistory(release.getName(), release.getNs()); runInAction(() => { this.revisions.replace(orderBy(releases, "revision", "desc")); this.revision.set(this.revisions[0]); this.isLoading.set(false); }); }; rollback = async (release: HelmRelease) => { const revision = this.revision.get(); if (!revision) { return; } try { await this.props.rollbackRelease(release.getName(), release.getNs(), revision.revision); this.close(); } catch (err) { Notifications.checkedError(err, "Unknown error occured while rolling back release"); } }; renderRevisionContent() { const revision = this.revision.get(); if (!revision) { return

No revisions to rollback.

; } return (
Revision