import { array, boolean, object, SchemaOf, string } from 'yup'; import { FormikErrors } from 'formik'; import { ComposePathField } from '@/react/portainer/gitops/ComposePathField'; import { RefField } from '@/react/portainer/gitops/RefField'; import { GitFormUrlField } from '@/react/portainer/gitops/GitFormUrlField'; import { GitFormModel } from '@/react/portainer/gitops/types'; import { TimeWindowDisplay } from '@/react/portainer/gitops/TimeWindowDisplay'; import { FormSection } from '@@/form-components/FormSection'; import { validateForm } from '@@/form-components/validate-form'; import { GitCredential } from '../account/git-credentials/types'; import { AdditionalFileField } from './AdditionalFilesField'; import { gitAuthValidation, AuthFieldset } from './AuthFieldset'; import { AutoUpdateFieldset } from './AutoUpdateFieldset'; import { autoUpdateValidation } from './AutoUpdateFieldset/validation'; import { refFieldValidation } from './RefField/RefField'; interface Props { value: GitFormModel; onChange: (value: Partial) => void; deployMethod?: 'compose' | 'nomad' | 'manifest'; isDockerStandalone?: boolean; isAdditionalFilesFieldVisible?: boolean; isForcePullVisible?: boolean; isAuthExplanationVisible?: boolean; errors: FormikErrors; baseWebhookUrl: string; } export function GitForm({ value, onChange, deployMethod = 'compose', isDockerStandalone = false, isAdditionalFilesFieldVisible, isForcePullVisible, isAuthExplanationVisible, errors = {}, baseWebhookUrl, }: Props) { return ( handleChange({ RepositoryURL: value })} onChangeRepositoryValid={(value) => handleChange({ RepositoryURLValid: value }) } model={value} errors={errors.RepositoryURL} /> handleChange({ RepositoryReferenceName: value })} model={value} error={errors.RepositoryReferenceName} isUrlValid={value.RepositoryURLValid} /> handleChange({ ComposeFilePathInRepository: value }) } isCompose={deployMethod === 'compose'} model={value} isDockerStandalone={isDockerStandalone} errors={errors.ComposeFilePathInRepository} /> {isAdditionalFilesFieldVisible && ( handleChange({ AdditionalFiles: value })} errors={errors.AdditionalFiles} /> )} {value.AutoUpdate && ( handleChange({ AutoUpdate: value })} isForcePullVisible={isForcePullVisible} errors={errors.AutoUpdate as FormikErrors} /> )} ); function handleChange(partialValue: Partial) { onChange(partialValue); } } export async function validateGitForm( gitCredentials: Array, formValues: GitFormModel ) { return validateForm( () => buildGitValidationSchema(gitCredentials), formValues ); } export function buildGitValidationSchema( gitCredentials: Array ): SchemaOf { return object({ RepositoryURL: string() .url('Invalid Url') .required('Repository URL is required'), RepositoryReferenceName: refFieldValidation(), ComposeFilePathInRepository: string().required( 'Compose file path is required' ), AdditionalFiles: array(string().required()).default([]), RepositoryURLValid: boolean().default(false), AutoUpdate: autoUpdateValidation().nullable(), }).concat(gitAuthValidation(gitCredentials)); }