{"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 { 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 datesInQuarter = (\n  date: Dayjs,\n  year: number,\n  quarter: number,\n  lang: string\n) => {\n  const firstMonth = quarter * 3\n  return [0, 1, 2].reduce<Date[]>(\n    (acc, i) => acc.concat(datesInMonth(date, year, firstMonth + i, lang)),\n    []\n  )\n}\n\nexport const isQuarterFullyDisabled = (\n  value: Dayjs,\n  lang: string,\n  disabledDate?: DisabledDateType\n) => {\n  if (!disabledDate) return false\n\n  return datesInQuarter(value, value.year(), value.quarter() - 1, lang).every(\n    disabledDate\n  )\n}\n\nexport const isSelectableQuarterDate = (\n  value: Dayjs,\n  lang: string,\n  disabledDate?: DisabledDateType\n) => {\n  return (\n    (disabledDate ? !disabledDate(value.toDate()) : true) &&\n    !isQuarterFullyDisabled(value, lang, disabledDate)\n  )\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 getValidDateOfQuarter = (\n  date: Dayjs,\n  year: number,\n  quarter: number,\n  lang: string,\n  disabledDate?: DisabledDateType\n) => {\n  const firstMonth = quarter * 3\n  for (let i = 0; i < 3; i++) {\n    const month = firstMonth + i\n    if (\n      !datesInMonth(date, year, month, lang).every((d) => disabledDate?.(d))\n    ) {\n      return getValidDateOfMonth(date, year, month, lang, disabledDate)\n    }\n  }\n  return dayjs()\n    .year(year)\n    .month(firstMonth)\n    .startOf('month')\n    .hour(date.hour())\n    .minute(date.minute())\n    .second(date.second())\n    .locale(lang)\n}\n\nexport const normalizeQuarterDate = (\n  value: Dayjs,\n  lang: string,\n  disabledDate?: DisabledDateType\n) => {\n  if (!dayjs.isDayjs(value) || !value.isValid()) {\n    return value\n  }\n\n  return getValidDateOfQuarter(\n    value.startOf('day'),\n    value.year(),\n    value.quarter() - 1,\n    lang,\n    disabledDate\n  )\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): Dayjs | Dayjs[] => {\n  if (isArray(value)) {\n    return value.map((v) => correctlyParseUserInput(v, format, lang) as Dayjs)\n  }\n  if (isString(value)) {\n    let dayjsValue = dayjs(value, format)\n    if (!dayjsValue.isValid()) {\n      dayjsValue = dayjs(value)\n    }\n    if (!dayjsValue.isValid()) {\n      // return directly if not valid\n      return dayjsValue\n    }\n    const formatValue = dayjsValue.format(format)\n    // Strictly validate date validity\n    if (!dayjs(formatValue, format, true).isValid()) {\n      return dayjs('')\n    }\n    return dayjs(formatValue, format).locale(lang)\n  }\n  return dayjs(value, format).locale(lang)\n}\n"],"mappings":"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"}