@@ -23,8 +23,11 @@ import {
23
23
Chip ,
24
24
Space ,
25
25
Stack ,
26
+ InputError ,
27
+ useMatches ,
28
+ Center ,
26
29
} from "@mantine/core" ;
27
- import { DateTimePicker } from "@mantine/dates" ;
30
+ import { DatePicker , DateTimePicker } from "@mantine/dates" ;
28
31
import { useMembers } from "@/components/FormFieldPreloadedData" ;
29
32
import { getUserName } from "@/components/UserHelpers" ;
30
33
import dayjs from "dayjs" ;
@@ -119,6 +122,78 @@ export function DatePickerField(props: {
119
122
) ;
120
123
}
121
124
125
+ export function MultiDatePickerField ( props : {
126
+ name : string ;
127
+ defaultValue ?: Date [ ] | string [ ] ;
128
+ label : string ;
129
+ required ?: boolean ;
130
+ } ) {
131
+ const heh = useMatches ( {
132
+ xs : false ,
133
+ sm : true ,
134
+ } ) ;
135
+
136
+ const controller = useController ( {
137
+ name : props . name ,
138
+ defaultValue : props . defaultValue
139
+ ? ( ( ) => {
140
+ if (
141
+ Array . isArray ( props . defaultValue ) &&
142
+ props . defaultValue . length > 0
143
+ ) {
144
+ if ( props . defaultValue . at ( 0 ) instanceof Date )
145
+ return ( props . defaultValue as Date [ ] ) . map ( ( v : Date ) => {
146
+ const date = dayjs ( v ) ;
147
+ return date
148
+ . add ( date . utcOffset ( ) , "minutes" )
149
+ . format ( "YYYY-MM-DD" ) ;
150
+ } ) ;
151
+ return props . defaultValue ;
152
+ }
153
+ } ) ( )
154
+ : undefined ,
155
+ } ) ;
156
+ const dv = useMemo ( ( ) => {
157
+ if ( ! controller . field . value ) {
158
+ return [ ] ;
159
+ }
160
+ try {
161
+ return controller . field . value . map ( ( v : string ) => {
162
+ const date = dayjs ( v ) ;
163
+ return date . add ( date . utcOffset ( ) , "minutes" ) . toDate ( ) ;
164
+ } ) ;
165
+ // return new Date(controller.field.value);
166
+ } catch ( e ) {
167
+ return [ ] ;
168
+ }
169
+ } , [ controller . field . value ] ) ;
170
+ return (
171
+ < Stack >
172
+ < InputLabel required = { props . required } > { props . label } </ InputLabel >
173
+ < Center >
174
+ < DatePicker
175
+ type = "multiple"
176
+ value = { dv }
177
+ onChange = { ( v ) =>
178
+ controller . field . onChange (
179
+ v ?. map ( ( v ) => {
180
+ const date = dayjs ( v ) ;
181
+ return date
182
+ . add ( date . utcOffset ( ) , "minutes" )
183
+ . set ( "hour" , 0 )
184
+ . set ( "minute" , 0 )
185
+ . format ( "YYYY-MM-DD" ) ;
186
+ } ) ,
187
+ )
188
+ }
189
+ numberOfColumns = { heh ? 2 : 1 }
190
+ />
191
+ </ Center >
192
+ < InputError > { controller . fieldState . error ?. message as string } </ InputError >
193
+ </ Stack >
194
+ ) ;
195
+ }
196
+
122
197
export function CheckBoxField ( props : { name : string ; label ?: string } ) {
123
198
const ctx = useFormContext ( ) ;
124
199
return < Checkbox { ...ctx . register ( props . name ) } label = { props . label } /> ;
@@ -234,7 +309,7 @@ export function SelectField<TObj extends {}>(props: {
234
309
label ?: string ;
235
310
renderOption : ( obj : TObj ) => string ;
236
311
getOptionValue : ( obj : TObj ) => string ;
237
- filter : ( obj : TObj , filter : string ) => boolean ;
312
+ filter ? : ( obj : TObj , filter : string ) => boolean ;
238
313
nullable ?: boolean ;
239
314
} ) {
240
315
const ctx = useFormContext ( ) ;
0 commit comments