import { SetStateAction, useEffect, useState } from 'react'; import sanitize from 'sanitize-html'; import { FormikErrors } from 'formik'; import { useCustomTemplates } from '@/react/portainer/templates/custom-templates/queries/useCustomTemplates'; import { CustomTemplate } from '@/react/portainer/templates/custom-templates/types'; import { CustomTemplatesVariablesField, VariablesFieldValue, getVariablesFieldDefaultValues, } from '@/react/portainer/custom-templates/components/CustomTemplatesVariablesField'; import { FormControl } from '@@/form-components/FormControl'; import { PortainerSelect } from '@@/form-components/PortainerSelect'; export interface Values { template: CustomTemplate | undefined; variables: VariablesFieldValue; } export function TemplateFieldset({ values: initialValues, setValues: setInitialValues, errors, }: { errors?: FormikErrors; values: Values; setValues: (values: SetStateAction) => void; }) { const [values, setControlledValues] = useState(initialValues); // todo remove when all view is in react useEffect(() => { if (initialValues.template?.Id !== values.template?.Id) { setControlledValues(initialValues); } }, [initialValues, values.template?.Id]); const templatesQuery = useCustomTemplates({ select: (templates) => templates.filter((template) => template.EdgeTemplate), }); return ( <> { setValues((values) => { const template = templatesQuery.data?.find( (template) => template.Id === value ); return { ...values, template, variables: getVariablesFieldDefaultValues( template?.Variables || [] ), }; }); }} /> {values.template && ( <> {values.template.Note && (
Information
)} { setValues((values) => ({ ...values, variables: value, })); }} value={values.variables} definitions={values.template.Variables} errors={errors?.variables} /> )} ); function setValues(values: SetStateAction) { setControlledValues(values); setInitialValues(values); } } function TemplateSelector({ value, onChange, error, }: { value: CustomTemplate['Id'] | undefined; onChange: (value: CustomTemplate['Id'] | undefined) => void; error?: string; }) { const templatesQuery = useCustomTemplates({ select: (templates) => templates.filter((template) => template.EdgeTemplate), }); if (!templatesQuery.data) { return null; } return ( ({ label: `${template.Title} - ${template.Description}`, value: template.Id, }))} /> ); function handleChange(value: CustomTemplate['Id']) { onChange(value); } } export function getInitialTemplateValues() { return { template: null, variables: [], file: '', }; }