{"version":3,"file":"utils.mjs","names":[],"sources":["../../../../../../packages/components/date-picker-panel/src/utils.ts"],"sourcesContent":["import dayjs from 'dayjs'\nimport { isArray, isString } from '@element-plus/utils'\nimport { rangeArr } from '@element-plus/components/time-picker'\n\nimport type { ComputedRef } from 'vue'\nimport type { Dayjs } from 'dayjs'\nimport type { DateCell } from './types'\nimport type { DisabledDateType } from './props/shared'\n\ntype DayRange = [Dayjs | undefined, Dayjs | undefined]\n\nexport const isValidRange = (range: DayRange): boolean => {\n  if (!isArray(range)) return false\n\n  const [left, right] = range\n\n  return (\n    dayjs.isDayjs(left) &&\n    dayjs.isDayjs(right) &&\n    dayjs(left).isValid() &&\n    dayjs(right).isValid() &&\n    left.isSameOrBefore(right)\n  )\n}\n\ntype GetDefaultValueParams = {\n  lang: string\n  step?: number\n  unit: 'month' | 'year'\n  unlinkPanels: boolean\n}\n\nexport type DefaultValue = [Date, Date] | Date | undefined\n\nexport const getDefaultValue = (\n  defaultValue: DefaultValue,\n  { lang, step = 1, unit, unlinkPanels }: GetDefaultValueParams\n) => {\n  let start: Dayjs\n\n  if (isArray(defaultValue)) {\n    let [left, right] = defaultValue.map((d) => dayjs(d).locale(lang))\n    if (!unlinkPanels) {\n      right = left.add(step, unit)\n    }\n    return [left, right]\n  } else if (defaultValue) {\n    start = dayjs(defaultValue)\n  } else {\n    start = dayjs()\n  }\n  start = start.locale(lang)\n  return [start, start.add(step, unit)]\n}\n\ntype Dimension = {\n  row: number\n  column: number\n}\n\ntype BuildPickerTableMetadata = {\n  startDate?: Dayjs | null\n  unit: 'month' | 'day'\n  columnIndexOffset: number\n  now: Dayjs\n  nextEndDate: Dayjs | null\n  relativeDateGetter: (index: number) => Dayjs\n  setCellMetadata?: (\n    cell: DateCell,\n    dimension: { rowIndex: number; columnIndex: number }\n  ) => void\n  setRowMetadata?: (row: DateCell[]) => void\n}\n\nexport const buildPickerTable = (\n  dimension: Dimension,\n  rows: DateCell[][],\n  {\n    columnIndexOffset,\n    startDate,\n    nextEndDate,\n    now,\n    unit,\n    relativeDateGetter,\n    setCellMetadata,\n    setRowMetadata,\n  }: BuildPickerTableMetadata\n) => {\n  for (let rowIndex = 0; rowIndex < dimension.row; rowIndex++) {\n    const row = rows[rowIndex]\n    for (let columnIndex = 0; columnIndex < dimension.column; columnIndex++) {\n      let cell = row[columnIndex + columnIndexOffset]\n      if (!cell) {\n        cell = {\n          row: rowIndex,\n          column: columnIndex,\n          type: 'normal',\n          inRange: false,\n          start: false,\n          end: false,\n        }\n      }\n      const index = rowIndex * dimension.column + columnIndex\n      const nextStartDate = relativeDateGetter(index)\n      cell.dayjs = nextStartDate\n      cell.date = nextStartDate.toDate()\n      cell.timestamp = nextStartDate.valueOf()\n      cell.type = 'normal'\n\n      cell.inRange =\n        !!(\n          startDate &&\n          nextStartDate.isSameOrAfter(startDate, unit) &&\n          nextEndDate &&\n          nextStartDate.isSameOrBefore(nextEndDate, unit)\n        ) ||\n        !!(\n          startDate &&\n          nextStartDate.isSameOrBefore(startDate, unit) &&\n          nextEndDate &&\n          nextStartDate.isSameOrAfter(nextEndDate, unit)\n        )\n\n      if (startDate?.isSameOrAfter(nextEndDate)) {\n        cell.start = !!nextEndDate && nextStartDate.isSame(nextEndDate, unit)\n        cell.end = startDate && nextStartDate.isSame(startDate, unit)\n      } else {\n        cell.start = !!startDate && nextStartDate.isSame(startDate, unit)\n        cell.end = !!nextEndDate && nextStartDate.isSame(nextEndDate, unit)\n      }\n\n      const isToday = nextStartDate.isSame(now, unit)\n\n      if (isToday) {\n        cell.type = 'today'\n      }\n      setCellMetadata?.(cell, { rowIndex, columnIndex })\n      row[columnIndex + columnIndexOffset] = cell\n    }\n    setRowMetadata?.(row)\n  }\n}\n\nexport const datesInMonth = (\n  date: Dayjs,\n  year: number,\n  month: number,\n  lang: string\n) => {\n  const firstDay = dayjs()\n    .locale(lang)\n    .startOf('month')\n    .month(month)\n    .year(year)\n    .hour(date.hour())\n    .minute(date.minute())\n    .second(date.second())\n\n  const numOfDays = firstDay.daysInMonth()\n  return rangeArr(numOfDays).map((n) => firstDay.add(n, 'day').toDate())\n}\n\nexport const getValidDateOfMonth = (\n  date: Dayjs,\n  year: number,\n  month: number,\n  lang: string,\n  disabledDate?: DisabledDateType\n) => {\n  const _value = dayjs()\n    .year(year)\n    .month(month)\n    .startOf('month')\n    .hour(date.hour())\n    .minute(date.minute())\n    .second(date.second())\n  const _date = datesInMonth(date, year, month, lang).find((date) => {\n    return !disabledDate?.(date)\n  })\n  if (_date) {\n    return dayjs(_date).locale(lang)\n  }\n  return _value.locale(lang)\n}\n\nexport const getValidDateOfYear = (\n  value: Dayjs,\n  lang: string,\n  disabledDate?: DisabledDateType\n) => {\n  const year = value.year()\n  if (!disabledDate?.(value.toDate())) {\n    return value.locale(lang)\n  }\n  const month = value.month()\n  if (!datesInMonth(value, year, month, lang).every(disabledDate)) {\n    return getValidDateOfMonth(value, year, month, lang, disabledDate)\n  }\n  for (let i = 0; i < 12; i++) {\n    if (!datesInMonth(value, year, i, lang).every(disabledDate)) {\n      return getValidDateOfMonth(value, year, i, lang, disabledDate)\n    }\n  }\n  return value\n}\n\nexport const correctlyParseUserInput = (\n  value: string | Dayjs | Dayjs[],\n  format: string,\n  lang: string,\n  defaultFormat: ComputedRef<boolean> | undefined\n): Dayjs | Dayjs[] => {\n  if (isArray(value)) {\n    return value.map(\n      (v) => correctlyParseUserInput(v, format, lang, defaultFormat) as Dayjs\n    )\n  }\n  if (isString(value)) {\n    const dayjsValue = defaultFormat?.value\n      ? dayjs(value)\n      : dayjs(value, format)\n    if (!dayjsValue.isValid()) {\n      // return directly if not valid\n      return dayjsValue\n    }\n  }\n  return dayjs(value, format).locale(lang)\n}\n"],"mappings":"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"}