import { useMemo, useState } from 'react'; import { ArrowUp } from 'lucide-react'; import { withReactQuery } from '@/react-tools/withReactQuery'; import { withCurrentUser } from '@/react-tools/withCurrentUser'; import { ChartVersion } from '@/react/kubernetes/helm/helmChartSourceQueries/useHelmRepoVersions'; import { EnvironmentId } from '@/react/portainer/environments/types'; import { Modal, OnSubmit, openModal } from '@@/modals'; import { Button } from '@@/buttons'; import { Input } from '@@/form-components/Input'; import { FormControl } from '@@/form-components/FormControl'; import { WidgetTitle } from '@@/Widget'; import { Checkbox } from '@@/form-components/Checkbox'; import { Option, PortainerSelect } from '@@/form-components/PortainerSelect'; import { UpdateHelmReleasePayload } from '../../types'; import { HelmValuesInput } from '../../components/HelmValuesInput'; import { useHelmChartValues } from '../../helmChartSourceQueries/useHelmChartValues'; import { ManifestPreviewFormSection } from '../../components/ManifestPreviewFormSection'; interface Props { onSubmit: OnSubmit; helmReleaseInitialValues: UpdateHelmReleasePayload; releaseManifest: string; versions: ChartVersion[]; chartName: string; environmentId: EnvironmentId; } export function UpgradeHelmModal({ helmReleaseInitialValues, releaseManifest, versions, onSubmit, chartName, environmentId, }: Props) { const versionOptions: Option[] = versions.map((version) => { const repo = helmReleaseInitialValues.repo === version.Repo ? version.Repo : ''; const isCurrentVersion = version.AppVersion === helmReleaseInitialValues.appVersion && version.Version === helmReleaseInitialValues.version; const label = `${repo}@${version.Version}${ isCurrentVersion ? ' (current)' : '' }`; return { repo, label, value: version, }; }); const defaultVersion = versionOptions.find( (v) => v.value.AppVersion === helmReleaseInitialValues.appVersion && v.value.Version === helmReleaseInitialValues.version && v.value.Repo === helmReleaseInitialValues.repo )?.value || versionOptions[0]?.value; const [version, setVersion] = useState(defaultVersion); const [userValues, setUserValues] = useState( helmReleaseInitialValues.values || '' ); const [atomic, setAtomic] = useState(true); const [previewIsValid, setPreviewIsValid] = useState(false); const chartValuesRefQuery = useHelmChartValues({ chart: chartName, repo: version.Repo, version: version.Version, }); const submitPayload = useMemo( () => ({ name: helmReleaseInitialValues.name, values: userValues, namespace: helmReleaseInitialValues.namespace, chart: helmReleaseInitialValues.chart, repo: version.Repo, version: version.Version, atomic, }), [helmReleaseInitialValues, userValues, version, atomic] ); return ( onSubmit()} size="xl" className="flex flex-col h-[80vh] px-0" aria-label="upgrade-helm" > } />
value={version} options={versionOptions} onChange={(version) => { if (version) { setVersion(version); } }} data-cy="helm-version-input" /> setAtomic(e.target.checked)} />
); } export async function openUpgradeHelmModal( helmReleaseInitialValues: UpdateHelmReleasePayload, versions: ChartVersion[], releaseManifest: string, environmentId: EnvironmentId ) { return openModal(withReactQuery(withCurrentUser(UpgradeHelmModal)), { helmReleaseInitialValues, versions, chartName: helmReleaseInitialValues.chart, releaseManifest, environmentId, }); }