mirror of
https://github.com/strapi/strapi.git
synced 2025-09-16 20:10:05 +00:00
* fix: fix default date value bug in content type builder(#21098) * fix: fix default date value bug in content type builder(#21098), refactor parseDateValue * fix: fix default date value bug in content type builder(#21098), refactor parseDateValue * fix: fix default date value bug in content type builder(#21098)
This commit is contained in:
parent
997c519cb3
commit
b9c3a55768
@ -25,6 +25,8 @@ import formatISO from 'date-fns/formatISO';
|
|||||||
import isEqual from 'lodash/isEqual';
|
import isEqual from 'lodash/isEqual';
|
||||||
import { type MessageDescriptor, type PrimitiveType, useIntl } from 'react-intl';
|
import { type MessageDescriptor, type PrimitiveType, useIntl } from 'react-intl';
|
||||||
|
|
||||||
|
import { parseDateValue } from '../utils/parseDateValue';
|
||||||
|
|
||||||
import type { Schema } from '@strapi/types';
|
import type { Schema } from '@strapi/types';
|
||||||
|
|
||||||
interface TranslationMessage extends MessageDescriptor {
|
interface TranslationMessage extends MessageDescriptor {
|
||||||
@ -266,6 +268,7 @@ const GenericInput = ({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
case 'datetime': {
|
case 'datetime': {
|
||||||
|
const dateValue = parseDateValue(value);
|
||||||
return (
|
return (
|
||||||
<DateTimePicker
|
<DateTimePicker
|
||||||
clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}
|
clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}
|
||||||
@ -278,11 +281,12 @@ const GenericInput = ({
|
|||||||
}}
|
}}
|
||||||
onClear={() => onChange({ target: { name, value: null, type } })}
|
onClear={() => onChange({ target: { name, value: null, type } })}
|
||||||
placeholder={formattedPlaceholder}
|
placeholder={formattedPlaceholder}
|
||||||
value={value}
|
value={dateValue}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
case 'date': {
|
case 'date': {
|
||||||
|
const dateValue = parseDateValue(value);
|
||||||
return (
|
return (
|
||||||
<DatePicker
|
<DatePicker
|
||||||
clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}
|
clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}
|
||||||
@ -298,7 +302,7 @@ const GenericInput = ({
|
|||||||
}}
|
}}
|
||||||
onClear={() => onChange({ target: { name, value: null, type } })}
|
onClear={() => onChange({ target: { name, value: null, type } })}
|
||||||
placeholder={formattedPlaceholder}
|
placeholder={formattedPlaceholder}
|
||||||
value={value}
|
value={dateValue}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
export const parseDateValue = (value: unknown): Date | undefined => {
|
||||||
|
if (value instanceof Date && isValidDate(value)) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof value === 'string' || typeof value === 'number') {
|
||||||
|
const date = new Date(value);
|
||||||
|
if (isValidDate(date)) {
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const isValidDate = (date: Date): boolean => !isNaN(date.getTime());
|
@ -0,0 +1,42 @@
|
|||||||
|
import { parseDateValue } from '../parseDateValue';
|
||||||
|
|
||||||
|
describe('parseDateValue', () => {
|
||||||
|
it('should return undefined for null, undefined', () => {
|
||||||
|
expect(parseDateValue(null)).toBeUndefined();
|
||||||
|
expect(parseDateValue(undefined)).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return a valid Date object for Date input', () => {
|
||||||
|
const testDate = new Date('2024-09-04');
|
||||||
|
expect(parseDateValue(testDate)).toEqual(testDate);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return undefined for invalid Date object', () => {
|
||||||
|
expect(parseDateValue(new Date('Invalid Date'))).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return a Date object for valid string date input', () => {
|
||||||
|
const result = parseDateValue('2024-09-04');
|
||||||
|
expect(result).toBeInstanceOf(Date);
|
||||||
|
expect(result?.toISOString()).toBe('2024-09-04T00:00:00.000Z');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return a Date object for valid number (timestamp) input', () => {
|
||||||
|
const timestamp = 1725433710049;
|
||||||
|
const result = parseDateValue(timestamp);
|
||||||
|
expect(result).toBeInstanceOf(Date);
|
||||||
|
expect(result?.toISOString()).toBe('2024-09-04T07:08:30.049Z');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return undefined for invalid string date', () => {
|
||||||
|
expect(parseDateValue('not-a-date')).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return undefined for invalid number date', () => {
|
||||||
|
expect(parseDateValue(NaN)).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return undefined for unexpected types', () => {
|
||||||
|
expect(parseDateValue({} as any)).toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user