e-mail and phone validation in group-subheader component

This commit is contained in:
Anton Tranelis 2024-11-22 13:27:15 +01:00
parent 594784e77a
commit 1923e180d4
4 changed files with 62 additions and 48 deletions

View File

@ -13,6 +13,8 @@ type InputTextProps = {
defaultValue?: string defaultValue?: string
placeholder?: string placeholder?: string
autocomplete?: string autocomplete?: string
pattern?: string
required?: boolean
updateFormValue?: (value: string) => void updateFormValue?: (value: string) => void
} }
@ -26,6 +28,8 @@ export function TextInput({
defaultValue, defaultValue,
placeholder, placeholder,
autocomplete, autocomplete,
pattern,
required = true,
updateFormValue, updateFormValue,
}: InputTextProps) { }: InputTextProps) {
const [inputValue, setInputValue] = useState<string>(defaultValue || '') const [inputValue, setInputValue] = useState<string>(defaultValue || '')
@ -50,7 +54,8 @@ export function TextInput({
</label> </label>
) : null} ) : null}
<input <input
required required={required}
pattern={pattern}
type={type || 'text'} type={type || 'text'}
name={dataField} name={dataField}
value={inputValue} value={inputValue}

View File

@ -1,4 +1,3 @@
/* eslint-disable @typescript-eslint/no-misused-promises */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-call */ /* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/restrict-template-expressions */ /* eslint-disable @typescript-eslint/restrict-template-expressions */
@ -148,58 +147,63 @@ export function ProfileForm() {
backdrop backdrop
className='tw-mx-4 tw-mt-4 tw-mb-4 tw-overflow-x-hidden tw-w-[calc(100%-32px)] md:tw-w-[calc(50%-32px)] tw-max-w-3xl !tw-left-auto tw-top-0 tw-bottom-0' className='tw-mx-4 tw-mt-4 tw-mb-4 tw-overflow-x-hidden tw-w-[calc(100%-32px)] md:tw-w-[calc(50%-32px)] tw-max-w-3xl !tw-left-auto tw-top-0 tw-bottom-0'
> >
<div className='tw-flex tw-flex-col tw-h-full'> <form
<FormHeader item={item} state={state} setState={setState} /> onSubmit={(e) => {
e.preventDefault()
void onUpdateItem(
state,
item,
tags,
addTag,
setLoading,
navigate,
updateItem,
addItem,
user,
urlParams,
)
}}
>
<div className='tw-flex tw-flex-col tw-h-full'>
<FormHeader item={item} state={state} setState={setState} />
{template === 'onepager' && ( {template === 'onepager' && (
<OnepagerForm item={item} state={state} setState={setState}></OnepagerForm> <OnepagerForm item={item} state={state} setState={setState}></OnepagerForm>
)} )}
{template === 'simple' && <SimpleForm state={state} setState={setState}></SimpleForm>} {template === 'simple' && <SimpleForm state={state} setState={setState}></SimpleForm>}
{template === 'flex' && ( {template === 'flex' && (
<FlexForm item={item} state={state} setState={setState}></FlexForm> <FlexForm item={item} state={state} setState={setState}></FlexForm>
)} )}
{template === 'tabs' && ( {template === 'tabs' && (
<TabsForm <TabsForm
loading={loading} loading={loading}
item={item} item={item}
state={state} state={state}
setState={setState} setState={setState}
updatePermission={updatePermission} updatePermission={updatePermission}
linkItem={(id) => linkItem(id, item, updateItem)} linkItem={(id) => linkItem(id, item, updateItem)}
unlinkItem={(id) => unlinkItem(id, item, updateItem)} unlinkItem={(id) => unlinkItem(id, item, updateItem)}
setUrlParams={setUrlParams} setUrlParams={setUrlParams}
></TabsForm> ></TabsForm>
)} )}
<div className='tw-mt-4'> <div className='tw-mt-4'>
<button <button
className={loading ? ' tw-loading tw-btn tw-float-right' : 'tw-btn tw-float-right'} className={loading ? ' tw-loading tw-btn tw-float-right' : 'tw-btn tw-float-right'}
onClick={() => type='submit'
onUpdateItem( style={{
state, backgroundColor: `${item.layer?.itemColorField && getValue(item, item.layer?.itemColorField) ? getValue(item, item.layer?.itemColorField) : getItemTags(item) && getItemTags(item)[0] && getItemTags(item)[0].color ? getItemTags(item)[0].color : item?.layer?.markerDefaultColor}`,
item, color: '#fff',
tags, }}
addTag, >
setLoading, Update
navigate, </button>
updateItem, </div>
addItem,
user,
urlParams,
)
}
style={{
backgroundColor: `${item.layer?.itemColorField && getValue(item, item.layer?.itemColorField) ? getValue(item, item.layer?.itemColorField) : getItemTags(item) && getItemTags(item)[0] && getItemTags(item)[0].color ? getItemTags(item)[0].color : item?.layer?.markerDefaultColor}`,
color: '#fff',
}}
>
Update
</button>
</div> </div>
</div> </form>
</MapOverlayPage> </MapOverlayPage>
</> </>
) )

View File

@ -22,6 +22,7 @@ export const ContactInfoForm = ({
<TextInput <TextInput
placeholder='Email' placeholder='Email'
type='email' type='email'
required={false}
defaultValue={state.contact} defaultValue={state.contact}
updateFormValue={(v) => updateFormValue={(v) =>
setState((prevState) => ({ setState((prevState) => ({
@ -41,6 +42,9 @@ export const ContactInfoForm = ({
</label> </label>
<TextInput <TextInput
placeholder='Telefonnummer' placeholder='Telefonnummer'
type='tel'
required={false}
pattern='^\+?[0-9\s\-]{7,15}$'
defaultValue={state.telephone} defaultValue={state.telephone}
updateFormValue={(v) => updateFormValue={(v) =>
setState((prevState) => ({ setState((prevState) => ({

View File

@ -44,6 +44,7 @@ export const FormHeader = ({ item, state, setState }) => {
/> />
<TextInput <TextInput
placeholder='Subtitle' placeholder='Subtitle'
required={false}
defaultValue={item?.subname ? item.subname : ''} defaultValue={item?.subname ? item.subname : ''}
updateFormValue={(v) => updateFormValue={(v) =>
setState((prevState) => ({ setState((prevState) => ({