Add components for textareas and text limited fields
This commit is contained in:
parent
fe14c38fd9
commit
f9857eb772
4 changed files with 121 additions and 0 deletions
29
components/CharLimitedFieldset/index.scss
Normal file
29
components/CharLimitedFieldset/index.scss
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
.Limited {
|
||||||
|
background: white;
|
||||||
|
border-radius: 6px;
|
||||||
|
border: 2px solid transparent;
|
||||||
|
box-sizing: border-box;
|
||||||
|
display: flex;
|
||||||
|
gap: $unit;
|
||||||
|
padding-right: $unit * 2;
|
||||||
|
|
||||||
|
&:focus-within {
|
||||||
|
border: 2px solid #275DC5;
|
||||||
|
box-shadow: 0 2px rgba(255, 255, 255, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.Counter {
|
||||||
|
color: $grey-50;
|
||||||
|
font-weight: $bold;
|
||||||
|
line-height: 42px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.Input {
|
||||||
|
background: transparent;
|
||||||
|
border-radius: 0;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
54
components/CharLimitedFieldset/index.tsx
Normal file
54
components/CharLimitedFieldset/index.tsx
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
import React, { useEffect, useState } from 'react'
|
||||||
|
import './index.scss'
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
fieldName: string
|
||||||
|
placeholder: string
|
||||||
|
value?: string
|
||||||
|
limit: number
|
||||||
|
error: string
|
||||||
|
onBlur?: (event: React.ChangeEvent<HTMLInputElement>) => void
|
||||||
|
onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
const CharLimitedFieldset = React.forwardRef<HTMLInputElement, Props>(function fieldSet(props, ref) {
|
||||||
|
const fieldType = (['password', 'confirm_password'].includes(props.fieldName)) ? 'password' : 'text'
|
||||||
|
|
||||||
|
const [currentCount, setCurrentCount] = useState(0)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setCurrentCount((props.value) ? props.limit - props.value.length : props.limit)
|
||||||
|
}, [props.limit, props.value])
|
||||||
|
|
||||||
|
function onChange(event: React.ChangeEvent<HTMLInputElement>) {
|
||||||
|
setCurrentCount(props.limit - event.currentTarget.value.length)
|
||||||
|
if (props.onChange) props.onChange(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<fieldset className="Fieldset">
|
||||||
|
<div className="Limited">
|
||||||
|
<input
|
||||||
|
autoComplete="off"
|
||||||
|
className="Input"
|
||||||
|
type={fieldType}
|
||||||
|
name={props.fieldName}
|
||||||
|
placeholder={props.placeholder}
|
||||||
|
defaultValue={props.value || ''}
|
||||||
|
onBlur={props.onBlur}
|
||||||
|
onChange={onChange}
|
||||||
|
maxLength={props.limit}
|
||||||
|
ref={ref}
|
||||||
|
formNoValidate
|
||||||
|
/>
|
||||||
|
<span className="Counter">{currentCount}</span>
|
||||||
|
</div>
|
||||||
|
{
|
||||||
|
props.error.length > 0 &&
|
||||||
|
<p className='InputError'>{props.error}</p>
|
||||||
|
}
|
||||||
|
</fieldset>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
export default CharLimitedFieldset
|
||||||
5
components/TextFieldset/index.scss
Normal file
5
components/TextFieldset/index.scss
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
.Fieldset textarea {
|
||||||
|
color: $grey-00;
|
||||||
|
font-family: system-ui, -apple-system, 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||||
|
line-height: 21px;
|
||||||
|
}
|
||||||
33
components/TextFieldset/index.tsx
Normal file
33
components/TextFieldset/index.tsx
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
import React from 'react'
|
||||||
|
import './index.scss'
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
fieldName: string
|
||||||
|
placeholder: string
|
||||||
|
value?: string
|
||||||
|
error: string
|
||||||
|
onBlur?: (event: React.ChangeEvent<HTMLTextAreaElement>) => void
|
||||||
|
onChange?: (event: React.ChangeEvent<HTMLTextAreaElement>) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
const TextFieldset = React.forwardRef<HTMLTextAreaElement, Props>(function fieldSet(props, ref) {
|
||||||
|
return (
|
||||||
|
<fieldset className="Fieldset">
|
||||||
|
<textarea
|
||||||
|
className="Input"
|
||||||
|
name={props.fieldName}
|
||||||
|
placeholder={props.placeholder}
|
||||||
|
defaultValue={props.value || ''}
|
||||||
|
onBlur={props.onBlur}
|
||||||
|
onChange={props.onChange}
|
||||||
|
ref={ref}
|
||||||
|
/>
|
||||||
|
{
|
||||||
|
props.error.length > 0 &&
|
||||||
|
<p className='InputError'>{props.error}</p>
|
||||||
|
}
|
||||||
|
</fieldset>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
export default TextFieldset
|
||||||
Loading…
Reference in a new issue