feat: add FileUploaderField and TextAreaField components; enhance BaseField to support file inputs
parent
55f4177b01
commit
cf73faf174
@ -0,0 +1,40 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import { useFieldContext } from '../..'
|
||||||
|
import type { LabelProps } from '../label'
|
||||||
|
import Label from '../label'
|
||||||
|
import cn from '@/utils/classnames'
|
||||||
|
import type { FileUploaderInAttachmentWrapperProps } from '../../../file-uploader/file-uploader-in-attachment'
|
||||||
|
import FileUploaderInAttachmentWrapper from '../../../file-uploader/file-uploader-in-attachment'
|
||||||
|
import type { FileEntity } from '../../../file-uploader/types'
|
||||||
|
|
||||||
|
type FileUploaderFieldProps = {
|
||||||
|
label: string
|
||||||
|
labelOptions?: Omit<LabelProps, 'htmlFor' | 'label'>
|
||||||
|
className?: string
|
||||||
|
} & Omit<FileUploaderInAttachmentWrapperProps, 'value' | 'onChange'>
|
||||||
|
|
||||||
|
const FileUploaderField = ({
|
||||||
|
label,
|
||||||
|
labelOptions,
|
||||||
|
className,
|
||||||
|
...inputProps
|
||||||
|
}: FileUploaderFieldProps) => {
|
||||||
|
const field = useFieldContext<FileEntity[]>()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={cn('flex flex-col gap-y-0.5', className)}>
|
||||||
|
<Label
|
||||||
|
htmlFor={field.name}
|
||||||
|
label={label}
|
||||||
|
{...(labelOptions ?? {})}
|
||||||
|
/>
|
||||||
|
<FileUploaderInAttachmentWrapper
|
||||||
|
value={field.state.value}
|
||||||
|
onChange={value => field.handleChange(value)}
|
||||||
|
{...inputProps}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FileUploaderField
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import { useFieldContext } from '../..'
|
||||||
|
import type { LabelProps } from '../label'
|
||||||
|
import Label from '../label'
|
||||||
|
import cn from '@/utils/classnames'
|
||||||
|
import type { TextareaProps } from '../../../textarea'
|
||||||
|
import Textarea from '../../../textarea'
|
||||||
|
|
||||||
|
type TextAreaFieldProps = {
|
||||||
|
label: string
|
||||||
|
labelOptions?: Omit<LabelProps, 'htmlFor' | 'label'>
|
||||||
|
className?: string
|
||||||
|
} & Omit<TextareaProps, 'className' | 'onChange' | 'onBlur' | 'value' | 'id'>
|
||||||
|
|
||||||
|
const TextAreaField = ({
|
||||||
|
label,
|
||||||
|
labelOptions,
|
||||||
|
className,
|
||||||
|
...inputProps
|
||||||
|
}: TextAreaFieldProps) => {
|
||||||
|
const field = useFieldContext<string>()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={cn('flex flex-col gap-y-0.5', className)}>
|
||||||
|
<Label
|
||||||
|
htmlFor={field.name}
|
||||||
|
label={label}
|
||||||
|
{...(labelOptions ?? {})}
|
||||||
|
/>
|
||||||
|
<Textarea
|
||||||
|
id={field.name}
|
||||||
|
value={field.state.value}
|
||||||
|
onChange={e => field.handleChange(e.target.value)}
|
||||||
|
onBlur={field.handleBlur}
|
||||||
|
{...inputProps}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default TextAreaField
|
||||||
Loading…
Reference in New Issue