{"version":3,"file":"helper.mjs","sources":["../../../components/date-picker/helper.ts"],"sourcesContent":["import { computed, reactive, ref } from 'vue'\r\n\r\nimport { getLast, toNumber } from '@vexip-ui/utils'\r\nimport { DisabledType } from './symbol'\r\n\r\nimport type { Ref } from 'vue'\r\nimport type { DisabledTime } from './symbol'\r\n\r\ntype Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9\r\n\r\nconst numberKeys = Array.from({ length: 10 }, (_, i) => i) as Digit[]\r\n\r\nfunction isNumberKey(key: string, num: Digit) {\r\n  return key === `Digit${num}` || key === `Numpad${num}` || key === `${num}`\r\n}\r\n\r\nexport function handleKeyEnter(event: KeyboardEvent) {\r\n  const key = event.code || event.key\r\n\r\n  let type: null | number | 'next' | 'prev' | 'up' | 'down' | 'ok' | 'esc' = null\r\n  let isMatch = false\r\n\r\n  switch (key) {\r\n    case 'Tab': {\r\n      isMatch = true\r\n      type = event.shiftKey ? 'prev' : 'next'\r\n      break\r\n    }\r\n    case 'ArrowRight': {\r\n      // 下一列\r\n      isMatch = true\r\n      type = 'next'\r\n      break\r\n    }\r\n    case 'Delete':\r\n    case 'ArrowLeft': {\r\n      // 上一列\r\n      isMatch = true\r\n      type = 'prev'\r\n      break\r\n    }\r\n    case 'ArrowUp': {\r\n      // 加一\r\n      isMatch = true\r\n      type = 'up'\r\n      break\r\n    }\r\n    case 'ArrowDown': {\r\n      // 减一\r\n      isMatch = true\r\n      type = 'down'\r\n      break\r\n    }\r\n    case 'Space':\r\n    case ' ':\r\n    case 'Enter':\r\n    case 'NumpadEnter': {\r\n      // 确认\r\n      isMatch = true\r\n      type = 'ok'\r\n      break\r\n    }\r\n    case 'Escape': {\r\n      // 取消\r\n      isMatch = true\r\n      type = 'esc'\r\n      break\r\n    }\r\n  }\r\n\r\n  if (isMatch) {\r\n    event.preventDefault()\r\n    event.stopPropagation()\r\n  } else {\r\n    // 键入数字\r\n    const inputtedNumber = numberKeys.findIndex(num => isNumberKey(key, num))\r\n\r\n    if (~inputtedNumber) {\r\n      type = inputtedNumber\r\n\r\n      event.preventDefault()\r\n      event.stopPropagation()\r\n    }\r\n  }\r\n\r\n  return type\r\n}\r\n\r\nexport function useColumn<T extends string>(\r\n  colTypes: T[],\r\n  currentColumn = ref(colTypes[0]) as Ref<T | null>,\r\n) {\r\n  const columnTypes = Array.from(colTypes)\r\n  const columnCount = columnTypes.length\r\n  const enabled = reactive(\r\n    columnTypes.reduce((prev, current) => {\r\n      prev[current] = false\r\n      return prev\r\n    }, {} as any),\r\n  ) as Record<T, boolean>\r\n\r\n  function findEnabledColumn(types: T[]) {\r\n    currentColumn.value = types.find(type => enabled[type]) ?? currentColumn.value\r\n  }\r\n\r\n  function resetColumn(type?: T | null, reverse = false) {\r\n    if (!type) {\r\n      currentColumn.value = null\r\n    }\r\n\r\n    const types = reverse ? Array.from(columnTypes).reverse() : columnTypes\r\n    const index = types.findIndex(column => column === type)\r\n\r\n    if (~index) {\r\n      findEnabledColumn(types.slice(index, columnCount).concat(types.slice(0, index)))\r\n    } else {\r\n      findEnabledColumn(types)\r\n    }\r\n  }\r\n\r\n  function enterColumn(type: 'prev' | 'next', canLoop = true) {\r\n    if (!currentColumn.value) {\r\n      currentColumn.value = (type === 'next' ? getLast(columnTypes) : columnTypes[0]) ?? null\r\n    }\r\n\r\n    for (let i = 0; i < columnCount; ++i) {\r\n      if (currentColumn.value === columnTypes[i]) {\r\n        const rawTypes = type === 'prev' ? Array.from(columnTypes).reverse() : columnTypes\r\n        const nextIndex = (type === 'prev' ? columnCount - i : i + 1) % columnCount\r\n        const types = canLoop\r\n          ? rawTypes.slice(nextIndex, columnCount).concat(rawTypes.slice(0, nextIndex))\r\n          : nextIndex\r\n            ? rawTypes.slice(nextIndex, columnCount)\r\n            : []\r\n\r\n        findEnabledColumn(types)\r\n\r\n        break\r\n      }\r\n    }\r\n  }\r\n\r\n  return {\r\n    currentColumn,\r\n    enabled,\r\n    resetColumn,\r\n    enterColumn,\r\n  }\r\n}\r\n\r\nconst defaultMin = [0, 0, 0]\r\nconst defaultMax = [23, 59, 59]\r\n\r\nexport function useTimeBound(originMin: Ref<string>, originMax: Ref<string>) {\r\n  const minUnits = computed(() => {\r\n    return originMin.value ? originMin.value.split(':').map(toNumber) : defaultMin\r\n  })\r\n  const maxUnits = computed(() => {\r\n    return originMax.value ? originMax.value.split(':').map(toNumber) : defaultMax\r\n  })\r\n  const reversed = computed(() => {\r\n    const min = minUnits.value\r\n    const max = maxUnits.value\r\n\r\n    for (let i = 0; i < 3; ++i) {\r\n      if (min[i] < max[i]) return false\r\n      if (min[i] > max[i]) return true\r\n    }\r\n\r\n    return false\r\n  })\r\n\r\n  const isTimeDisabled: Required<DisabledTime> = {\r\n    hour: isHourDisabled,\r\n    minute: (hour, minute) => isMinuteDisabled(hour, minute) !== DisabledType.FALSE,\r\n    second: (hour, minute, second) => isSecondDisabled(hour, minute, second) !== DisabledType.FALSE,\r\n  }\r\n\r\n  function isHourDisabled(hour: number) {\r\n    const min = minUnits.value[0] || defaultMin[0]\r\n    const max = maxUnits.value[0] || defaultMax[0]\r\n\r\n    return reversed.value ? hour > max && hour < min : hour < min || hour > max\r\n  }\r\n\r\n  function isMinuteDisabled(hour: number, minute: number) {\r\n    if (isHourDisabled(hour)) return DisabledType.UPSTREAM\r\n\r\n    if (minUnits.value[0] === maxUnits.value[0] && hour === minUnits.value[0]) {\r\n      const min = minUnits.value[1] || defaultMin[1]\r\n      const max = maxUnits.value[1] || defaultMax[1]\r\n\r\n      if (reversed.value ? minute > max && minute < min : minute < min || minute > max) {\r\n        return DisabledType.TRUE\r\n      }\r\n    }\r\n\r\n    if (hour === minUnits.value[0]) {\r\n      const min = minUnits.value[1] || defaultMin[1]\r\n\r\n      if (minute < min) return DisabledType.AT_MIN_TRUE\r\n    }\r\n\r\n    if (hour === maxUnits.value[0]) {\r\n      const max = maxUnits.value[1] || defaultMax[1]\r\n\r\n      if (minute > max) return DisabledType.AT_MAX_TRUE\r\n    }\r\n\r\n    return DisabledType.FALSE\r\n  }\r\n\r\n  function isSecondDisabled(hour: number, minute: number, second: number) {\r\n    if (isMinuteDisabled(hour, minute) !== DisabledType.FALSE) return DisabledType.UPSTREAM\r\n\r\n    if (\r\n      minUnits.value[0] === maxUnits.value[0] &&\r\n      hour === minUnits.value[0] &&\r\n      minUnits.value[1] === maxUnits.value[1] &&\r\n      minute === minUnits.value[1]\r\n    ) {\r\n      const min = minUnits.value[2] || defaultMin[2]\r\n      const max = maxUnits.value[2] || defaultMax[2]\r\n\r\n      if (reversed.value ? second > max && second < min : second < min || second > max) {\r\n        return DisabledType.TRUE\r\n      }\r\n    }\r\n\r\n    if (hour === minUnits.value[0] && minute === minUnits.value[1]) {\r\n      const min = minUnits.value[2] || defaultMin[2]\r\n\r\n      if (second < min) return DisabledType.AT_MIN_TRUE\r\n    }\r\n\r\n    if (hour === maxUnits.value[0] && minute === maxUnits.value[1]) {\r\n      const max = maxUnits.value[2] || defaultMax[2]\r\n\r\n      if (second > max) return DisabledType.AT_MAX_TRUE\r\n    }\r\n\r\n    return DisabledType.FALSE\r\n  }\r\n\r\n  return {\r\n    minUnits,\r\n    maxUnits,\r\n    reversed,\r\n    isTimeDisabled,\r\n  }\r\n}\r\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":";;;AAUA,MAAMA,IAAa,MAAM,KAAK,EAAE,QAAQ,MAAM,CAACC,GAAGC,MAAMA,CAAC;AAEzD,SAASC,EAAYC,GAAaC,GAAY;AACrC,SAAAD,MAAQ,QAAQC,CAAG,MAAMD,MAAQ,SAASC,CAAG,MAAMD,MAAQ,GAAGC,CAAG;AAC1E;AAEO,SAASC,EAAeC,GAAsB;AAC7C,QAAAH,IAAMG,EAAM,QAAQA,EAAM;AAEhC,MAAIC,IAAuE,MACvEC,IAAU;AAEd,UAAQL,GAAK;AAAA,IACX,KAAK,OAAO;AACA,MAAAK,IAAA,IACHD,IAAAD,EAAM,WAAW,SAAS;AACjC;AAAA,IAAA;AAAA,IAEF,KAAK,cAAc;AAEP,MAAAE,IAAA,IACHD,IAAA;AACP;AAAA,IAAA;AAAA,IAEF,KAAK;AAAA,IACL,KAAK,aAAa;AAEN,MAAAC,IAAA,IACHD,IAAA;AACP;AAAA,IAAA;AAAA,IAEF,KAAK,WAAW;AAEJ,MAAAC,IAAA,IACHD,IAAA;AACP;AAAA,IAAA;AAAA,IAEF,KAAK,aAAa;AAEN,MAAAC,IAAA,IACHD,IAAA;AACP;AAAA,IAAA;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,eAAe;AAER,MAAAC,IAAA,IACHD,IAAA;AACP;AAAA,IAAA;AAAA,IAEF,KAAK,UAAU;AAEH,MAAAC,IAAA,IACHD,IAAA;AACP;AAAA,IAAA;AAAA,EACF;AAGF,MAAIC;AACF,IAAAF,EAAM,eAAe,GACrBA,EAAM,gBAAgB;AAAA,OACjB;AAEL,UAAMG,IAAiBV,EAAW,UAAU,OAAOG,EAAYC,GAAKC,CAAG,CAAC;AAExE,IAAI,CAACK,MACIF,IAAAE,GAEPH,EAAM,eAAe,GACrBA,EAAM,gBAAgB;AAAA,EACxB;AAGK,SAAAC;AACT;AAEO,SAASG,EACdC,GACAC,IAAgBC,EAAIF,EAAS,CAAC,CAAC,GAC/B;AACM,QAAAG,IAAc,MAAM,KAAKH,CAAQ,GACjCI,IAAcD,EAAY,QAC1BE,IAAUC;AAAA,IACdH,EAAY,OAAO,CAACI,GAAMC,OACxBD,EAAKC,CAAO,IAAI,IACTD,IACN,CAAS,CAAA;AAAA,EACd;AAEA,WAASE,EAAkBC,GAAY;AACvB,IAAAT,EAAA,QAAQS,EAAM,KAAK,CAAAd,MAAQS,EAAQT,CAAI,CAAC,KAAKK,EAAc;AAAA,EAAA;AAGlE,WAAAU,EAAYf,GAAiBgB,IAAU,IAAO;AACrD,IAAKhB,MACHK,EAAc,QAAQ;AAGxB,UAAMS,IAAQE,IAAU,MAAM,KAAKT,CAAW,EAAE,YAAYA,GACtDU,IAAQH,EAAM,UAAU,CAAAI,MAAUA,MAAWlB,CAAI;AAEvD,IAAI,CAACiB,IACeJ,EAAAC,EAAM,MAAMG,GAAOT,CAAW,EAAE,OAAOM,EAAM,MAAM,GAAGG,CAAK,CAAC,CAAC,IAE/EJ,EAAkBC,CAAK;AAAA,EACzB;AAGO,WAAAK,EAAYnB,GAAuBoB,IAAU,IAAM;AACtD,IAACf,EAAc,UACHA,EAAA,SAASL,MAAS,SAASqB,EAAQd,CAAW,IAAIA,EAAY,CAAC,MAAM;AAGrF,aAASb,IAAI,GAAGA,IAAIc,GAAa,EAAEd;AACjC,UAAIW,EAAc,UAAUE,EAAYb,CAAC,GAAG;AACpC,cAAA4B,IAAWtB,MAAS,SAAS,MAAM,KAAKO,CAAW,EAAE,YAAYA,GACjEgB,KAAavB,MAAS,SAASQ,IAAcd,IAAIA,IAAI,KAAKc,GAC1DM,IAAQM,IACVE,EAAS,MAAMC,GAAWf,CAAW,EAAE,OAAOc,EAAS,MAAM,GAAGC,CAAS,CAAC,IAC1EA,IACED,EAAS,MAAMC,GAAWf,CAAW,IACrC,CAAC;AAEP,QAAAK,EAAkBC,CAAK;AAEvB;AAAA,MAAA;AAAA,EAEJ;AAGK,SAAA;AAAA,IACL,eAAAT;AAAA,IACA,SAAAI;AAAA,IACA,aAAAM;AAAA,IACA,aAAAI;AAAA,EACF;AACF;AAEA,MAAMK,IAAa,CAAC,GAAG,GAAG,CAAC,GACrBC,IAAa,CAAC,IAAI,IAAI,EAAE;AAEd,SAAAC,EAAaC,GAAwBC,GAAwB;AACrE,QAAAC,IAAWC,EAAS,MACjBH,EAAU,QAAQA,EAAU,MAAM,MAAM,GAAG,EAAE,IAAII,CAAQ,IAAIP,CACrE,GACKQ,IAAWF,EAAS,MACjBF,EAAU,QAAQA,EAAU,MAAM,MAAM,GAAG,EAAE,IAAIG,CAAQ,IAAIN,CACrE,GACKQ,IAAWH,EAAS,MAAM;AAC9B,UAAMI,IAAML,EAAS,OACfM,IAAMH,EAAS;AAErB,aAAStC,IAAI,GAAGA,IAAI,GAAG,EAAEA,GAAG;AAC1B,UAAIwC,EAAIxC,CAAC,IAAIyC,EAAIzC,CAAC,EAAU,QAAA;AAC5B,UAAIwC,EAAIxC,CAAC,IAAIyC,EAAIzC,CAAC,EAAU,QAAA;AAAA,IAAA;AAGvB,WAAA;AAAA,EAAA,CACR,GAEK0C,IAAyC;AAAA,IAC7C,MAAMC;AAAA,IACN,QAAQ,CAACC,GAAMC,MAAWC,EAAiBF,GAAMC,CAAM,MAAME,EAAa;AAAA,IAC1E,QAAQ,CAACH,GAAMC,GAAQG,MAAWC,EAAiBL,GAAMC,GAAQG,CAAM,MAAMD,EAAa;AAAA,EAC5F;AAEA,WAASJ,EAAeC,GAAc;AACpC,UAAMJ,IAAML,EAAS,MAAM,CAAC,KAAKL,EAAW,CAAC,GACvCW,IAAMH,EAAS,MAAM,CAAC,KAAKP,EAAW,CAAC;AAEtC,WAAAQ,EAAS,QAAQK,IAAOH,KAAOG,IAAOJ,IAAMI,IAAOJ,KAAOI,IAAOH;AAAA,EAAA;AAGjE,WAAAK,EAAiBF,GAAcC,GAAgB;AACtD,QAAIF,EAAeC,CAAI,EAAG,QAAOG,EAAa;AAE9C,QAAIZ,EAAS,MAAM,CAAC,MAAMG,EAAS,MAAM,CAAC,KAAKM,MAAST,EAAS,MAAM,CAAC,GAAG;AACzE,YAAMK,IAAML,EAAS,MAAM,CAAC,KAAKL,EAAW,CAAC,GACvCW,IAAMH,EAAS,MAAM,CAAC,KAAKP,EAAW,CAAC;AAEzC,UAAAQ,EAAS,QAAQM,IAASJ,KAAOI,IAASL,IAAMK,IAASL,KAAOK,IAASJ;AAC3E,eAAOM,EAAa;AAAA,IACtB;AAGF,QAAIH,MAAST,EAAS,MAAM,CAAC,GAAG;AAC9B,YAAMK,IAAML,EAAS,MAAM,CAAC,KAAKL,EAAW,CAAC;AAEzC,UAAAe,IAASL,EAAK,QAAOO,EAAa;AAAA,IAAA;AAGxC,QAAIH,MAASN,EAAS,MAAM,CAAC,GAAG;AAC9B,YAAMG,IAAMH,EAAS,MAAM,CAAC,KAAKP,EAAW,CAAC;AAEzC,UAAAc,IAASJ,EAAK,QAAOM,EAAa;AAAA,IAAA;AAGxC,WAAOA,EAAa;AAAA,EAAA;AAGb,WAAAE,EAAiBL,GAAcC,GAAgBG,GAAgB;AACtE,QAAIF,EAAiBF,GAAMC,CAAM,MAAME,EAAa,cAAcA,EAAa;AAG7E,QAAAZ,EAAS,MAAM,CAAC,MAAMG,EAAS,MAAM,CAAC,KACtCM,MAAST,EAAS,MAAM,CAAC,KACzBA,EAAS,MAAM,CAAC,MAAMG,EAAS,MAAM,CAAC,KACtCO,MAAWV,EAAS,MAAM,CAAC,GAC3B;AACA,YAAMK,IAAML,EAAS,MAAM,CAAC,KAAKL,EAAW,CAAC,GACvCW,IAAMH,EAAS,MAAM,CAAC,KAAKP,EAAW,CAAC;AAEzC,UAAAQ,EAAS,QAAQS,IAASP,KAAOO,IAASR,IAAMQ,IAASR,KAAOQ,IAASP;AAC3E,eAAOM,EAAa;AAAA,IACtB;AAGE,QAAAH,MAAST,EAAS,MAAM,CAAC,KAAKU,MAAWV,EAAS,MAAM,CAAC,GAAG;AAC9D,YAAMK,IAAML,EAAS,MAAM,CAAC,KAAKL,EAAW,CAAC;AAEzC,UAAAkB,IAASR,EAAK,QAAOO,EAAa;AAAA,IAAA;AAGpC,QAAAH,MAASN,EAAS,MAAM,CAAC,KAAKO,MAAWP,EAAS,MAAM,CAAC,GAAG;AAC9D,YAAMG,IAAMH,EAAS,MAAM,CAAC,KAAKP,EAAW,CAAC;AAEzC,UAAAiB,IAASP,EAAK,QAAOM,EAAa;AAAA,IAAA;AAGxC,WAAOA,EAAa;AAAA,EAAA;AAGf,SAAA;AAAA,IACL,UAAAZ;AAAA,IACA,UAAAG;AAAA,IACA,UAAAC;AAAA,IACA,gBAAAG;AAAA,EACF;AACF;"}