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