import { Button, Typography, styled } from '@mui/material'; import { v4 as uuidv4 } from 'uuid'; import Input from 'component/common/Input/Input'; import type { ProjectMode } from '../hooks/useProjectEnterpriseSettingsForm'; const StyledForm = styled('form')(({ theme }) => ({ background: theme.palette.background.default, })); const StyledFormSection = styled('div')(({ theme }) => ({ '& + *': { borderBlockStart: `1px solid ${theme.palette.divider}`, }, padding: theme.spacing(7), })); const TopGrid = styled(StyledFormSection)(({ theme }) => ({ display: 'grid', gridTemplateAreas: '"icon header" "icon project-name" "icon project-description"', gridTemplateColumns: 'minmax(auto, 50px) 1fr', gap: theme.spacing(2), })); const StyledIcon = styled('span')(({ theme }) => ({ border: `1px solid ${theme.palette.primary.main}`, width: `100%`, aspectRatio: '1', borderRadius: theme.shape.borderRadius, })); const StyledHeader = styled(Typography)(({ theme }) => ({ gridArea: 'header', })); const ProjectNameContainer = styled('div')(({ theme }) => ({ gridArea: 'project-name', })); const ProjectDescriptionContainer = styled('div')(({ theme }) => ({ gridArea: 'project-description', })); const StyledInput = styled(Input)(({ theme }) => ({ width: '100%', fieldset: { border: 'none' }, })); const StyledProjectName = styled(StyledInput)(({ theme }) => ({ '*': { fontSize: theme.typography.h1.fontSize }, })); const StyledProjectDescription = styled(StyledInput)(({ theme }) => ({ '*': { fontSize: theme.typography.h2.fontSize }, })); const OptionButtons = styled(StyledFormSection)(({ theme }) => ({ display: 'flex', gap: theme.spacing(2), })); const FormActions = styled(StyledFormSection)(({ theme }) => ({ display: 'flex', gap: theme.spacing(5), justifyContent: 'flex-end', })); type FormProps = { projectId: string; projectName: string; projectDesc: string; projectStickiness?: string; featureLimit?: string; featureCount?: number; projectMode?: string; setProjectStickiness?: React.Dispatch>; setProjectId: React.Dispatch>; setProjectName: React.Dispatch>; setProjectDesc: React.Dispatch>; setFeatureLimit?: React.Dispatch>; setProjectMode?: React.Dispatch>; handleSubmit: (e: any) => void; errors: { [key: string]: string }; mode: 'Create' | 'Edit'; clearErrors: () => void; validateProjectId: () => void; }; const PROJECT_NAME_INPUT = 'PROJECT_NAME_INPUT'; const PROJECT_DESCRIPTION_INPUT = 'PROJECT_DESCRIPTION_INPUT'; export const NewProjectForm: React.FC = ({ children, handleSubmit, projectName, projectDesc, projectStickiness, featureLimit, featureCount, projectMode, setProjectMode, setProjectId, setProjectName, setProjectDesc, setProjectStickiness, setFeatureLimit, errors, mode, clearErrors, }) => { const handleProjectNameUpdate = ( e: React.ChangeEvent, ) => { const input = e.target.value; setProjectName(input); // todo: handle this in a real manner. This is a hack for now. const maybeProjectId = input ? `${encodeURIComponent(input.trim())}-${uuidv4().slice(-12)}` : ''; setProjectId(maybeProjectId); }; return ( { handleSubmit(submitEvent); }} > icon New project { delete errors.name; }} data-testid={PROJECT_NAME_INPUT} autoFocus /> setProjectDesc(e.target.value)} data-testid={PROJECT_DESCRIPTION_INPUT} /> {children} ); };