Form prototype
This commit is contained in:
117
src/Form/components/FormSection.tsx
Normal file
117
src/Form/components/FormSection.tsx
Normal file
@@ -0,0 +1,117 @@
|
||||
import React, { type ReactNode } from 'react'
|
||||
import { Stack, Group, Paper, Button, Title, Box } from '@mantine/core'
|
||||
import { useFormLayoutStore } from '../store/FormLayout.store'
|
||||
|
||||
interface FormSectionProps {
|
||||
type: 'header' | 'body' | 'footer' | 'error'
|
||||
title?: string
|
||||
rightSection?: ReactNode
|
||||
children?: ReactNode
|
||||
buttonTitles?: { submit?: string; cancel?: string }
|
||||
className?: string
|
||||
[key: string]: any
|
||||
}
|
||||
|
||||
export const FormSection: React.FC<FormSectionProps> = ({
|
||||
type,
|
||||
title,
|
||||
rightSection,
|
||||
children,
|
||||
buttonTitles,
|
||||
className,
|
||||
...others
|
||||
}) => {
|
||||
const { onCancel, onSubmit, request, loading } = useFormLayoutStore((state) => ({
|
||||
onCancel: state.onCancel,
|
||||
onSubmit: state.onSubmit,
|
||||
request: state.request,
|
||||
loading: state.loading,
|
||||
}))
|
||||
|
||||
if (type === 'header') {
|
||||
return (
|
||||
<Group
|
||||
justify="space-between"
|
||||
p="md"
|
||||
style={{
|
||||
borderBottom: '1px solid var(--mantine-color-gray-3)',
|
||||
}}
|
||||
className={className}
|
||||
{...others}
|
||||
>
|
||||
<Title order={4} size="h5">
|
||||
{title}
|
||||
</Title>
|
||||
{rightSection && <Box>{rightSection}</Box>}
|
||||
</Group>
|
||||
)
|
||||
}
|
||||
|
||||
if (type === 'body') {
|
||||
return (
|
||||
<Stack
|
||||
gap="md"
|
||||
p="md"
|
||||
style={{ flex: 1, overflow: 'auto' }}
|
||||
className={className}
|
||||
{...others}
|
||||
>
|
||||
{children}
|
||||
</Stack>
|
||||
)
|
||||
}
|
||||
|
||||
if (type === 'footer') {
|
||||
return (
|
||||
<Group
|
||||
justify="flex-end"
|
||||
gap="xs"
|
||||
p="md"
|
||||
style={{
|
||||
borderTop: '1px solid var(--mantine-color-gray-3)',
|
||||
}}
|
||||
className={className}
|
||||
{...others}
|
||||
>
|
||||
{children}
|
||||
{request !== 'view' && (
|
||||
<>
|
||||
<Button
|
||||
variant="default"
|
||||
onClick={onCancel}
|
||||
disabled={loading}
|
||||
>
|
||||
{buttonTitles?.cancel ?? 'Cancel'}
|
||||
</Button>
|
||||
<Button
|
||||
type="submit"
|
||||
onClick={onSubmit}
|
||||
loading={loading}
|
||||
>
|
||||
{buttonTitles?.submit ?? (request === 'delete' ? 'Delete' : 'Save')}
|
||||
</Button>
|
||||
</>
|
||||
)}
|
||||
</Group>
|
||||
)
|
||||
}
|
||||
|
||||
if (type === 'error') {
|
||||
return (
|
||||
<Paper
|
||||
p="sm"
|
||||
m="md"
|
||||
style={{
|
||||
backgroundColor: 'var(--mantine-color-red-0)',
|
||||
border: '1px solid var(--mantine-color-red-3)',
|
||||
}}
|
||||
className={className}
|
||||
{...others}
|
||||
>
|
||||
{children}
|
||||
</Paper>
|
||||
)
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
Reference in New Issue
Block a user