110 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Vue
		
	
	
| import TimeHeader from './TimeHeader';
 | |
| import type { BodyOperationRef } from './TimeBody';
 | |
| import TimeBody from './TimeBody';
 | |
| import type { PanelSharedProps, DisabledTimes } from '../../interface';
 | |
| import { createKeydownHandler } from '../../utils/uiUtil';
 | |
| import classNames from '../../../_util/classNames';
 | |
| import { ref } from 'vue';
 | |
| import useMergeProps from '../../hooks/useMergeProps';
 | |
| // import type { RangeType } from '../../RangePicker';
 | |
| 
 | |
| export type SharedTimeProps<DateType> = {
 | |
|   format?: string;
 | |
|   showNow?: boolean;
 | |
|   showHour?: boolean;
 | |
|   showMinute?: boolean;
 | |
|   showSecond?: boolean;
 | |
|   use12Hours?: boolean;
 | |
|   hourStep?: number;
 | |
|   minuteStep?: number;
 | |
|   secondStep?: number;
 | |
|   hideDisabledOptions?: boolean;
 | |
|   defaultValue?: DateType;
 | |
| 
 | |
|   /** @deprecated Please use `disabledTime` instead. */
 | |
|   disabledHours?: DisabledTimes['disabledHours'];
 | |
|   /** @deprecated Please use `disabledTime` instead. */
 | |
|   disabledMinutes?: DisabledTimes['disabledMinutes'];
 | |
|   /** @deprecated Please use `disabledTime` instead. */
 | |
|   disabledSeconds?: DisabledTimes['disabledSeconds'];
 | |
| 
 | |
|   disabledTime?: (date: DateType) => DisabledTimes;
 | |
| };
 | |
| 
 | |
| export type TimePanelProps<DateType> = {
 | |
|   format?: string;
 | |
|   active?: boolean;
 | |
| } & PanelSharedProps<DateType> &
 | |
|   SharedTimeProps<DateType>;
 | |
| 
 | |
| const countBoolean = (boolList: (boolean | undefined)[]) =>
 | |
|   boolList.filter(bool => bool !== false).length;
 | |
| 
 | |
| function TimePanel<DateType>(_props: TimePanelProps<DateType>) {
 | |
|   const props = useMergeProps(_props);
 | |
|   const {
 | |
|     generateConfig,
 | |
|     format = 'HH:mm:ss',
 | |
|     prefixCls,
 | |
|     active,
 | |
|     operationRef,
 | |
|     showHour,
 | |
|     showMinute,
 | |
|     showSecond,
 | |
|     use12Hours = false,
 | |
|     onSelect,
 | |
|     value,
 | |
|   } = props;
 | |
|   const panelPrefixCls = `${prefixCls}-time-panel`;
 | |
|   const bodyOperationRef = ref<BodyOperationRef>();
 | |
| 
 | |
|   // ======================= Keyboard =======================
 | |
|   const activeColumnIndex = ref(-1);
 | |
|   const columnsCount = countBoolean([showHour, showMinute, showSecond, use12Hours]);
 | |
| 
 | |
|   operationRef.value = {
 | |
|     onKeydown: (event: KeyboardEvent) =>
 | |
|       createKeydownHandler(event, {
 | |
|         onLeftRight: diff => {
 | |
|           activeColumnIndex.value = (activeColumnIndex.value + diff + columnsCount) % columnsCount;
 | |
|         },
 | |
|         onUpDown: diff => {
 | |
|           if (activeColumnIndex.value === -1) {
 | |
|             activeColumnIndex.value = 0;
 | |
|           } else if (bodyOperationRef.value) {
 | |
|             bodyOperationRef.value.onUpDown(diff);
 | |
|           }
 | |
|         },
 | |
|         onEnter: () => {
 | |
|           onSelect(value || generateConfig.getNow(), 'key');
 | |
|           activeColumnIndex.value = -1;
 | |
|         },
 | |
|       }),
 | |
| 
 | |
|     onBlur: () => {
 | |
|       activeColumnIndex.value = -1;
 | |
|     },
 | |
|   };
 | |
| 
 | |
|   return (
 | |
|     <div
 | |
|       class={classNames(panelPrefixCls, {
 | |
|         [`${panelPrefixCls}-active`]: active,
 | |
|       })}
 | |
|     >
 | |
|       <TimeHeader {...props} format={format} prefixCls={prefixCls} />
 | |
|       <TimeBody
 | |
|         {...props}
 | |
|         prefixCls={prefixCls}
 | |
|         activeColumnIndex={activeColumnIndex.value}
 | |
|         operationRef={bodyOperationRef}
 | |
|       />
 | |
|     </div>
 | |
|   );
 | |
| }
 | |
| 
 | |
| TimePanel.displayName = 'TimePanel';
 | |
| TimePanel.inheritAttrs = false;
 | |
| 
 | |
| export default TimePanel;
 |