import { FormikErrors } from 'formik'; import { SchemaOf, array, string } from 'yup'; import { TemplateEnv } from '@/react/portainer/templates/app-templates/types'; import { FormControl } from '@@/form-components/FormControl'; import { Input, Select } from '@@/form-components/Input'; type Value = Record; export function EnvVarsFieldset({ onChange, options, value, errors, }: { options: Array; onChange: (value: Value) => void; value: Value; errors?: FormikErrors; }) { return ( <> {options.map((env) => ( handleChange(env.name, value)} errors={errors?.[env.name]} /> ))} ); function handleChange(name: string, envValue: string) { onChange({ ...value, [name]: envValue }); } } function Item({ onChange, option, value, errors, }: { option: TemplateEnv; value: string; onChange: (value: string) => void; errors?: FormikErrors; }) { const inputId = `env_var_${option.name}`; return ( {option.select ? ( onChange(e.target.value)} disabled={option.preset} id={inputId} /> )} ); } export function getDefaultValues(definitions: Array): Value { return Object.fromEntries( definitions.map((v) => { if (v.select) { return [v.name, v.select.find((v) => v.default)?.value || '']; } return [v.name, v.default || '']; }) ); } export function envVarsFieldsetValidation(): SchemaOf { return ( array() .transform((_, orig) => Object.values(orig)) // casting to return the correct type - validation works as expected .of(string().required('Required')) as unknown as SchemaOf ); }