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;
 |