fix: validate emails in record-fields (#7245)
fix: #7149 Introduced a minimal field validation framework for record-fields. Currently only shows errors for email field. <img width="350" alt="image" src="https://github.com/user-attachments/assets/1a1fa790-71a4-4764-a791-9878be3274f1"> <img width="347" alt="image" src="https://github.com/user-attachments/assets/e22d24f2-d1a7-4303-8c41-7aac3cde9ce8"> --------- Co-authored-by: sid0-0 <a@b.com> Co-authored-by: bosiraphael <raphael.bosi@gmail.com> Co-authored-by: Félix Malfait <felix@twenty.com>
This commit is contained in:
@ -7,10 +7,14 @@ import { RGBA, TEXT_INPUT_STYLE } from 'twenty-ui';
|
||||
import { useRegisterInputEvents } from '@/object-record/record-field/meta-types/input/hooks/useRegisterInputEvents';
|
||||
import { useCombinedRefs } from '~/hooks/useCombinedRefs';
|
||||
|
||||
const StyledInput = styled.input<{ withRightComponent?: boolean }>`
|
||||
const StyledInput = styled.input<{
|
||||
withRightComponent?: boolean;
|
||||
hasError?: boolean;
|
||||
}>`
|
||||
${TEXT_INPUT_STYLE}
|
||||
|
||||
border: 1px solid ${({ theme }) => theme.border.color.medium};
|
||||
border: 1px solid ${({ theme, hasError }) =>
|
||||
hasError ? theme.border.color.danger : theme.border.color.medium};
|
||||
border-radius: ${({ theme }) => theme.border.radius.sm};
|
||||
box-sizing: border-box;
|
||||
font-weight: ${({ theme }) => theme.font.weight.medium};
|
||||
@ -19,8 +23,10 @@ const StyledInput = styled.input<{ withRightComponent?: boolean }>`
|
||||
width: 100%;
|
||||
|
||||
&:focus {
|
||||
border-color: ${({ theme }) => theme.color.blue};
|
||||
box-shadow: 0px 0px 0px 3px ${({ theme }) => RGBA(theme.color.blue, 0.1)};
|
||||
${({ theme, hasError = false }) => {
|
||||
if (hasError) return '';
|
||||
return `box-shadow: 0px 0px 0px 3px ${RGBA(theme.color.blue, 0.1)}`;
|
||||
}};
|
||||
}
|
||||
|
||||
${({ withRightComponent }) =>
|
||||
@ -44,6 +50,12 @@ const StyledRightContainer = styled.div`
|
||||
transform: translateY(-50%);
|
||||
`;
|
||||
|
||||
const StyledErrorDiv = styled.div`
|
||||
color: ${({ theme }) => theme.color.red};
|
||||
padding: 0 ${({ theme }) => theme.spacing(2)}
|
||||
${({ theme }) => theme.spacing(1)};
|
||||
`;
|
||||
|
||||
type HTMLInputProps = InputHTMLAttributes<HTMLInputElement>;
|
||||
|
||||
export type DropdownMenuInputProps = HTMLInputProps & {
|
||||
@ -60,6 +72,8 @@ export type DropdownMenuInputProps = HTMLInputProps & {
|
||||
autoFocus: HTMLInputProps['autoFocus'];
|
||||
placeholder: HTMLInputProps['placeholder'];
|
||||
}) => React.ReactNode;
|
||||
error?: string | null;
|
||||
hasError?: boolean;
|
||||
};
|
||||
|
||||
export const DropdownMenuInput = forwardRef<
|
||||
@ -81,6 +95,8 @@ export const DropdownMenuInput = forwardRef<
|
||||
onTab,
|
||||
rightComponent,
|
||||
renderInput,
|
||||
error = '',
|
||||
hasError = false,
|
||||
},
|
||||
ref,
|
||||
) => {
|
||||
@ -99,28 +115,32 @@ export const DropdownMenuInput = forwardRef<
|
||||
});
|
||||
|
||||
return (
|
||||
<StyledInputContainer className={className}>
|
||||
{renderInput ? (
|
||||
renderInput({
|
||||
value,
|
||||
onChange,
|
||||
autoFocus,
|
||||
placeholder,
|
||||
})
|
||||
) : (
|
||||
<StyledInput
|
||||
autoFocus={autoFocus}
|
||||
value={value}
|
||||
placeholder={placeholder}
|
||||
onChange={onChange}
|
||||
ref={combinedRef}
|
||||
withRightComponent={!!rightComponent}
|
||||
/>
|
||||
)}
|
||||
{!!rightComponent && (
|
||||
<StyledRightContainer>{rightComponent}</StyledRightContainer>
|
||||
)}
|
||||
</StyledInputContainer>
|
||||
<>
|
||||
<StyledInputContainer className={className}>
|
||||
{renderInput ? (
|
||||
renderInput({
|
||||
value,
|
||||
onChange,
|
||||
autoFocus,
|
||||
placeholder,
|
||||
})
|
||||
) : (
|
||||
<StyledInput
|
||||
hasError={hasError}
|
||||
autoFocus={autoFocus}
|
||||
value={value}
|
||||
placeholder={placeholder}
|
||||
onChange={onChange}
|
||||
ref={combinedRef}
|
||||
withRightComponent={!!rightComponent}
|
||||
/>
|
||||
)}
|
||||
{!!rightComponent && (
|
||||
<StyledRightContainer>{rightComponent}</StyledRightContainer>
|
||||
)}
|
||||
</StyledInputContainer>
|
||||
{error && <StyledErrorDiv>{error}</StyledErrorDiv>}
|
||||
</>
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user