11import { useEffect } from 'react' ;
2- import { Stack , TextInput as Input } from '@mantine/core' ;
3- import { useForm } from 'react-hook-form' ;
2+ import { Stack , TextInput as Input , Text , SegmentedControl , Box } from '@mantine/core' ;
3+ import { useForm , Controller } from 'react-hook-form' ;
44import { useFocusTrap } from '@mantine/hooks' ;
55
66import { Button } from '@ui/button' ;
7- import { ITemplate } from '@impler/shared' ;
7+ import { ITemplate , TemplateModeEnum } from '@impler/shared' ;
8+ import { SAMPLE_DATE_FORMATS , VARIABLES } from '@config' ;
9+ import { MultiSelect } from '@ui/multi-select' ;
10+ import { validateDateFormatString } from '@shared/utils' ;
811
912interface UpdateImportFormProps {
1013 data : ITemplate ;
1114 onSubmit : ( data : IUpdateTemplateData ) => void ;
15+ isAutoImportAvailable : boolean ;
1216}
1317
14- export function UpdateImportForm ( { onSubmit, data } : UpdateImportFormProps ) {
18+ export function UpdateImportForm ( { onSubmit, data, isAutoImportAvailable } : UpdateImportFormProps ) {
1519 const focusTrapRef = useFocusTrap ( ) ;
1620 const {
1721 reset,
22+ control,
1823 register,
1924 handleSubmit,
2025 formState : { errors } ,
@@ -23,20 +28,101 @@ export function UpdateImportForm({ onSubmit, data }: UpdateImportFormProps) {
2328 useEffect ( ( ) => {
2429 reset ( {
2530 name : data . name ,
31+ mode : data . mode || TemplateModeEnum . MANUAL ,
32+ expectedDateFormat : data . expectedDateFormat ,
2633 } ) ;
2734 } , [ data , reset ] ) ;
2835
36+ const handleFormSubmit = ( formData : IUpdateTemplateData ) => {
37+ onSubmit ( formData ) ;
38+ } ;
39+
2940 return (
30- < form onSubmit = { handleSubmit ( onSubmit ) } ref = { focusTrapRef } >
31- < Stack spacing = "sm " >
41+ < form onSubmit = { handleSubmit ( handleFormSubmit ) } ref = { focusTrapRef } >
42+ < Stack spacing = "lg " >
3243 < Input
3344 autoFocus
3445 required
46+ label = "Import Name"
3547 { ...register ( 'name' ) }
3648 error = { errors . name ?. message }
3749 placeholder = "I want to import..."
50+ description = "A descriptive name for this import"
3851 />
39- < Button type = "submit" fullWidth >
52+
53+ < Box >
54+ < Text size = "sm" weight = { 500 } mb = { 4 } >
55+ Import Mode
56+ </ Text >
57+ < Text size = "xs" color = "dimmed" mb = "xs" >
58+ Choose whether this import is triggered manually or automatically
59+ </ Text >
60+ < Controller
61+ name = "mode"
62+ control = { control }
63+ render = { ( { field } ) => (
64+ < SegmentedControl
65+ fullWidth
66+ value = { field . value || 'manual' }
67+ onChange = { field . onChange }
68+ data = { [
69+ { label : 'Manual' , value : 'manual' } ,
70+ { label : 'Automatic' , value : 'automatic' , disabled : ! isAutoImportAvailable } ,
71+ ] }
72+ />
73+ ) }
74+ />
75+ </ Box >
76+
77+ < Box >
78+ < Controller
79+ name = "expectedDateFormat"
80+ control = { control }
81+ rules = { {
82+ validate : ( value ) => {
83+ if ( ! value ) return true ;
84+
85+ const result = validateDateFormatString ( value as string ) ;
86+ if ( typeof result === 'object' && 'isValid' in result ) {
87+ return result . isValid ? true : result . error || 'Invalid date format' ;
88+ }
89+
90+ return result === true ? true : ( result as string ) ;
91+ } ,
92+ } }
93+ render = { ( { field, fieldState } ) => (
94+ < MultiSelect
95+ creatable
96+ maxSelectedValues = { VARIABLES . ONE }
97+ clearable
98+ searchable
99+ label = "Date Formats"
100+ placeholder = "Date Formats"
101+ description = "Define the date format you expect in your import data."
102+ data = { [
103+ ...SAMPLE_DATE_FORMATS ,
104+ ...( field . value && ! SAMPLE_DATE_FORMATS . includes ( field . value ) ? [ field . value ] : [ ] ) ,
105+ ] }
106+ getCreateLabel = { ( query ) => `Add "${ query } "` }
107+ onCreate = { ( newItem ) => {
108+ field . onChange ( newItem ) ;
109+
110+ return newItem ;
111+ } }
112+ onChange = { ( value ) => {
113+ field . onChange ( value [ 0 ] ) ;
114+ } }
115+ error = { fieldState . error ?. message }
116+ value = { field . value ? [ field . value ] : [ ] }
117+ />
118+ ) }
119+ />
120+ < Text size = "xs" color = "dimmed" mt = "xs" >
121+ Example formats: DD/MM/YYYY, MM/DD/YYYY, YYYY-MM-DD, DD-MMM-YYYY
122+ </ Text >
123+ </ Box >
124+
125+ < Button type = "submit" fullWidth mt = "md" >
40126 Update
41127 </ Button >
42128 </ Stack >
0 commit comments