{"version":3,"file":"time-select.vue.mjs","sources":["../../../../../packages/components/time-select/src/time-select.vue"],"sourcesContent":["<template>\n  <el-select\n    ref=\"select\"\n    :model-value=\"value\"\n    :disabled=\"disabled\"\n    :clearable=\"clearable\"\n    :clear-icon=\"clearIcon\"\n    :size=\"size\"\n    :effect=\"effect\"\n    :placeholder=\"placeholder\"\n    default-first-option\n    :filterable=\"editable\"\n    @update:model-value=\"(event) => $emit('update:modelValue', event)\"\n    @change=\"(event) => $emit('change', event)\"\n    @blur=\"(event) => $emit('blur', event)\"\n    @focus=\"(event) => $emit('focus', event)\"\n    :options=\"items\"\n  >\n    <template #prefix>\n      <el-icon v-if=\"prefixIcon\" class=\"el-input__prefix-icon\">\n        <component :is=\"prefixIcon\" />\n      </el-icon>\n    </template>\n  </el-select>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, ref } from 'vue'\nimport dayjs from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\nimport ElSelect from '@element-ultra/components/select'\nimport ElIcon from '@element-ultra/components/icon'\nimport { CircleClose, Clock } from 'icon-ultra'\n\nimport type { PropType, Component } from 'vue'\nimport type { ComponentSize } from '@element-ultra/shared'\ndayjs.extend(customParseFormat)\n\ninterface Time {\n  hours: number\n  minutes: number\n}\n\nconst parseTime = (time: string): null | Time => {\n  const values = (time || '').split(':')\n  if (values.length >= 2) {\n    let hours = parseInt(values[0], 10)\n    const minutes = parseInt(values[1], 10)\n    const timeUpper = time.toUpperCase()\n    if (timeUpper.includes('AM') && hours === 12) {\n      hours = 0\n    } else if (timeUpper.includes('PM') && hours !== 12) {\n      hours += 12\n    }\n    return {\n      hours,\n      minutes,\n    }\n  }\n  return null\n}\nconst compareTime = (time1: string, time2: string): number => {\n  const value1 = parseTime(time1)\n  const value2 = parseTime(time2)\n  const minutes1 = value1.minutes + value1.hours * 60\n  const minutes2 = value2.minutes + value2.hours * 60\n  if (minutes1 === minutes2) {\n    return 0\n  }\n  return minutes1 > minutes2 ? 1 : -1\n}\nconst padTime = (time: number | string) => {\n  return `${time}`.padStart(2, '0')\n}\nconst formatTime = (time: Time): string => {\n  return `${padTime(time.hours)}:${padTime(time.minutes)}`\n}\nconst nextTime = (time: string, step: string): string => {\n  const timeValue = parseTime(time)\n  const stepValue = parseTime(step)\n  const next = {\n    hours: timeValue.hours,\n    minutes: timeValue.minutes,\n  }\n  next.minutes += stepValue.minutes\n  next.hours += stepValue.hours\n  next.hours += Math.floor(next.minutes / 60)\n  next.minutes = next.minutes % 60\n  return formatTime(next)\n}\n\nexport default defineComponent({\n  name: 'ElTimeSelect',\n  components: { ElSelect, ElIcon },\n  model: {\n    prop: 'value',\n    event: 'change',\n  },\n  props: {\n    format: {\n      type: String,\n      default: 'HH:mm',\n    },\n    modelValue: String,\n    disabled: {\n      type: Boolean,\n      default: undefined\n    },\n    editable: {\n      type: Boolean,\n      default: true,\n    },\n    effect: {\n      type: String as PropType<'light' | 'dark' | string>,\n      default: 'light',\n    },\n    clearable: {\n      type: Boolean,\n      default: true,\n    },\n    size: {\n      type: String as PropType<ComponentSize>,\n      default: 'default',\n      validator: (value: string) =>\n        !value || ['large', 'default', 'small'].indexOf(value) !== -1,\n    },\n    placeholder: {\n      type: String,\n      default: '',\n    },\n    start: {\n      type: String,\n      default: '09:00',\n    },\n    end: {\n      type: String,\n      default: '18:00',\n    },\n    step: {\n      type: String,\n      default: '00:30',\n    },\n    minTime: {\n      type: String,\n      default: '',\n    },\n    maxTime: {\n      type: String,\n      default: '',\n    },\n    name: {\n      type: String,\n      default: '',\n    },\n    prefixIcon: {\n      type: [String, Object] as PropType<string | Component>,\n      default: Clock,\n    },\n    clearIcon: {\n      type: [String, Object] as PropType<string | Component>,\n      default: CircleClose,\n    },\n  },\n  emits: ['change', 'blur', 'focus', 'update:modelValue'],\n  setup(props) {\n    // computed\n    const select = ref(null)\n    const value = computed(() => props.modelValue)\n    const start = computed(() => {\n      const time = parseTime(props.start)\n      return formatTime(time)\n    })\n    const end = computed(() => {\n      const time = parseTime(props.end)\n      return formatTime(time)\n    })\n    const step = computed(() => {\n      const time = parseTime(props.step)\n      return formatTime(time)\n    })\n    const minTime = computed(() => {\n      const time = parseTime(props.minTime)\n      return time ? formatTime(time) : null\n    })\n    const maxTime = computed(() => {\n      const time = parseTime(props.maxTime)\n      return time ? formatTime(time) : null\n    })\n    const items = computed(() => {\n      const result: Array<{ value: string; label: string; disabled: boolean }> =\n        []\n      if (props.start && props.end && props.step) {\n        let current = start.value\n        let currentTime\n        while (compareTime(current, end.value) <= 0) {\n          currentTime = dayjs(current, 'HH:mm').format(props.format)\n          result.push({\n            value: currentTime,\n            label: currentTime,\n            disabled:\n              compareTime(current, minTime.value || '-1:-1') <= 0 ||\n              compareTime(current, maxTime.value || '100:100') >= 0,\n          })\n          current = nextTime(current, step.value)\n        }\n      }\n      return result\n    })\n    const blur = () => {\n      select.value?.blur?.()\n    }\n    const focus = () => {\n      select.value?.focus?.()\n    }\n\n    return {\n      select,\n      value,\n      items,\n      blur,\n      focus,\n    }\n  },\n})\n</script>\n"],"names":["_resolveComponent","_openBlock","_createBlock","_withCtx"],"mappings":";;;;;;+BACEA,iBAsBY,WAAA,CAAA,CAAA;AApBT,EAAA,OAAAC,SAAA,EAAkB,EAAAC,WAAA,CAAA,oBAAA,EAAA;AAAA,IAClB,GAAA,EAAA,QAAA;AAAA,IACA,eAAW,IAAA,CAAA,KAAA;AAAA,IACX,UAAY,IAAA,CAAA,QAAA;AAAA,IACZ,WAAM,IAAI,CAAA,SAAA;AAAA,IACV,cAAQ,IAAM,CAAA,SAAA;AAAA,IACd,MAAW,IAAA,CAAA,IAAA;AAAA,IACZ,QAAA,IAAA,CAAA,MAAA;AAAA,IACC,aAAY,IAAA,CAAA,WAAA;AAAA,IACZ,sBAAkB,EAAA,EAAA;AAAA,IAClB,YAAM,IAAA,CAAA,QAAA;AAAA,IACN,qBAAI,EAAA,MAAA,CAAG,CAAA,CAAA,KAAA,MAAK,CAAA,CAAK,CAAA,GAAA,CAAA,KAAK,KAAA,IAAA,CAAS,KAAK,CAAA,mBAAA,EAAA,KAAA,CAAA,CAAA;AAAA,IACpC,QAAK,EAAA,MAAA,CAAA,CAAA,CAAA,KAAA,MAAA,CAAA,CAAA,CAAG,GAAA,CAAU,KAAA,KAAA,IAAA,CAAA,KAAK,CAAA,QAAA,EAAU,KAAK,CAAA,CAAA;AAAA,IACtC,MAAO,EAAA,MAAA,CAAE,CAAK,CAAA,KAAA,MAAA,CAAA,CAAA,CAAA,GAAA,CAAA,KAAA,KAAA,IAAA,CAAA,KAAA,CAAA,MAAA,EAAA,KAAA,CAAA,CAAA;AAAA,IAAA,OAAA,EAAA,MAAA,CAAA,CAAA,CAAA,KAAA,MAAA,CAAA,CAAA,CAAA,GAAA,CAAA,KAAA,KAAA,IAAA,CAAA,KAAA,CAAA,OAAA,EAAA,KAAA,CAAA,CAAA;AAAA,IAEJ,SAAM,IAAA,CAAA,KAAA;AAAA,GAAA,EAAA;AAAA,IACf,MAAA,EAAAC,QAAA,MAAA;AAAA,MAAA,IAAA,CAAA,UAAA,IAAAF,SAAiC,EAAA,EAAuBC,YAAA,kBAAA,EAAA;AAAA,QAAA,GAAA,EAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;"}