11import React , { forwardRef } from 'react' ;
2- import moment from 'moment' ;
32import classNames from 'classnames' ;
43import { DatePickerProps , Emphasis , IconButton , Toolbar } from '@lumx/react' ;
54import { mdiChevronLeft , mdiChevronRight } from '@lumx/icons' ;
6- import { getAnnotatedMonthCalendar , getWeekDays } from '@lumx/core/js/date-picker' ;
75import { Comp } from '@lumx/react/utils/type' ;
6+ import { getMonthCalendar } from '@lumx/react/utils/date/getMonthCalendar' ;
7+ import { isSameDay } from '@lumx/react/utils/date/isSameDay' ;
8+ import { formatMonthYear } from '@lumx/react/utils/date/formatMonthYear' ;
9+ import { formatDayNumber } from '@lumx/react/utils/date/formatDayNumber' ;
810import { CLASSNAME } from './constants' ;
911
1012/**
@@ -45,14 +47,10 @@ export const DatePickerControlled: Comp<DatePickerControlledProps, HTMLDivElemen
4547 todayOrSelectedDateRef,
4648 value,
4749 } = props ;
48- const days = React . useMemo ( ( ) => {
49- return getAnnotatedMonthCalendar ( locale , minDate , maxDate , moment ( selectedMonth ) ) ;
50+ const { weeks , weekDays } = React . useMemo ( ( ) => {
51+ return getMonthCalendar ( locale , selectedMonth , minDate , maxDate ) ;
5052 } , [ locale , minDate , maxDate , selectedMonth ] ) ;
5153
52- const weekDays = React . useMemo ( ( ) => {
53- return getWeekDays ( locale ) ;
54- } , [ locale ] ) ;
55-
5654 return (
5755 < div ref = { ref } className = { `${ CLASSNAME } ` } >
5856 < Toolbar
@@ -73,51 +71,44 @@ export const DatePickerControlled: Comp<DatePickerControlledProps, HTMLDivElemen
7371 onClick = { onPrevMonthChange }
7472 />
7573 }
76- label = {
77- < span className = { `${ CLASSNAME } __month` } >
78- { moment ( selectedMonth ) . locale ( locale ) . format ( 'MMMM YYYY' ) }
79- </ span >
80- }
74+ label = { < span className = { `${ CLASSNAME } __month` } > { formatMonthYear ( selectedMonth , locale ) } </ span > }
8175 />
8276 < div className = { `${ CLASSNAME } __calendar` } >
8377 < div className = { `${ CLASSNAME } __week-days ${ CLASSNAME } __days-wrapper` } >
84- { weekDays . map ( ( weekDay ) => (
85- < div key = { weekDay . unix ( ) } className = { `${ CLASSNAME } __day-wrapper` } >
86- < span className = { `${ CLASSNAME } __week-day` } >
87- { weekDay . format ( 'dddd' ) . slice ( 0 , 1 ) . toLocaleUpperCase ( ) }
88- </ span >
78+ { weekDays . map ( ( { letter, number } ) => (
79+ < div key = { number } className = { `${ CLASSNAME } __day-wrapper` } >
80+ < span className = { `${ CLASSNAME } __week-day` } > { letter . toLocaleUpperCase ( ) } </ span >
8981 </ div >
9082 ) ) }
9183 </ div >
9284
9385 < div className = { `${ CLASSNAME } __month-days ${ CLASSNAME } __days-wrapper` } >
94- { days . map ( ( annotatedDate ) => {
95- if ( annotatedDate . isDisplayed ) {
86+ { weeks . flatMap ( ( week , weekIndex ) => {
87+ return weekDays . map ( ( weekDay , dayIndex ) => {
88+ const { date, isOutOfRange } = week [ weekDay . number ] || { } ;
89+ const key = `${ weekIndex } -${ dayIndex } ` ;
90+ const isToday = ! isOutOfRange && date && isSameDay ( date , new Date ( ) ) ;
91+ const isSelected = date && value && isSameDay ( value , date ) ;
92+
9693 return (
97- < div key = { annotatedDate . date . unix ( ) } className = { `${ CLASSNAME } __day-wrapper` } >
98- < button
99- ref = {
100- ( value && annotatedDate . date . isSame ( value , 'day' ) ) ||
101- ( ! value && annotatedDate . isToday )
102- ? todayOrSelectedDateRef
103- : null
104- }
105- className = { classNames ( `${ CLASSNAME } __month-day` , {
106- [ `${ CLASSNAME } __month-day--is-selected` ] :
107- value && annotatedDate . date . isSame ( value , 'day' ) ,
108- [ `${ CLASSNAME } __month-day--is-today` ] :
109- annotatedDate . isClickable && annotatedDate . isToday ,
110- } ) }
111- disabled = { ! annotatedDate . isClickable }
112- type = "button"
113- onClick = { ( ) => onChange ( moment ( annotatedDate . date ) . toDate ( ) ) }
114- >
115- < span > { annotatedDate . date . format ( 'DD' ) } </ span >
116- </ button >
94+ < div key = { key } className = { `${ CLASSNAME } __day-wrapper` } >
95+ { date && (
96+ < button
97+ ref = { isSelected || ( ! value && isToday ) ? todayOrSelectedDateRef : null }
98+ className = { classNames ( `${ CLASSNAME } __month-day` , {
99+ [ `${ CLASSNAME } __month-day--is-selected` ] : isSelected ,
100+ [ `${ CLASSNAME } __month-day--is-today` ] : isToday ,
101+ } ) }
102+ disabled = { isOutOfRange }
103+ type = "button"
104+ onClick = { ( ) => onChange ( date ) }
105+ >
106+ < span > { formatDayNumber ( date , locale ) } </ span >
107+ </ button >
108+ ) }
117109 </ div >
118110 ) ;
119- }
120- return < div key = { annotatedDate . date . unix ( ) } className = { `${ CLASSNAME } __day-wrapper` } /> ;
111+ } ) ;
121112 } ) }
122113 </ div >
123114 </ div >
0 commit comments