import { Form, FormikErrors, useFormikContext } from 'formik'; import { CommonFields } from '@/react/portainer/custom-templates/components/CommonFields'; import { CustomTemplatesVariablesDefinitionField } from '@/react/portainer/custom-templates/components/CustomTemplatesVariablesDefinitionField'; import { PlatformField } from '@/react/portainer/custom-templates/components/PlatformSelector'; import { GitForm } from '@/react/portainer/gitops/GitForm'; import { getTemplateVariables, intersectVariables, isTemplateVariablesEnabled, } from '@/react/portainer/custom-templates/components/utils'; import { TemplateTypeSelector } from '@/react/portainer/custom-templates/components/TemplateTypeSelector'; import { EdgeTemplateSettings } from '@/react/portainer/templates/custom-templates/types'; import { applySetStateAction } from '@/react-tools/apply-set-state-action'; import { BoxSelector } from '@@/BoxSelector'; import { WebEditorForm, usePreventExit } from '@@/WebEditorForm'; import { FileUploadForm } from '@@/form-components/FileUpload'; import { FormActions } from '@@/form-components/FormActions'; import { FormSection } from '@@/form-components/FormSection'; import { editor, upload, git, } from '@@/BoxSelector/common-options/build-methods'; import { FormValues, Method, buildMethods } from './types'; import { EdgeSettingsFieldset } from './EdgeSettingsFieldset'; export function InnerForm({ isLoading }: { isLoading: boolean }) { const { values, initialValues, setFieldValue, errors, isValid, setFieldError, setValues, isSubmitting, } = useFormikContext(); usePreventExit( initialValues.FileContent, values.FileContent, values.Method === editor.value && !isSubmitting ); const isGit = values.Method === git.value; return (
setValues((values) => ({ ...values, ...newValues })) } errors={errors} /> setFieldValue('Platform', value)} /> setFieldValue('Type', value)} /> {values.Method === editor.value && (

You can get more information about Compose file format in the{' '} official documentation .

)} {values.Method === upload.value && ( setFieldValue('File', value)} required /> )} {isTemplateVariablesEnabled && ( setFieldValue('Variables', values)} isVariablesNamesFromParent={values.Method === editor.value} errors={errors.Variables} /> )} {values.Method === git.value && ( setValues((values) => ({ ...values, Git: { ...values.Git, ...newValues }, })) } errors={errors.Git} /> )} {values.EdgeSettings && ( setValues((values) => ({ ...values, EdgeSettings: applySetStateAction( edgeSetValues, values.EdgeSettings ), })) } gitConfig={isGit ? values.Git : undefined} fileValues={{ fileContent: values.FileContent, file: values.File, }} values={values.EdgeSettings} errors={errors.EdgeSettings as FormikErrors} setFieldError={setFieldError} /> )} ); function handleChangeFileContent(value: string) { setFieldValue( 'FileContent', value, isTemplateVariablesEnabled ? !value : true ); parseTemplate(value); } function parseTemplate(value: string) { if (!isTemplateVariablesEnabled || value === '') { setFieldValue('Variables', []); return; } const [variables, validationError] = getTemplateVariables(value); const isValid = !!variables; setFieldError( 'FileContent', validationError ? `Template invalid: ${validationError}` : undefined ); if (isValid) { setFieldValue( 'Variables', intersectVariables(values.Variables, variables) ); } } function handleChangeMethod(method: Method) { setFieldValue('FileContent', ''); setFieldValue('Variables', []); setFieldValue('Method', method); } }