{"version":3,"file":"helper.cjs","sources":["../../../components/date-picker/helper.ts"],"sourcesContent":["import { computed, reactive, ref } from 'vue'\n\nimport { getLast, toNumber } from '@vexip-ui/utils'\nimport { DisabledType } from './symbol'\n\nimport type { Ref } from 'vue'\nimport type { DisabledTime } from './symbol'\n\ntype Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9\n\nconst numberKeys = Array.from({ length: 10 }, (_, i) => i) as Digit[]\n\nfunction isNumberKey(key: string, num: Digit) {\n  return key === `Digit${num}` || key === `Numpad${num}` || key === `${num}`\n}\n\nexport function handleKeyEnter(event: KeyboardEvent) {\n  const key = event.code || event.key\n\n  let type: null | number | 'next' | 'prev' | 'up' | 'down' | 'ok' | 'esc' = null\n  let isMatch = false\n\n  switch (key) {\n    case 'Tab': {\n      isMatch = true\n      type = event.shiftKey ? 'prev' : 'next'\n      break\n    }\n    case 'ArrowRight': {\n      // 下一列\n      isMatch = true\n      type = 'next'\n      break\n    }\n    case 'Delete':\n    case 'ArrowLeft': {\n      // 上一列\n      isMatch = true\n      type = 'prev'\n      break\n    }\n    case 'ArrowUp': {\n      // 加一\n      isMatch = true\n      type = 'up'\n      break\n    }\n    case 'ArrowDown': {\n      // 减一\n      isMatch = true\n      type = 'down'\n      break\n    }\n    case 'Space':\n    case ' ':\n    case 'Enter':\n    case 'NumpadEnter': {\n      // 确认\n      isMatch = true\n      type = 'ok'\n      break\n    }\n    case 'Escape': {\n      // 取消\n      isMatch = true\n      type = 'esc'\n      break\n    }\n  }\n\n  if (isMatch) {\n    event.preventDefault()\n    event.stopPropagation()\n  } else {\n    // 键入数字\n    const inputtedNumber = numberKeys.findIndex(num => isNumberKey(key, num))\n\n    if (~inputtedNumber) {\n      type = inputtedNumber\n\n      event.preventDefault()\n      event.stopPropagation()\n    }\n  }\n\n  return type\n}\n\nexport function useColumn<T extends string>(\n  colTypes: T[],\n  currentColumn = ref(colTypes[0]) as Ref<T | null>,\n) {\n  const columnTypes = Array.from(colTypes)\n  const columnCount = columnTypes.length\n  const enabled = reactive(\n    columnTypes.reduce((prev, current) => {\n      prev[current] = false\n      return prev\n    }, {} as any),\n  ) as Record<T, boolean>\n\n  function findEnabledColumn(types: T[]) {\n    currentColumn.value = types.find(type => enabled[type]) ?? currentColumn.value\n  }\n\n  function resetColumn(type?: T | null, reverse = false) {\n    if (!type) {\n      currentColumn.value = null\n    }\n\n    const types = reverse ? Array.from(columnTypes).reverse() : columnTypes\n    const index = types.findIndex(column => column === type)\n\n    if (~index) {\n      findEnabledColumn(types.slice(index, columnCount).concat(types.slice(0, index)))\n    } else {\n      findEnabledColumn(types)\n    }\n  }\n\n  function enterColumn(type: 'prev' | 'next', canLoop = true) {\n    if (!currentColumn.value) {\n      currentColumn.value = (type === 'next' ? getLast(columnTypes) : columnTypes[0]) ?? null\n    }\n\n    for (let i = 0; i < columnCount; ++i) {\n      if (currentColumn.value === columnTypes[i]) {\n        const rawTypes = type === 'prev' ? Array.from(columnTypes).reverse() : columnTypes\n        const nextIndex = (type === 'prev' ? columnCount - i : i + 1) % columnCount\n        const types = canLoop\n          ? rawTypes.slice(nextIndex, columnCount).concat(rawTypes.slice(0, nextIndex))\n          : nextIndex\n            ? rawTypes.slice(nextIndex, columnCount)\n            : []\n\n        findEnabledColumn(types)\n\n        break\n      }\n    }\n  }\n\n  return {\n    currentColumn,\n    enabled,\n    resetColumn,\n    enterColumn,\n  }\n}\n\nconst defaultMin = [0, 0, 0]\nconst defaultMax = [23, 59, 59]\n\nexport function useTimeBound(originMin: Ref<string>, originMax: Ref<string>) {\n  const minUnits = computed(() => {\n    return originMin.value ? originMin.value.split(':').map(toNumber) : defaultMin\n  })\n  const maxUnits = computed(() => {\n    return originMax.value ? originMax.value.split(':').map(toNumber) : defaultMax\n  })\n  const reversed = computed(() => {\n    const min = minUnits.value\n    const max = maxUnits.value\n\n    for (let i = 0; i < 3; ++i) {\n      if (min[i] < max[i]) return false\n      if (min[i] > max[i]) return true\n    }\n\n    return false\n  })\n\n  const isTimeDisabled: Required<DisabledTime> = {\n    hour: isHourDisabled,\n    minute: (hour, minute) => isMinuteDisabled(hour, minute) !== DisabledType.FALSE,\n    second: (hour, minute, second) => isSecondDisabled(hour, minute, second) !== DisabledType.FALSE,\n  }\n\n  function isHourDisabled(hour: number) {\n    const min = minUnits.value[0] || defaultMin[0]\n    const max = maxUnits.value[0] || defaultMax[0]\n\n    return reversed.value ? hour > max && hour < min : hour < min || hour > max\n  }\n\n  function isMinuteDisabled(hour: number, minute: number) {\n    if (isHourDisabled(hour)) return DisabledType.UPSTREAM\n\n    if (minUnits.value[0] === maxUnits.value[0] && hour === minUnits.value[0]) {\n      const min = minUnits.value[1] || defaultMin[1]\n      const max = maxUnits.value[1] || defaultMax[1]\n\n      if (reversed.value ? minute > max && minute < min : minute < min || minute > max) {\n        return DisabledType.TRUE\n      }\n    }\n\n    if (hour === minUnits.value[0]) {\n      const min = minUnits.value[1] || defaultMin[1]\n\n      if (minute < min) return DisabledType.AT_MIN_TRUE\n    }\n\n    if (hour === maxUnits.value[0]) {\n      const max = maxUnits.value[1] || defaultMax[1]\n\n      if (minute > max) return DisabledType.AT_MAX_TRUE\n    }\n\n    return DisabledType.FALSE\n  }\n\n  function isSecondDisabled(hour: number, minute: number, second: number) {\n    if (isMinuteDisabled(hour, minute) !== DisabledType.FALSE) return DisabledType.UPSTREAM\n\n    if (\n      minUnits.value[0] === maxUnits.value[0] &&\n      hour === minUnits.value[0] &&\n      minUnits.value[1] === maxUnits.value[1] &&\n      minute === minUnits.value[1]\n    ) {\n      const min = minUnits.value[2] || defaultMin[2]\n      const max = maxUnits.value[2] || defaultMax[2]\n\n      if (reversed.value ? second > max && second < min : second < min || second > max) {\n        return DisabledType.TRUE\n      }\n    }\n\n    if (hour === minUnits.value[0] && minute === minUnits.value[1]) {\n      const min = minUnits.value[2] || defaultMin[2]\n\n      if (second < min) return DisabledType.AT_MIN_TRUE\n    }\n\n    if (hour === maxUnits.value[0] && minute === maxUnits.value[1]) {\n      const max = maxUnits.value[2] || defaultMax[2]\n\n      if (second > max) return DisabledType.AT_MAX_TRUE\n    }\n\n    return DisabledType.FALSE\n  }\n\n  return {\n    minUnits,\n    maxUnits,\n    reversed,\n    isTimeDisabled,\n  }\n}\n"],"names":["numberKeys","_","i","isNumberKey","key","num","handleKeyEnter","event","type","isMatch","inputtedNumber","useColumn","colTypes","currentColumn","ref","columnTypes","columnCount","enabled","reactive","prev","current","findEnabledColumn","types","resetColumn","reverse","index","column","enterColumn","canLoop","getLast","rawTypes","nextIndex","defaultMin","defaultMax","useTimeBound","originMin","originMax","minUnits","computed","toNumber","maxUnits","reversed","min","max","isTimeDisabled","isHourDisabled","hour","minute","isMinuteDisabled","DisabledType","second","isSecondDisabled"],"mappings":"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"}