'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

var vue = require('vue');
var index = require('../DatePanel/index.js');
var index$1 = require('../TimePanel/index.js');
var miscUtil = require('../../utils/miscUtil.js');
var timeUtil = require('../../utils/timeUtil.js');
var useMergeProps = require('../../hooks/useMergeProps.js');
var classNames = require('../../../_util/classNames.js');
var KeyCode = require('../../../_util/KeyCode.js');

const ACTIVE_PANEL = miscUtil.tuple("date", "time");
function DatetimePanel(_props) {
  const props = useMergeProps.default(_props);
  const {
    prefixCls,
    operationRef,
    generateConfig,
    value,
    defaultValue,
    disabledTime,
    showTime,
    onSelect
  } = props;
  const panelPrefixCls = `${prefixCls}-datetime-panel`;
  const activePanel = vue.ref(null);
  const dateOperationRef = vue.ref({});
  const timeOperationRef = vue.ref({});
  const timeProps = typeof showTime === "object" ? {
    ...showTime
  } : {};
  function getNextActive(offset) {
    const activeIndex = ACTIVE_PANEL.indexOf(activePanel.value) + offset;
    const nextActivePanel = ACTIVE_PANEL[activeIndex] || null;
    return nextActivePanel;
  }
  const onBlur = (e) => {
    if (timeOperationRef.value.onBlur)
      timeOperationRef.value.onBlur(e);
    activePanel.value = null;
  };
  operationRef.value = {
    onKeydown: (event) => {
      if (event.which === KeyCode.default.TAB) {
        const nextActivePanel = getNextActive(event.shiftKey ? -1 : 1);
        activePanel.value = nextActivePanel;
        if (nextActivePanel)
          event.preventDefault();
        return true;
      }
      if (activePanel.value) {
        const ref2 = activePanel.value === "date" ? dateOperationRef : timeOperationRef;
        if (ref2.value && ref2.value.onKeydown)
          ref2.value.onKeydown(event);
        return true;
      }
      if ([KeyCode.default.LEFT, KeyCode.default.RIGHT, KeyCode.default.UP, KeyCode.default.DOWN].includes(event.which)) {
        activePanel.value = "date";
        return true;
      }
      return false;
    },
    onBlur,
    onClose: onBlur
  };
  const onInternalSelect = (date, source) => {
    let selectedDate = date;
    if (source === "date" && !value && timeProps.defaultValue) {
      selectedDate = generateConfig.setHour(selectedDate, generateConfig.getHour(timeProps.defaultValue));
      selectedDate = generateConfig.setMinute(selectedDate, generateConfig.getMinute(timeProps.defaultValue));
      selectedDate = generateConfig.setSecond(selectedDate, generateConfig.getSecond(timeProps.defaultValue));
    } else if (source === "time" && !value && defaultValue) {
      selectedDate = generateConfig.setYear(selectedDate, generateConfig.getYear(defaultValue));
      selectedDate = generateConfig.setMonth(selectedDate, generateConfig.getMonth(defaultValue));
      selectedDate = generateConfig.setDate(selectedDate, generateConfig.getDate(defaultValue));
    }
    if (onSelect)
      onSelect(selectedDate, "mouse");
  };
  const disabledTimes = disabledTime ? disabledTime(value || null) : {};
  return vue.createVNode("div", {
    "class": classNames.default(panelPrefixCls, {
      [`${panelPrefixCls}-active`]: activePanel.value
    })
  }, [vue.createVNode(index.default, vue.mergeProps(props, {
    "operationRef": dateOperationRef,
    "active": activePanel.value === "date",
    "onSelect": (date) => {
      onInternalSelect(timeUtil.setDateTime(generateConfig, date, !value && typeof showTime === "object" ? showTime.defaultValue : null), "date");
    }
  }), null), vue.createVNode(index$1.default, vue.mergeProps(props, {
    "format": void 0
  }, timeProps, disabledTimes, {
    "disabledTime": null,
    "defaultValue": void 0,
    "operationRef": timeOperationRef,
    "active": activePanel.value === "time",
    "onSelect": (date) => {
      onInternalSelect(date, "time");
    }
  }), null)]);
}
DatetimePanel.displayName = "DatetimePanel";
DatetimePanel.inheritAttrs = false;

exports.default = DatetimePanel;
//# sourceMappingURL=index.js.map
