86 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Vue
		
	
	
| import YearHeader from './YearHeader';
 | |
| import YearBody, { YEAR_COL_COUNT } from './YearBody';
 | |
| import type { PanelSharedProps, PanelMode } from '../../interface';
 | |
| import { createKeydownHandler } from '../../utils/uiUtil';
 | |
| import useMergeProps from '../../hooks/useMergeProps';
 | |
| 
 | |
| export type YearPanelProps<DateType> = {
 | |
|   sourceMode: PanelMode;
 | |
| } & PanelSharedProps<DateType>;
 | |
| 
 | |
| export const YEAR_DECADE_COUNT = 10;
 | |
| 
 | |
| function YearPanel<DateType>(_props: YearPanelProps<DateType>) {
 | |
|   const props = useMergeProps(_props);
 | |
|   const {
 | |
|     prefixCls,
 | |
|     operationRef,
 | |
|     onViewDateChange,
 | |
|     generateConfig,
 | |
|     value,
 | |
|     viewDate,
 | |
|     sourceMode,
 | |
|     onSelect,
 | |
|     onPanelChange,
 | |
|   } = props;
 | |
| 
 | |
|   const panelPrefixCls = `${prefixCls}-year-panel`;
 | |
| 
 | |
|   // ======================= Keyboard =======================
 | |
|   operationRef.value = {
 | |
|     onKeydown: (event: KeyboardEvent) =>
 | |
|       createKeydownHandler(event, {
 | |
|         onLeftRight: diff => {
 | |
|           onSelect(generateConfig.addYear(value || viewDate, diff), 'key');
 | |
|         },
 | |
|         onCtrlLeftRight: diff => {
 | |
|           onSelect(generateConfig.addYear(value || viewDate, diff * YEAR_DECADE_COUNT), 'key');
 | |
|         },
 | |
|         onUpDown: diff => {
 | |
|           onSelect(generateConfig.addYear(value || viewDate, diff * YEAR_COL_COUNT), 'key');
 | |
|         },
 | |
|         onEnter: () => {
 | |
|           onPanelChange(sourceMode === 'date' ? 'date' : 'month', value || viewDate);
 | |
|         },
 | |
|       }),
 | |
|   };
 | |
| 
 | |
|   // ==================== View Operation ====================
 | |
|   const onDecadeChange = (diff: number) => {
 | |
|     const newDate = generateConfig.addYear(viewDate, diff * 10);
 | |
|     onViewDateChange(newDate);
 | |
|     onPanelChange(null, newDate);
 | |
|   };
 | |
| 
 | |
|   return (
 | |
|     <div class={panelPrefixCls}>
 | |
|       <YearHeader
 | |
|         {...props}
 | |
|         prefixCls={prefixCls}
 | |
|         onPrevDecade={() => {
 | |
|           onDecadeChange(-1);
 | |
|         }}
 | |
|         onNextDecade={() => {
 | |
|           onDecadeChange(1);
 | |
|         }}
 | |
|         onDecadeClick={() => {
 | |
|           onPanelChange('decade', viewDate);
 | |
|         }}
 | |
|       />
 | |
|       <YearBody
 | |
|         {...props}
 | |
|         prefixCls={prefixCls}
 | |
|         onSelect={date => {
 | |
|           onPanelChange(sourceMode === 'date' ? 'date' : 'month', date);
 | |
|           onSelect(date, 'mouse');
 | |
|         }}
 | |
|       />
 | |
|     </div>
 | |
|   );
 | |
| }
 | |
| 
 | |
| YearPanel.displayName = 'YearPanel';
 | |
| YearPanel.inheritAttrs = false;
 | |
| 
 | |
| export default YearPanel;
 |