@@ -11,14 +11,22 @@ import {
1111 ChipModalField ,
1212 ChipModalFooter ,
1313 ChipModalHeader ,
14+ ChipTimePicker ,
1415 Label ,
1516} from '@sim/emcn'
1617import { createLogger } from '@sim/logger'
1718import { getErrorMessage } from '@sim/utils/errors'
1819import { useParams } from 'next/navigation'
1920import type { ColumnDefinition , TableInfo , TableRow } from '@/lib/table'
21+ import { useTimezone } from '@/hooks/queries/general-settings'
2022import { useDeleteTableRow , useDeleteTableRows , useUpdateTableRow } from '@/hooks/queries/tables'
21- import { cleanCellValue , formatValueForInput } from '../../utils'
23+ import {
24+ cleanCellValue ,
25+ dateValueToLocalParts ,
26+ formatValueForInput ,
27+ localPartsToDateValue ,
28+ todayLocalCalendarDate ,
29+ } from '../../utils'
2230
2331const logger = createLogger ( 'RowModal' )
2432
@@ -34,14 +42,15 @@ export interface RowModalProps {
3442
3543function cleanRowData (
3644 columns : ColumnDefinition [ ] ,
37- rowData : Record < string , unknown >
45+ rowData : Record < string , unknown > ,
46+ timeZone : string
3847) : Record < string , unknown > {
3948 const cleanData : Record < string , unknown > = { }
4049
4150 columns . forEach ( ( col ) => {
4251 const value = rowData [ col . name ]
4352 try {
44- cleanData [ col . name ] = cleanCellValue ( value , col )
53+ cleanData [ col . name ] = cleanCellValue ( value , col , timeZone )
4554 } catch {
4655 throw new Error ( `Invalid JSON for field: ${ col . name } ` )
4756 }
@@ -66,6 +75,7 @@ export function RowModal({ mode, isOpen, onClose, table, row, rowIds, onSuccess
6675 const schema = table ?. schema
6776 const columns = schema ?. columns || [ ]
6877
78+ const timeZone = useTimezone ( )
6979 const [ rowData , setRowData ] = useState < Record < string , unknown > > ( ( ) =>
7080 mode === 'edit' && row ? row . data : { }
7181 )
@@ -81,7 +91,7 @@ export function RowModal({ mode, isOpen, onClose, table, row, rowIds, onSuccess
8191 setError ( null )
8292
8393 try {
84- const cleanData = cleanRowData ( columns , rowData )
94+ const cleanData = cleanRowData ( columns , rowData , timeZone )
8595
8696 if ( row ) {
8797 await updateRowMutation . mutateAsync ( { rowId : row . id , data : cleanData } )
@@ -189,6 +199,7 @@ interface ColumnFieldProps {
189199
190200function ColumnField ( { column, value, onChange } : ColumnFieldProps ) {
191201 const checkboxId = useId ( )
202+ const timeZone = useTimezone ( )
192203 const title = (
193204 < >
194205 { column . name }
@@ -236,14 +247,30 @@ function ColumnField({ column, value, onChange }: ColumnFieldProps) {
236247 }
237248
238249 if ( column . type === 'date' ) {
250+ const parts = dateValueToLocalParts ( formatValueForInput ( value , 'date' ) )
239251 return (
240252 < ChipModalField type = 'custom' title = { title } required = { column . required } hint = { hint } >
241- < ChipDatePicker
242- value = { formatValueForInput ( value , column . type ) || undefined }
243- onChange = { onChange }
244- placeholder = 'Select date'
245- fullWidth
246- />
253+ < div className = 'flex items-center gap-2' >
254+ < ChipDatePicker
255+ value = { parts . day ?? undefined }
256+ today = { todayLocalCalendarDate ( timeZone ) }
257+ onChange = { ( day ) => onChange ( localPartsToDateValue ( day , parts . time , timeZone ) ) }
258+ placeholder = 'Select date'
259+ flush
260+ className = 'flex-1'
261+ />
262+ < ChipTimePicker
263+ value = { parts . time ?. slice ( 0 , 5 ) }
264+ onChange = { ( time ) =>
265+ onChange (
266+ localPartsToDateValue ( parts . day ?? todayLocalCalendarDate ( timeZone ) , time , timeZone )
267+ )
268+ }
269+ placeholder = 'Add time'
270+ flush
271+ className = 'w-[110px]'
272+ />
273+ </ div >
247274 </ ChipModalField >
248275 )
249276 }
0 commit comments