11import * as React from 'react' ;
2- import classNames from 'classnames' ;
32import { GenerateConfig } from '../../generate' ;
4- import {
5- WEEK_DAY_COUNT ,
6- getWeekStartDate ,
7- isSameDate ,
8- isSameMonth ,
9- } from '../../utils/dateUtil' ;
10- import { Locale , OnSelect } from '../../interface' ;
3+ import { WEEK_DAY_COUNT , getWeekStartDate , isSameDate , isSameMonth } from '../../utils/dateUtil' ;
4+ import { Locale } from '../../interface' ;
115import RangeContext from '../../RangeContext' ;
12- import PanelContext from '../../PanelContext' ;
136import useCellClassName from '../../hooks/useCellClassName' ;
7+ import PanelBody from '../PanelBody' ;
148
15- export type DateRender < DateType > = (
16- currentDate : DateType ,
17- today : DateType ,
18- ) => React . ReactNode ;
9+ export type DateRender < DateType > = ( currentDate : DateType , today : DateType ) => React . ReactNode ;
1910
2011export interface DateBodyPassProps < DateType > {
2112 dateRender ?: DateRender < DateType > ;
@@ -33,26 +24,25 @@ export interface DateBodyProps<DateType> extends DateBodyPassProps<DateType> {
3324 viewDate : DateType ;
3425 locale : Locale ;
3526 rowCount : number ;
36- onSelect : OnSelect < DateType > ;
27+ onSelect : ( value : DateType ) => void ;
3728}
3829
39- function DateBody < DateType > ( {
40- prefixCls,
41- generateConfig,
42- prefixColumn,
43- rowClassName,
44- locale,
45- rowCount,
46- viewDate,
47- value,
48- disabledDate,
49- dateRender,
50- onSelect,
51- } : DateBodyProps < DateType > ) {
30+ function DateBody < DateType > ( props : DateBodyProps < DateType > ) {
31+ const {
32+ prefixCls,
33+ generateConfig,
34+ prefixColumn,
35+ locale,
36+ rowCount,
37+ viewDate,
38+ value,
39+ dateRender,
40+ } = props ;
41+
5242 const { rangedValue, hoverRangedValue } = React . useContext ( RangeContext ) ;
53- const { onDateMouseEnter, onDateMouseLeave } = React . useContext ( PanelContext ) ;
5443
55- const datePrefixCls = `${ prefixCls } -cell` ;
44+ const baseDate = getWeekStartDate ( locale . locale , generateConfig , viewDate ) ;
45+ const cellPrefixCls = `${ prefixCls } -cell` ;
5646 const weekFirstDay = generateConfig . locale . getWeekFirstDay ( locale . locale ) ;
5747 const today = generateConfig . getNow ( ) ;
5848
@@ -68,97 +58,37 @@ function DateBody<DateType>({
6858 headerCells . push ( < th key = "empty" /> ) ;
6959 }
7060 for ( let i = 0 ; i < WEEK_DAY_COUNT ; i += 1 ) {
71- headerCells . push (
72- < th key = { i } > { weekDaysLocale [ ( i + weekFirstDay ) % WEEK_DAY_COUNT ] } </ th > ,
73- ) ;
61+ headerCells . push ( < th key = { i } > { weekDaysLocale [ ( i + weekFirstDay ) % WEEK_DAY_COUNT ] } </ th > ) ;
7462 }
7563
76- // =============================== Date ===============================
77- const rows : React . ReactNode [ ] = [ ] ;
78- const startDate = getWeekStartDate ( locale . locale , generateConfig , viewDate ) ;
64+ // =============================== Body ===============================
7965 const getCellClassName = useCellClassName ( {
80- cellPrefixCls : datePrefixCls ,
66+ cellPrefixCls,
8167 today,
8268 value,
8369 generateConfig,
8470 rangedValue : prefixColumn ? null : rangedValue ,
8571 hoverRangedValue : prefixColumn ? null : hoverRangedValue ,
86- isSameCell : ( current , target ) =>
87- isSameDate ( generateConfig , current , target ) ,
72+ isSameCell : ( current , target ) => isSameDate ( generateConfig , current , target ) ,
8873 isInView : date => isSameMonth ( generateConfig , date , viewDate ) ,
8974 offsetCell : ( date , offset ) => generateConfig . addDate ( date , offset ) ,
9075 } ) ;
9176
92- for ( let y = 0 ; y < rowCount ; y += 1 ) {
93- const row : React . ReactNode [ ] = [ ] ;
94- const startWeekDate = generateConfig . addDate ( startDate , y * WEEK_DAY_COUNT ) ;
95-
96- if ( prefixColumn ) {
97- row . push ( prefixColumn ( startWeekDate ) ) ;
98- }
99-
100- for ( let x = 0 ; x < WEEK_DAY_COUNT ; x += 1 ) {
101- const currentDate = generateConfig . addDate ( startWeekDate , x ) ;
102- const disabled = disabledDate && disabledDate ( currentDate ) ;
103- row . push (
104- < td
105- key = { `${ x } -${ y } ` }
106- title = { generateConfig . locale . format (
107- locale . locale ,
108- currentDate ,
109- 'YYYY-MM-DD' ,
110- ) }
111- onClick = { ( ) => {
112- if ( ! disabled ) {
113- onSelect ( currentDate , 'mouse' ) ;
114- }
115- } }
116- onMouseEnter = { ( ) => {
117- if ( ! disabled && onDateMouseEnter ) {
118- onDateMouseEnter ( currentDate ) ;
119- }
120- } }
121- onMouseLeave = { ( ) => {
122- if ( ! disabled && onDateMouseLeave ) {
123- onDateMouseLeave ( currentDate ) ;
124- }
125- } }
126- className = { classNames ( datePrefixCls , {
127- [ `${ datePrefixCls } -disabled` ] : disabled ,
128-
129- ...getCellClassName ( currentDate ) ,
130- } ) }
131- >
132- { dateRender ? (
133- dateRender ( currentDate , today )
134- ) : (
135- < div className = { `${ datePrefixCls } -inner` } >
136- { generateConfig . getDate ( currentDate ) }
137- </ div >
138- ) }
139- </ td > ,
140- ) ;
141- }
142-
143- rows . push (
144- < tr
145- key = { y }
146- className = { classNames ( rowClassName && rowClassName ( startWeekDate ) ) }
147- >
148- { row }
149- </ tr > ,
150- ) ;
151- }
77+ const getCellNode = dateRender ? ( date : DateType ) => dateRender ( date , today ) : undefined ;
15278
15379 return (
154- < div className = { `${ prefixCls } -body` } >
155- < table className = { `${ prefixCls } -content` } >
156- < thead >
157- < tr > { headerCells } </ tr >
158- </ thead >
159- < tbody > { rows } </ tbody >
160- </ table >
161- </ div >
80+ < PanelBody
81+ { ...props }
82+ rowNum = { rowCount }
83+ colNum = { WEEK_DAY_COUNT }
84+ baseDate = { baseDate }
85+ getCellNode = { getCellNode }
86+ getCellText = { generateConfig . getDate }
87+ getCellClassName = { getCellClassName }
88+ getCellDate = { generateConfig . addDate }
89+ titleCell = { date => generateConfig . locale . format ( locale . locale , date , 'YYYY-MM-DD' ) }
90+ headerCells = { headerCells }
91+ />
16292 ) ;
16393}
16494
0 commit comments