Skip to content

Commit 94465de

Browse files
committed
Better handling of invalid dates
1 parent 5ae96ea commit 94465de

File tree

5 files changed

+48
-23
lines changed

5 files changed

+48
-23
lines changed

packages/dataviews/src/components/dataviews-filters/filter.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import type {
6262
View,
6363
} from '../../types';
6464
import useElements from '../../hooks/use-elements';
65+
import parseDateTime from '../../field-types/utils/parse-date-time';
6566

6667
interface FilterTextProps {
6768
activeElements: Option[];
@@ -499,7 +500,10 @@ export default function Filter( {
499500

500501
if ( field?.type === 'datetime' && typeof label === 'string' ) {
501502
try {
502-
label = new Date( label ).toLocaleString();
503+
const dateValue = parseDateTime( label );
504+
if ( dateValue !== null ) {
505+
label = dateValue.toLocaleString();
506+
}
503507
} catch ( e ) {
504508
label = filterInView.value;
505509
}

packages/dataviews/src/dataform-controls/datetime.tsx

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
22
* External dependencies
33
*/
4-
import { format, isValid as isValidDate } from 'date-fns';
4+
import { format } from 'date-fns';
55

66
/**
77
* WordPress dependencies
@@ -13,7 +13,7 @@ import {
1313
} from '@wordpress/components';
1414
import { useCallback, useEffect, useRef, useState } from '@wordpress/element';
1515
import { __ } from '@wordpress/i18n';
16-
import { getDate, getSettings } from '@wordpress/date';
16+
import { getSettings } from '@wordpress/date';
1717

1818
/**
1919
* Internal dependencies
@@ -22,18 +22,11 @@ import type { DataFormControlProps } from '../types';
2222
import { OPERATOR_IN_THE_PAST, OPERATOR_OVER } from '../constants';
2323
import RelativeDateControl from './utils/relative-date-control';
2424
import getCustomValidity from './utils/get-custom-validity';
25+
import parseDateTime from '../field-types/utils/parse-date-time';
2526
import { unlock } from '../lock-unlock';
2627

2728
const { DateCalendar, ValidatedInputControl } = unlock( componentsPrivateApis );
2829

29-
const parseDateTime = ( dateTimeString?: string ): Date | null => {
30-
if ( ! dateTimeString ) {
31-
return null;
32-
}
33-
const parsed = getDate( dateTimeString );
34-
return parsed && isValidDate( parsed ) ? parsed : null;
35-
};
36-
3730
const formatDateTime = ( date?: Date | string ): string => {
3831
if ( ! date ) {
3932
return '';

packages/dataviews/src/field-types/datetime.tsx

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type {
77
FieldTypeDefinition,
88
} from '../types';
99
import RenderFromElements from './utils/render-from-elements';
10+
import parseDateTime from './utils/parse-date-time';
1011
import {
1112
OPERATOR_ON,
1213
OPERATOR_NOT_ON,
@@ -33,11 +34,21 @@ export default {
3334
},
3435
Edit: 'datetime',
3536
render: ( { item, field }: DataViewRenderFieldProps< any > ) => {
36-
return field.hasElements ? (
37-
<RenderFromElements item={ item } field={ field } />
38-
) : (
39-
new Date( field.getValue( { item } ) ).toLocaleString()
40-
);
37+
if ( field.elements ) {
38+
return <RenderFromElements item={ item } field={ field } />;
39+
}
40+
41+
const value = field.getValue( { item } );
42+
if ( [ '', undefined, null ].includes( value ) ) {
43+
return null;
44+
}
45+
46+
try {
47+
const dateValue = parseDateTime( value );
48+
return dateValue?.toLocaleString();
49+
} catch ( error ) {
50+
return null;
51+
}
4152
},
4253
enableSorting: true,
4354
filterBy: {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* External dependencies
3+
*/
4+
import { isValid as isValidDate } from 'date-fns';
5+
6+
/**
7+
* WordPress dependencies
8+
*/
9+
import { getDate } from '@wordpress/date';
10+
11+
export default function parseDateTime( dateTimeString?: string ): Date | null {
12+
if ( ! dateTimeString ) {
13+
return null;
14+
}
15+
const parsed = getDate( dateTimeString );
16+
return parsed && isValidDate( parsed ) ? parsed : null;
17+
}

packages/dataviews/src/stories/field-types.story.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ const data: DataType[] = [
142142
booleanWithToggle: true,
143143
booleanWithElements: true,
144144
datetime: '2021-01-01T14:30:00Z',
145-
datetimeWithElements: '2021-01-01T14:30:00Z',
145+
datetimeWithElements: '1982-05-10T20:30:00Z',
146146
date: '2021-01-01',
147147
dateWithElements: '2021-01-01',
148148
@@ -285,16 +285,16 @@ const fields: Field< DataType >[] = [
285285
description: 'Help for datetime with elements.',
286286
elements: [
287287
{
288-
value: '2021-01-01T14:30:00Z',
289-
label: 'January 1st, 2021. 14:30UTC',
288+
value: '1973-02-01T14:30:00Z',
289+
label: 'February 1st, 1973. 14:30UTC',
290290
},
291291
{
292-
value: '2021-02-01T14:30:00Z',
293-
label: 'February 1st, 2021. 14:30UTC',
292+
value: '1982-05-10T20:30:00Z',
293+
label: 'May 10th, 1982. 20:30UTC',
294294
},
295295
{
296-
value: '2021-03-01T14:30:00Z',
297-
label: 'March 1st, 2021. 14:30UTC',
296+
value: '1994-03-01T14:30:00Z',
297+
label: 'March 1st, 1994. 14:30UTC',
298298
},
299299
],
300300
},

0 commit comments

Comments
 (0)