118 lines
3.2 KiB
Vue
118 lines
3.2 KiB
Vue
import type { DateBodyPassProps, DateRender } from './DateBody';
|
|
import DateBody from './DateBody';
|
|
import DateHeader from './DateHeader';
|
|
import type { PanelSharedProps } from '../../interface';
|
|
import { WEEK_DAY_COUNT } from '../../utils/dateUtil';
|
|
import type { KeyboardConfig } from '../../utils/uiUtil';
|
|
import { createKeydownHandler } from '../../utils/uiUtil';
|
|
import classNames from '../../../_util/classNames';
|
|
import useMergeProps from '../../hooks/useMergeProps';
|
|
|
|
const DATE_ROW_COUNT = 6;
|
|
|
|
export type DatePanelProps<DateType> = {
|
|
active?: boolean;
|
|
dateRender?: DateRender<DateType>;
|
|
|
|
// Used for week panel
|
|
panelName?: string;
|
|
keyboardConfig?: KeyboardConfig;
|
|
} & PanelSharedProps<DateType> &
|
|
DateBodyPassProps<DateType>;
|
|
|
|
function DatePanel<DateType>(_props: DatePanelProps<DateType>) {
|
|
const props = useMergeProps(_props);
|
|
const {
|
|
prefixCls,
|
|
panelName = 'date',
|
|
keyboardConfig,
|
|
active,
|
|
operationRef,
|
|
generateConfig,
|
|
value,
|
|
viewDate,
|
|
onViewDateChange,
|
|
onPanelChange,
|
|
onSelect,
|
|
} = props;
|
|
const panelPrefixCls = `${prefixCls}-${panelName}-panel`;
|
|
// ======================= Keyboard =======================
|
|
operationRef.value = {
|
|
onKeydown: (event: KeyboardEvent) =>
|
|
createKeydownHandler(event, {
|
|
onLeftRight: diff => {
|
|
onSelect(generateConfig.addDate(value || viewDate, diff), 'key');
|
|
},
|
|
onCtrlLeftRight: diff => {
|
|
onSelect(generateConfig.addYear(value || viewDate, diff), 'key');
|
|
},
|
|
onUpDown: diff => {
|
|
onSelect(generateConfig.addDate(value || viewDate, diff * WEEK_DAY_COUNT), 'key');
|
|
},
|
|
onPageUpDown: diff => {
|
|
onSelect(generateConfig.addMonth(value || viewDate, diff), 'key');
|
|
},
|
|
...keyboardConfig,
|
|
}),
|
|
};
|
|
|
|
// ==================== View Operation ====================
|
|
const onYearChange = (diff: number) => {
|
|
const newDate = generateConfig.addYear(viewDate, diff);
|
|
onViewDateChange(newDate);
|
|
onPanelChange(null, newDate);
|
|
};
|
|
const onMonthChange = (diff: number) => {
|
|
const newDate = generateConfig.addMonth(viewDate, diff);
|
|
onViewDateChange(newDate);
|
|
onPanelChange(null, newDate);
|
|
};
|
|
|
|
return (
|
|
<div
|
|
class={classNames(panelPrefixCls, {
|
|
[`${panelPrefixCls}-active`]: active,
|
|
})}
|
|
>
|
|
<DateHeader
|
|
{...props}
|
|
prefixCls={prefixCls}
|
|
value={value}
|
|
viewDate={viewDate}
|
|
// View Operation
|
|
onPrevYear={() => {
|
|
onYearChange(-1);
|
|
}}
|
|
onNextYear={() => {
|
|
onYearChange(1);
|
|
}}
|
|
onPrevMonth={() => {
|
|
onMonthChange(-1);
|
|
}}
|
|
onNextMonth={() => {
|
|
onMonthChange(1);
|
|
}}
|
|
onMonthClick={() => {
|
|
onPanelChange('month', viewDate);
|
|
}}
|
|
onYearClick={() => {
|
|
onPanelChange('year', viewDate);
|
|
}}
|
|
/>
|
|
<DateBody
|
|
{...props}
|
|
onSelect={date => onSelect(date, 'mouse')}
|
|
prefixCls={prefixCls}
|
|
value={value}
|
|
viewDate={viewDate}
|
|
rowCount={DATE_ROW_COUNT}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
DatePanel.displayName = 'DatePanel';
|
|
DatePanel.inheritAttrs = false;
|
|
|
|
export default DatePanel;
|