Skip to content

Commit 5f9de53

Browse files
authored
Merge pull request #688 from strapi/fix/datepicker-locale
DatePicker: Allow to pass in a locale
2 parents 5517ca1 + 674c384 commit 5f9de53

File tree

5 files changed

+383
-71
lines changed

5 files changed

+383
-71
lines changed

packages/strapi-design-system/src/DatePicker/DatePicker.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ import { DatePickerButton, DatePickerWrapper, IconBox } from './components';
88
import { DatePickerCalendar } from './DatePickerCalendar';
99
import { formatDate } from './utils/formatDate';
1010
import { useId } from '../helpers/useId';
11+
import { getDefaultLocale } from '../helpers/getDefaultLocale';
1112

1213
export const DatePicker = ({
1314
ariaLabel,
1415
initialDate,
1516
selectedDate,
1617
onChange,
1718
label,
19+
locale: defaultLocale,
1820
selectedDateLabel,
1921
onClear,
2022
clearLabel,
@@ -26,7 +28,8 @@ export const DatePicker = ({
2628
const [visible, setVisible] = useState(false);
2729
const inputRef = useRef(null);
2830
const datePickerButtonRef = useRef(null);
29-
const formattedDate = selectedDate ? formatDate(selectedDate) : '';
31+
const locale = defaultLocale || getDefaultLocale();
32+
const formattedDate = selectedDate ? formatDate(selectedDate, locale) : '';
3033

3134
const toggleVisibility = () => {
3235
if (disabled) return;
@@ -61,7 +64,7 @@ export const DatePicker = ({
6164
<DatePickerButton
6265
ref={datePickerButtonRef}
6366
onClick={toggleVisibility}
64-
aria-label={selectedDate ? selectedDateLabel(formatDate(selectedDate)) : label}
67+
aria-label={selectedDate ? selectedDateLabel(formatDate(selectedDate, locale)) : label}
6568
type="button"
6669
aria-disabled={disabled}
6770
>
@@ -117,6 +120,7 @@ DatePicker.propTypes = {
117120
id: PropTypes.string,
118121
initialDate: PropTypes.instanceOf(Date),
119122
label: PropTypes.string,
123+
locale: PropTypes.string,
120124
maxDate: PropTypes.instanceOf(Date),
121125
minDate: PropTypes.instanceOf(Date),
122126
onChange: PropTypes.func.isRequired,

packages/strapi-design-system/src/DatePicker/DatePicker.stories.mdx

+25
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,31 @@ By passing in `minDate` or `maxDate` it is possible to define the range of years
142142
</Story>
143143
</Canvas>
144144

145+
## Locales
146+
147+
<Canvas>
148+
<Story name="locales">
149+
{() => {
150+
const [date, setDate] = useState();
151+
return (
152+
<DatePicker
153+
onChange={setDate}
154+
selectedDate={date}
155+
label="Date picker"
156+
name="datepicker"
157+
clearLabel={'Clear the datepicker'}
158+
onClear={() => setDate(undefined)}
159+
placeholder="03/01/1970"
160+
locale="de"
161+
selectedDateLabel={(formattedDate) => `Date picker, current is ${formattedDate}`}
162+
minDate={new Date(2000, 1, 1)}
163+
maxDate={new Date(2040, 1, 1)}
164+
/>
165+
);
166+
}}
167+
</Story>
168+
</Canvas>
169+
145170
## Props
146171

147172
<ArgsTable of={DatePicker} />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import * as React from 'react';
2+
import { render, screen } from '@testing-library/react';
3+
4+
import { DatePicker } from '../DatePicker';
5+
6+
import { lightTheme } from '../../themes';
7+
import { ThemeProvider } from '../../ThemeProvider';
8+
9+
describe('DatePicker', () => {
10+
describe('Locale prop', () => {
11+
const renderDate = (locale) =>
12+
render(
13+
<ThemeProvider theme={lightTheme}>
14+
<DatePicker
15+
label="date"
16+
locale={locale}
17+
selectedDateLabel={(formattedDate) => `Date picker, current is ${formattedDate}`}
18+
selectedDate={new Date('Tue Sep 06 2022')}
19+
/>
20+
</ThemeProvider>,
21+
);
22+
23+
it('should format by EN locale by default', () => {
24+
renderDate();
25+
26+
const input = screen.getByRole('textbox');
27+
28+
expect(input.value).toMatchInlineSnapshot('"9/6/2022"');
29+
});
30+
31+
it('should format by the DE locale when passed', () => {
32+
renderDate('de-DE');
33+
34+
const input = screen.getByRole('textbox');
35+
36+
expect(input.value).toMatchInlineSnapshot('"6.9.2022"');
37+
});
38+
});
39+
});
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
export const formatDate = (date) => {
2-
const langFormatter = new Intl.DateTimeFormat();
1+
export const formatDate = (date, locale) => {
2+
const langFormatter = new Intl.DateTimeFormat(locale);
33

44
return langFormatter.format(date);
55
};

0 commit comments

Comments
 (0)