@@ -300,33 +300,52 @@ const convertValRhs = (val, fieldConfig, widget, config, meta) => {
300300 return undefined ;
301301 }
302302
303- // number of seconds -> time string
304- if ( fieldType === "time" && typeof val === "number" ) {
305- const [ h , m , s ] = [ Math . floor ( val / 60 / 60 ) % 24 , Math . floor ( val / 60 ) % 60 , val % 60 ] ;
306- const valueFormat = widgetConfig . valueFormat ;
307- if ( valueFormat ) {
308- const dateVal = new Date ( val ) ;
309- dateVal . setMilliseconds ( 0 ) ;
310- dateVal . setHours ( h ) ;
311- dateVal . setMinutes ( m ) ;
312- dateVal . setSeconds ( s ) ;
313- val = moment ( dateVal ) . format ( valueFormat ) ;
314- } else {
315- val = `${ h } :${ m } :${ s } ` ;
316- }
317- }
318303
319- // "2020-01-08T22:00:00.000Z" -> Date object
320- if ( [ "date" , "datetime" ] . includes ( fieldType ) && val && ! ( val instanceof Date ) ) {
304+ if ( widgetConfig ?. jsonLogicImport ) {
321305 try {
322- const dateVal = new Date ( val ) ;
323- if ( dateVal instanceof Date && dateVal . toISOString ( ) === val ) {
324- val = dateVal ;
325- }
306+ val = widgetConfig . jsonLogicImport . call (
307+ config . ctx , val ,
308+ { ... widgetConfig , ... ( fieldConfig ?. fieldSettings ?? { } ) }
309+ ) ;
326310 } catch ( e ) {
327- meta . errors . push ( `Can't convert value ${ val } as Date ` ) ;
311+ meta . errors . push ( `Can't import value ${ val } using import func of widget ${ widget } : ${ e ?. message ?? e } ` ) ;
328312 val = undefined ;
329313 }
314+ } else {
315+ // number of seconds -> time string
316+ if ( fieldType === "time" && typeof val === "number" ) {
317+ const [ h , m , s ] = [ Math . floor ( val / 60 / 60 ) % 24 , Math . floor ( val / 60 ) % 60 , val % 60 ] ;
318+ const valueFormat = widgetConfig . valueFormat ;
319+ if ( valueFormat ) {
320+ const dateVal = new Date ( val ) ;
321+ dateVal . setMilliseconds ( 0 ) ;
322+ dateVal . setHours ( h ) ;
323+ dateVal . setMinutes ( m ) ;
324+ dateVal . setSeconds ( s ) ;
325+ val = moment ( dateVal ) . format ( valueFormat ) ;
326+ } else {
327+ val = `${ h } :${ m } :${ s } ` ;
328+ }
329+ }
330+
331+ // "2020-01-08T22:00:00.000Z" -> Date object
332+ if ( [ "date" , "datetime" ] . includes ( fieldType ) && val && ! ( val instanceof Date ) ) {
333+ try {
334+ const isEpoch = typeof val === "number" || typeof val === "string" && ! isNaN ( val ) ;
335+ // Note: can import only from ms timestamp, not seconds timestamp
336+ const epoch = isEpoch && typeof val === "string" ? parseInt ( val ) : val ;
337+ const dateVal = new Date ( isEpoch ? epoch : val ) ;
338+ if ( dateVal instanceof Date ) {
339+ val = dateVal ;
340+ }
341+ if ( isNaN ( dateVal ) ) {
342+ throw new Error ( "Invalid date" ) ;
343+ }
344+ } catch ( e ) {
345+ meta . errors . push ( `Can't convert value ${ val } as Date` ) ;
346+ val = undefined ;
347+ }
348+ }
330349 }
331350
332351 // Date object -> formatted string
@@ -343,15 +362,6 @@ const convertValRhs = (val, fieldConfig, widget, config, meta) => {
343362 asyncListValues = vals ;
344363 }
345364
346- if ( widgetConfig ?. jsonLogicImport ) {
347- try {
348- val = widgetConfig . jsonLogicImport . call ( config . ctx , val ) ;
349- } catch ( e ) {
350- meta . errors . push ( `Can't import value ${ val } using import func of widget ${ widget } : ${ e ?. message ?? e } ` ) ;
351- val = undefined ;
352- }
353- }
354-
355365 return {
356366 valueSrc : "value" ,
357367 value : val ,
0 commit comments