import React, { Component } from "react"; import styled from "styled-components"; import { Section, FormElement } from "shared/types"; import { Context } from "shared/Context"; import CheckboxRow from "./CheckboxRow"; import InputRow from "./InputRow"; import Base64InputRow from "./Base64InputRow"; import SelectRow from "./SelectRow"; import Helper from "./Helper"; import Heading from "./Heading"; import ExpandableResource from "../ExpandableResource"; import VeleroForm from "../forms/VeleroForm"; import InputArray from "./InputArray"; import KeyValueArray from "./KeyValueArray"; type PropsType = { sections?: Section[]; metaState?: any; setMetaState?: (key: string, value: any) => void; handleEnvChange?: (x: any) => void; disabled?: boolean; externalValues?: any; }; type StateType = any; // Requires an internal representation unlike other values components because metaState value underdetermines input order export default class ValuesForm extends Component { getInputValue = (item: FormElement) => { if (item) { let key = item.name || item.variable; let value = this.props.metaState[key]?.value; if ( item.settings && item.settings.unit && value && value.includes && !item.settings.omitUnitFromValue ) { value = value.split(item.settings.unit)[0]; } return value; } }; renderSection = (section: Section) => { return section.contents?.map((item: FormElement, i: number) => { if (!item) { return; } // If no name is assigned use values.yaml variable as identifier let key = item.name || item.variable; let isDisabled = item.settings?.disableAfterLaunch && !this.props.externalValues?.isLaunch; isDisabled = isDisabled || this.props.disabled; switch (item.type) { case "heading": return {item.label}; case "subtitle": return {item.label}; case "resource-list": if (Array.isArray(item.value)) { return ( {item.value?.map((resource: any, i: number) => { return ( ); })} ); } case "checkbox": return ( this.props.setMetaState(key, !this.props.metaState[key]?.value) } label={item.label} /> ); case "env-key-value-array": return ( { this.props.setMetaState(key, x); // Need to pull env vars out of form.yaml for createGHA build env vars if ( this.props.handleEnvChange && key === "container.env.normal" ) { // this.props.handleEnvChange(x); } }} label={item.label} disabled={isDisabled} secretOption={true} /> ); case "key-value-array": return ( this.props.setMetaState(key, x)} label={item.label} disabled={isDisabled} /> ); case "array-input": return ( { this.props.setMetaState(key, x); }} label={item.label} disabled={isDisabled} /> ); case "string-input": return ( { if ( item.settings && item.settings.unit && x !== "" && !item.settings.omitUnitFromValue ) { x = x + item.settings.unit; } this.props.setMetaState(key, x); }} label={item.label} unit={item.settings ? item.settings.unit : null} disabled={isDisabled} /> ); case "string-input-password": return ( { if ( item.settings && item.settings.unit && x !== "" && !item.settings.omitUnitFromValue ) { x = x + item.settings.unit; } this.props.setMetaState(key, x); }} label={item.label} unit={item.settings ? item.settings.unit : null} disabled={isDisabled} /> ); case "number-input": return ( { let val: string | number = x; if (Number.isNaN(x)) { val = ""; } // Convert to string if unit is set if ( item.settings && item.settings.unit && !item.settings.omitUnitFromValue ) { val = x.toString(); val = val + item.settings.unit; } this.props.setMetaState(key, val); }} label={item.label} unit={item.settings ? item.settings.unit : null} disabled={isDisabled} /> ); case "select": return ( this.props.setMetaState(key, val)} options={item.settings.options} dropdownLabel="" label={item.label} /> ); case "provider-select": return ( this.props.setMetaState(key, val)} options={[ { value: "aws", label: "Amazon Web Services (AWS)" }, { value: "gcp", label: "Google Cloud Platform (GCP)" }, { value: "do", label: "DigitalOcean" }, ]} dropdownLabel="" label={item.label} /> ); case "velero-create-backup": return ; case "base-64": return ( { if ( item.settings && item.settings.unit && x !== "" && !item.settings.omitUnitFromValue ) { x = x + item.settings.unit; } this.props.setMetaState(key, btoa(x)); }} label={item.label} unit={item.settings ? item.settings.unit : null} disabled={isDisabled} /> ); case "base-64-password": return ( { if ( item.settings && item.settings.unit && x !== "" && !item.settings.omitUnitFromValue ) { x = x + item.settings.unit; } this.props.setMetaState(key, btoa(x)); }} label={item.label} unit={item.settings ? item.settings.unit : null} disabled={isDisabled} /> ); default: } }); }; renderFormContents = () => { if (this.props.metaState) { return this.props.sections?.map((section: Section, i: number) => { // Hide collapsible section if deciding field is false if (section.show_if) { if ( !this.props.metaState[section.show_if] || this.props.metaState[section.show_if].value === false ) { return null; } } return
{this.renderSection(section)}
; }); } }; render() { return ( {this.renderFormContents()} ); } } ValuesForm.contextType = Context; const ResourceList = styled.div` margin-bottom: 15px; margin-top: 20px; border-radius: 5px; overflow: hidden; `; const DarkMatter = styled.div` margin-top: 0px; `; const StyledValuesForm = styled.div` width: 100%; height: 100%; background: #ffffff11; color: #ffffff; padding: 0px 35px 25px; position: relative; border-radius: 5px; font-size: 13px; overflow: auto; `;