{"version":3,"file":"index.mjs","sources":["../../../../src/components/DateRangePicker/index.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { onClickOutside } from '@vueuse/core';\nimport RobustFloating from '../Floating/index.vue';\n\nimport {\n  RobustCalendar,\n  RobustInputWrapper,\n  RobustButton,\n  RobustDatePicker,\n  RobustModal,\n} from '..';\nimport { PhCaretLeft, PhCaretRight, PhXCircle } from '@phosphor-icons/vue';\nimport { computed, onMounted, PropType, ref, watch } from 'vue';\nimport defaultPresets, { Filter, Preset } from '../Calendar/presets';\nimport {\n  addDays,\n  addMonths,\n  addYears,\n  differenceInDays,\n  endOfMonth,\n  endOfYear,\n  isAfter,\n  isBefore,\n  isSameDay,\n  startOfMonth,\n  startOfYear,\n  subDays,\n  subMonths,\n  subYears,\n} from 'date-fns';\n\nconst props = defineProps({\n  title: {\n    type: String,\n    default: undefined,\n  },\n  hint: {\n    type: String,\n    default: undefined,\n  },\n  dateRange: {\n    type: Object as PropType<[Date, Date]>,\n    required: true,\n  },\n  dateRangeComparison: {\n    type: Object as PropType<[Date, Date]>,\n    default: undefined,\n  },\n  enableComparison: {\n    type: Boolean,\n    default: () => false,\n  },\n  showComparison: {\n    type: Boolean,\n    default: () => false,\n  },\n  perspectiveDate: {\n    type: Date,\n    default: undefined,\n  },\n  perspectiveDateComparison: {\n    type: Date,\n    default: undefined,\n  },\n  enablePerspective: {\n    type: Boolean,\n    default: () => false,\n  },\n  enableMainPerspective: {\n    type: Boolean,\n    default: () => true,\n  },\n  enableComparisonPerspective: {\n    type: Boolean,\n    default: () => true,\n  },\n  enableMainPreset: {\n    type: Boolean,\n    default: () => true,\n  },\n  enableComparisonPreset: {\n    type: Boolean,\n    default: () => true,\n  },\n  readOnlyMainCalendar: {\n    type: Boolean,\n    default: () => false,\n  },\n  readOnlyComparisonCalendar: {\n    type: Boolean,\n    default: () => false,\n  },\n  error: {\n    type: String,\n    default: undefined,\n  },\n  class: {\n    type: String,\n    default: undefined,\n  },\n  condensed: {\n    type: Boolean,\n    default: false,\n  },\n  dateHistory: {\n    type: Array,\n    default: () => [],\n  },\n  activePreset: {\n    type: String,\n    default: () => undefined,\n  },\n  activePresetComparison: {\n    type: String,\n    default: () => undefined,\n  },\n  perspectivePreset: {\n    type: String,\n    default: () => undefined,\n  },\n  perspectivePresetComparison: {\n    type: String,\n    default: () => undefined,\n  },\n  presetsMain: {\n    type: Array as PropType<Preset[]>,\n    default: () => defaultPresets,\n  },\n  presetsComparison: {\n    type: Array as PropType<Preset[]>,\n    default: () => defaultPresets,\n  },\n  filters: {\n    type: Array as PropType<Array<Filter>>,\n    default: () => [],\n  },\n  filter: {\n    type: String || Number,\n    default: () => undefined,\n  },\n  comparisonFilters: {\n    type: Array as PropType<Array<Filter>>,\n    default: () => [],\n  },\n  comparisonFilter: {\n    type: String || Number,\n    default: () => undefined,\n  },\n  past: {\n    type: Boolean,\n    default: true,\n  },\n  future: {\n    type: Boolean,\n    default: true,\n  },\n  perspectiveTitle: {\n    type: String,\n    default: 'Perspective of',\n  },\n  type: {\n    type: String as PropType<'dropdown' | 'modal'>,\n    default: 'dropdown',\n  },\n});\n\nconst emit = defineEmits([\n  'blur',\n  'focus',\n  'update:dateRange',\n  'update:dateRangeComparison',\n  'update:perspectiveDate',\n  'update:perspectiveDateComparison',\n  'update:activePreset',\n  'update:activePresetComparison',\n  'update:perspectivePreset',\n  'update:perspectivePresetComparison',\n  'update:showComparison',\n  'update:filter',\n  'update:comparisonFilter',\n  'comparisonCleared',\n  'change',\n]);\n\nconst openMain = ref(false);\nconst openComparison = ref(false);\nconst inputWrapperMainRef = ref();\nconst inputWrapperComparisonRef = ref();\nconst mainCalendar = ref();\nconst isClearComparisonOnHover = ref(false);\n\nconst presetsMainComputed = computed(() =>\n  props.presetsMain.filter((d) => d.type === 'range')\n);\n\nconst presetsComparisonComputed = computed(() =>\n  props.presetsComparison.filter((d) => d.type === 'range')\n);\n\nconst filtersComputed = computed(() => props.filters || []);\n\nconst mainFiltersComputed = computed<Filter[]>(() => props.filters);\n\nconst comparisonFiltersComputed = computed<Filter[]>(\n  () => props.comparisonFilters\n);\n\nconst computedMainFilterPreset = computed(() => {\n  if (!props.filter) {\n    return undefined;\n  }\n\n  const foundFilter = mainFiltersComputed.value.find(\n    (f) => f.key === props.filter\n  );\n\n  return foundFilter;\n});\n\nconst computedComparisonFilterPreset = computed(() => {\n  if (!props.comparisonFilter) {\n    return undefined;\n  }\n\n  const foundFilter = comparisonFiltersComputed.value.find(\n    (f) => f.key === props.comparisonFilter\n  );\n\n  return foundFilter;\n});\n\n// const enabledHistory = ref(false);\n// const displayCompare = ref();\n// const storeHistory = ref(true);\nconst mainElementRef = ref();\nconst activeSection = ref<'comparison' | 'main'>('main');\n\nconst isDateRange = (value: any) => {\n  return !(\n    !value ||\n    !Array.isArray(value) ||\n    value.length < 2 ||\n    value.some((d) => !(d instanceof Date))\n  );\n};\n\nconst isPast = (date: Date) => {\n  const today = new Date();\n  today.setHours(0, 0, 0, 0);\n  return isBefore(date, today);\n};\n\nconst isFuture = (date: Date) => {\n  const today = new Date();\n  today.setHours(23, 59, 59, 999);\n  return isAfter(date, today);\n};\n\nconst stagedDateRangeComparison = ref<[Date, Date] | []>();\nwatch(\n  () => props.dateRangeComparison,\n  (value) => {\n    if (!isDateRange(value)) {\n      return (stagedDateRangeComparison.value = []);\n    }\n    stagedDateRangeComparison.value = value;\n  },\n  { immediate: true }\n);\n\nconst stagedPerspectiveDateComparison = ref<Date>();\nwatch(\n  () => props.perspectiveDateComparison,\n  (value) => {\n    if (!value || !(value instanceof Date)) {\n      return (stagedPerspectiveDateComparison.value = undefined);\n    }\n    stagedPerspectiveDateComparison.value = value;\n  },\n  { immediate: true }\n);\n\nconst stagedDateRange = ref<[Date, Date] | []>();\nwatch(\n  () => props.dateRange,\n  (value) => {\n    if (!isDateRange(value)) {\n      return (stagedDateRange.value = []);\n    }\n    stagedDateRange.value = value;\n\n    if (computedComparisonFilterPreset.value) {\n      if (computedComparisonFilterPreset.value.eval) {\n        stagedDateRangeComparison.value =\n          computedComparisonFilterPreset.value.eval(stagedDateRange.value) as [\n            Date,\n            Date,\n          ];\n        emit('update:dateRangeComparison', stagedDateRangeComparison.value);\n      }\n      if (computedComparisonFilterPreset.value.evalPerspective) {\n        stagedPerspectiveDateComparison.value =\n          computedComparisonFilterPreset.value.evalPerspective(\n            stagedDateRange.value\n          );\n        emit(\n          'update:perspectiveDateComparison',\n          stagedPerspectiveDateComparison.value\n        );\n      }\n    }\n  },\n  { immediate: true }\n);\n\nconst stagedPerspectiveDate = ref<Date>();\nwatch(\n  () => props.perspectiveDate,\n  (value) => {\n    if (!value || !(value instanceof Date)) {\n      return (stagedPerspectiveDate.value = undefined);\n    }\n    stagedPerspectiveDate.value = value;\n  },\n  { immediate: true }\n);\n\nconst stagedActivePreset = ref();\nwatch(\n  () => props.activePreset,\n  (value) => {\n    stagedActivePreset.value = value;\n  },\n  { immediate: true }\n);\nconst stagedActivePresetComparison = ref<string>();\nwatch(\n  () => props.activePresetComparison,\n  (value) => {\n    stagedActivePresetComparison.value = value;\n  },\n  { immediate: true }\n);\n\nconst stagedPerspectivePreset = ref<string>();\nwatch(\n  () => props.perspectivePreset,\n  (value) => {\n    stagedPerspectivePreset.value = value;\n  },\n  { immediate: true }\n);\n\nconst stagedPerspectivePresetComparison = ref<string>();\nwatch(\n  () => props.perspectivePresetComparison,\n  (value) => {\n    stagedPerspectivePresetComparison.value = value;\n  },\n  { immediate: true }\n);\n\nconst showComparisonPicker = computed({\n  get: () => props.showComparison,\n  set: (value) => {\n    if (value) {\n      activeSection.value = 'comparison';\n    }\n    emit('update:showComparison', value);\n  },\n});\n\nwatch(showComparisonPicker, (value) => {\n  if (value) {\n    // if date range is set, set comparison date range to the same\n    if (stagedDateRange.value.length > 1) {\n      stagedDateRangeComparison.value = [\n        stagedDateRange.value[0],\n        stagedDateRange.value[1],\n      ];\n    } else {\n      stagedDateRangeComparison.value = [new Date(), new Date()];\n    }\n  } else {\n    stagedDateRangeComparison.value = undefined;\n    stagedPerspectivePresetComparison.value = undefined;\n    stagedActivePresetComparison.value = undefined;\n    stagedPerspectiveDateComparison.value = undefined;\n  }\n});\n\nconst stagedActiveMainFilter = ref<string | number>();\nwatch(\n  () => props.filter,\n  (value) => {\n    stagedActiveMainFilter.value = value;\n\n    if (\n      computedMainFilterPreset.value &&\n      computedMainFilterPreset.value.evalPerspective\n    ) {\n      stagedPerspectiveDate.value =\n        computedMainFilterPreset.value.evalPerspective(\n          stagedDateRange.value as [Date, Date]\n        );\n    }\n  },\n  { immediate: true }\n);\n\nconst stagedActiveComparisonFilter = ref<string | number>();\nwatch(\n  () => props.comparisonFilter,\n  (value) => {\n    stagedActiveComparisonFilter.value = value;\n\n    if (\n      computedComparisonFilterPreset.value &&\n      computedComparisonFilterPreset.value.evalPerspective\n    ) {\n      stagedPerspectiveDateComparison.value =\n        computedComparisonFilterPreset.value.evalPerspective(\n          stagedDateRange.value as [Date, Date]\n        );\n    }\n  },\n  { immediate: true }\n);\n// type DateType = DateTypeCustom | DateTypePreset;\n\nconst computedEnableMainPreset = ref(props.enableMainPreset);\n\nconst computedMainReadOnly = computed(() => {\n  if (\n    props.readOnlyMainCalendar === true ||\n    (computedMainFilterPreset.value &&\n      computedMainFilterPreset.value.disableEdit)\n  ) {\n    return true;\n  } else {\n    return false;\n  }\n});\n\nconst computedEnableMainPerspective = computed(() => {\n  if (!props.enablePerspective || !props.enableMainPerspective) {\n    return false;\n  }\n\n  if (\n    computedMainFilterPreset.value &&\n    computedMainFilterPreset.value.disablePerspective\n  ) {\n    return false;\n  } else {\n    return true;\n  }\n});\n\nconst computedEnableComparisonPerspective = computed(() => {\n  if (!props.enablePerspective || !props.enableComparisonPerspective) {\n    return false;\n  }\n\n  if (\n    computedComparisonFilterPreset.value &&\n    computedComparisonFilterPreset.value.disablePerspective\n  ) {\n    return false;\n  } else {\n    return true;\n  }\n});\n\nconst computedComparisonReadOnly = computed(() => {\n  if (\n    props.readOnlyComparisonCalendar === true ||\n    (computedComparisonFilterPreset.value &&\n      computedComparisonFilterPreset.value.disableEdit)\n  ) {\n    return true;\n  } else {\n    return false;\n  }\n});\n\nconst enableComparisonPreset = ref(props.enableComparisonPreset);\n\nconst hideMainCalendar = ref(false);\nconst hideComparisonCalendar = ref(false);\n\ninterface DateTypeCustom {\n  name: 'custom';\n}\n\ninterface DateTypePreset {\n  name: 'preset';\n  value: string;\n}\n\nconst perspectiveDatePresets = computed(() =>\n  props.presetsMain.filter((d) => d.type === 'perspective')\n);\n\nconst displayDate = computed(() => {\n  if (!isDateRange(props.dateRange)) {\n    return 'Select date';\n  }\n\n  const realDate = props.dateRange;\n  if (isDaterangeFullMonth(realDate) || displayPreset.value) {\n    const monthFormatter = Intl.DateTimeFormat(navigator.language, {\n      month: 'short',\n    });\n\n    return (\n      monthFormatter.format(realDate[0]) + '. ' + realDate[0].getFullYear()\n    );\n  } else if (isDaterangeFullYear(realDate)) {\n    return realDate[0].getFullYear();\n  } else {\n    const formatter = Intl.DateTimeFormat(navigator.language, {\n      day: '2-digit',\n      month: '2-digit',\n      year: 'numeric',\n    });\n    return (\n      formatter.format(realDate[0]) + ' - ' + formatter.format(realDate[1])\n    );\n  }\n});\n\nconst displayComparisonDate = computed(() => {\n  if (!props.enableComparison) {\n    return undefined;\n  }\n\n  if (!isDateRange(props.dateRangeComparison)) {\n    return 'Select Comparison';\n  }\n\n  const realDate = props.dateRangeComparison;\n  if (isDaterangeFullMonth(realDate) || displayComparisonPreset.value) {\n    const monthFormatter = Intl.DateTimeFormat(navigator.language, {\n      month: 'short',\n    });\n\n    return (\n      'vs. ' +\n      monthFormatter.format(realDate[0]) +\n      '. ' +\n      realDate[0].getFullYear()\n    );\n  } else if (isDaterangeFullYear(realDate)) {\n    return 'vs. ' + realDate[0].getFullYear();\n  } else {\n    const formatter = Intl.DateTimeFormat(navigator.language, {\n      day: '2-digit',\n      month: '2-digit',\n      year: 'numeric',\n    });\n    return (\n      'vs. ' +\n      formatter.format(realDate[0]) +\n      ' - ' +\n      formatter.format(realDate[1])\n    );\n  }\n});\n\nconst displayPreset = computed(() => {\n  if (!isDateRange(props.dateRange)) {\n    return undefined;\n  }\n  if (props.activePreset) {\n    const preset = props.presetsMain.find((d) => d.key === props.activePreset);\n    return preset?.title;\n  }\n\n  return undefined;\n});\n\nconst displayComparisonPreset = computed(() => {\n  if (!isDateRange(props.dateRangeComparison)) {\n    return undefined;\n  }\n\n  if (props.comparisonFilter) {\n    if (computedComparisonFilterPreset.value?.eval) {\n      return `vs. ${computedComparisonFilterPreset.value?.title}`;\n    }\n  }\n  if (props.activePresetComparison) {\n    const preset = props.presetsComparison.find(\n      (d) => d.key === props.activePresetComparison\n    );\n\n    if (!preset) {\n      return undefined;\n    }\n\n    return `vs. ${preset?.title}`;\n  }\n\n  return undefined;\n});\n\nonClickOutside(mainElementRef, (event) => {\n  if ((!openMain.value && !openComparison.value) || props.type === 'modal') {\n    return;\n  }\n\n  if (isClearComparisonOnHover.value) {\n    return clearComparisonDate();\n  }\n\n  if (\n    inputWrapperMainRef.value?.wrapperRef.contains(event.target) ||\n    inputWrapperComparisonRef.value?.wrapperRef.contains(event.target)\n  ) {\n    event.stopPropagation();\n  }\n\n  closeDropdown();\n});\n\nfunction isDaterangeFullMonth(range: [Date, Date]) {\n  if (!range[0] || !range[1] || range[0].getMonth() !== range[1].getMonth()) {\n    return false;\n  }\n\n  if (\n    isSameDay(startOfMonth(range[0]), range[0]) &&\n    isSameDay(endOfMonth(range[1]), range[1])\n  ) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction isDaterangeFullYear(range: [Date, Date]) {\n  if (\n    !range[0] ||\n    !range[1] ||\n    range[0].getFullYear() !== range[1].getFullYear()\n  ) {\n    return false;\n  }\n\n  if (\n    isSameDay(startOfYear(range[0]), range[0]) &&\n    isSameDay(endOfYear(range[1]), range[1])\n  ) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction subTimeframeFromDate() {\n  if (!isDateRange(props.dateRange)) {\n    return;\n  }\n\n  let bufferDateRange: [Date, Date];\n\n  if (isDaterangeFullMonth(props.dateRange)) {\n    const previousMonthDate = subMonths(props.dateRange[0], 1);\n    const previousMonthStart = new Date(startOfMonth(previousMonthDate));\n    const previousMonthEnd = new Date(endOfMonth(previousMonthDate));\n\n    bufferDateRange = [previousMonthStart, previousMonthEnd];\n  } else if (isDaterangeFullYear(props.dateRange)) {\n    const previousYearDate = subYears(props.dateRange[0], 1);\n    const previousYearStart = new Date(startOfYear(previousYearDate));\n    const previousYearEnd = new Date(endOfYear(previousYearDate));\n\n    bufferDateRange = [previousYearStart, previousYearEnd];\n  } else {\n    const diffDays = Math.abs(\n      differenceInDays(stagedDateRange.value[0], stagedDateRange.value[1])\n    );\n    const refDate: [Date, Date] = [\n      subDays(stagedDateRange.value[0], diffDays + 1),\n      subDays(stagedDateRange.value[0], 1),\n    ];\n\n    bufferDateRange = refDate;\n  }\n\n  if (props.past === false) {\n    if (isPast(bufferDateRange[0]) && isPast(bufferDateRange[1])) {\n      return;\n    } else if (isPast(bufferDateRange[0])) {\n      bufferDateRange[0] = new Date();\n    }\n  }\n\n  stagedDateRange.value = bufferDateRange;\n  stagedActivePreset.value && (stagedActivePreset.value = undefined);\n  saveTime();\n}\n\nfunction addTimeframeFromDate() {\n  if (!isDateRange(props.dateRange)) {\n    return;\n  }\n\n  let bufferDateRange: [Date, Date];\n\n  if (isDaterangeFullMonth(props.dateRange)) {\n    const previousMonthDate = addMonths(props.dateRange[0], 1);\n    const previousMonthStart = new Date(startOfMonth(previousMonthDate));\n    const previousMonthEnd = new Date(endOfMonth(previousMonthDate));\n\n    bufferDateRange = [previousMonthStart, previousMonthEnd];\n  } else if (isDaterangeFullYear(props.dateRange)) {\n    const previousYearDate = addYears(props.dateRange[0], 1);\n    const previousYearStart = new Date(startOfYear(previousYearDate));\n    const previousYearEnd = new Date(endOfYear(previousYearDate));\n\n    bufferDateRange = [previousYearStart, previousYearEnd];\n  } else {\n    const diffDays = Math.abs(\n      differenceInDays(stagedDateRange.value[0], stagedDateRange.value[1])\n    );\n\n    const refDate: [Date, Date] = [\n      addDays(stagedDateRange.value[1], 1),\n      addDays(stagedDateRange.value[1], diffDays + 1),\n    ];\n\n    bufferDateRange = refDate;\n  }\n\n  if (props.future === false) {\n    if (isFuture(bufferDateRange[0]) && isFuture(bufferDateRange[1])) {\n      return;\n    } else if (isFuture(bufferDateRange[1])) {\n      bufferDateRange[1] = new Date();\n    }\n  }\n\n  stagedDateRange.value = bufferDateRange;\n  stagedActivePreset.value && (stagedActivePreset.value = undefined);\n  saveTime();\n}\n\nfunction closeDropdown() {\n  if (openMain.value === true) {\n    openMain.value = false;\n    emit('blur');\n  }\n\n  if ((openComparison.value = true)) {\n    openComparison.value = false;\n  }\n}\n\nconst wrapperAttrs = computed(() => {\n  if (props.type === 'modal') {\n    return {\n      opened:\n        activeSection.value === 'main' ? openMain.value : openComparison.value,\n      size: 'xl',\n      center: true,\n      'onUpdate:opened': (value: boolean) => {\n        activeSection.value === 'main'\n          ? (openMain.value = false)\n          : (openComparison.value = false);\n      },\n    };\n  }\n  return {\n    open:\n      activeSection.value === 'main' ? openMain.value : openComparison.value,\n    class: 'z-[100] origin-top-left',\n    reference:\n      activeSection.value === 'main'\n        ? inputWrapperMainRef.value?.wrapperRef\n        : inputWrapperComparisonRef.value?.wrapperRef,\n    options: {\n      placement: 'bottom-start',\n    },\n  };\n});\n\nconst filterUpdated = (filterValue: string | number) => {\n  emit('update:filter', filterValue);\n\n  const foundFilter = mainFiltersComputed.value.find(\n    (filter) => filter.key === filterValue\n  );\n  stagedActiveMainFilter.value = filterValue;\n  if (foundFilter.disableCalendar) {\n    hideMainCalendar.value = true;\n  } else {\n    hideMainCalendar.value = false;\n  }\n\n  if (props.enableMainPreset !== false) {\n    if (foundFilter?.disablePreset) {\n      computedEnableMainPreset.value = false;\n    } else {\n      computedEnableMainPreset.value = true;\n    }\n  } else {\n    return presetsMainComputed.value.length !== 0;\n  }\n};\n\nconst filterComparisonUpdated = (filterValue: string | number) => {\n  emit('update:comparisonFilter', filterValue);\n\n  const foundFilter = comparisonFiltersComputed.value.find(\n    (filter) => filter.key === filterValue\n  );\n  stagedActiveComparisonFilter.value = filterValue;\n  if (foundFilter?.disableCalendar) {\n    hideComparisonCalendar.value = true;\n  } else {\n    hideComparisonCalendar.value = false;\n  }\n\n  if (props.enableComparisonPreset !== false) {\n    if (foundFilter?.disablePreset) {\n      enableComparisonPreset.value = false;\n    } else {\n      enableComparisonPreset.value = true;\n    }\n  } else {\n    return presetsComparisonComputed.value.length !== 0;\n  }\n};\n\nconst openMainModal = () => {\n  openMain.value = true;\n  activeSection.value = 'main';\n};\n\nconst openComparisonModal = () => {\n  openComparison.value = true;\n  activeSection.value = 'comparison';\n};\n\nconst clearComparisonDate = () => {\n  const foundDefaultFilter = comparisonFiltersComputed.value.find(\n    (filter) => filter.default\n  );\n  stagedActiveComparisonFilter.value = foundDefaultFilter?.key || undefined;\n  hideComparisonCalendar.value = foundDefaultFilter?.disableCalendar || false;\n  stagedPerspectiveDateComparison.value = undefined;\n  stagedActivePresetComparison.value = undefined;\n  isClearComparisonOnHover.value = false;\n  stagedDateRangeComparison.value = [];\n  openComparison.value = false;\n  emit('comparisonCleared');\n  saveTime();\n};\n\nconst saveTime = async () => {\n  emit(\n    'update:dateRange',\n    stagedDateRange.value?.length ? stagedDateRange.value : undefined\n  );\n  emit(\n    'update:dateRangeComparison',\n    stagedDateRangeComparison.value?.length\n      ? stagedDateRangeComparison.value\n      : undefined\n  );\n  emit('update:perspectiveDate', stagedPerspectiveDate.value);\n  emit(\n    'update:perspectiveDateComparison',\n    stagedPerspectiveDateComparison.value\n  );\n  emit('update:activePreset', stagedActivePreset.value);\n  emit('update:activePresetComparison', stagedActivePresetComparison.value);\n  emit('update:perspectivePreset', stagedPerspectivePreset.value);\n  emit(\n    'update:perspectivePresetComparison',\n    stagedPerspectivePresetComparison.value\n  );\n  emit('update:filter', stagedActiveMainFilter.value);\n  emit('update:comparisonFilter', stagedActiveComparisonFilter.value);\n  emit('change', stagedDateRange.value);\n  emit('blur');\n  openMain.value = false;\n  openComparison.value = false;\n};\n\nconst stagedPresetReferenceDate = computed(() => {\n  if (stagedDateRange.value && stagedDateRange.value.length === 2) {\n    return stagedDateRange.value;\n  } else {\n    return undefined;\n  }\n});\n\nonMounted(() => {\n  const foundFilter = mainFiltersComputed.value.find(\n    (filter) => filter.key === props.filter\n  );\n\n  if (foundFilter) {\n    if (foundFilter.disableCalendar) {\n      hideMainCalendar.value = true;\n    } else {\n      hideMainCalendar.value = false;\n    }\n\n    if (foundFilter.disablePreset) {\n      computedEnableMainPreset.value = false;\n    } else {\n      computedEnableMainPreset.value = true;\n    }\n  }\n\n  if (props.enableComparison) {\n    const foundComparisonFilter = comparisonFiltersComputed.value.find(\n      (filter) => filter.key === props.comparisonFilter\n    );\n\n    if (foundComparisonFilter) {\n      if (foundComparisonFilter.disableCalendar) {\n        hideComparisonCalendar.value = true;\n      } else {\n        hideComparisonCalendar.value = false;\n      }\n\n      if (foundComparisonFilter.disablePreset) {\n        enableComparisonPreset.value = false;\n      } else {\n        enableComparisonPreset.value = true;\n      }\n    }\n  }\n});\n</script>\n\n<template>\n  <div class=\"flex flex-col gap-y-2\">\n    <label\n      v-if=\"title\"\n      class=\"mb-1 block select-none text-sm font-medium text-gray-500 dark:text-gray-400\"\n    >\n      {{ title }}\n    </label>\n    <div\n      class=\"flex flex-wrap gap-x-1 gap-y-1\"\n      :class=\"enableComparison && 'justify-center items-center'\"\n    >\n      <div class=\"flex justify-center items-center\">\n        <RobustButton\n          variant=\"transparent\"\n          class=\"rounded active:bg-primary-500 active:text-white flex justify-center items-center transition-colors duration-100 focus:ring-0\"\n          :condensed=\"condensed\"\n          @click=\"subTimeframeFromDate\"\n          :disabled=\"!props.dateRange || stagedDateRange.length < 2\"\n        >\n          <PhCaretLeft class=\"block\" />\n        </RobustButton>\n        <RobustInputWrapper\n          ref=\"inputWrapperMainRef\"\n          box-class=\"items-center border-0 focus-within:ring-0\"\n          :condensed=\"condensed\"\n          @click.stop=\"openMainModal\"\n        >\n          <RobustButton\n            variant=\"transparent\"\n            ref=\"select\"\n            class=\"w-full select-none items-center bg-transparent text-current outline-none\"\n            :class=\"condensed ? 'px-1' : 'px-2'\"\n            v-bind=\"$attrs\"\n          >\n            <div\n              class=\"flex items-center gap-2\"\n              :class=\"[condensed ? 'text-xs' : 'text-sm']\"\n            >\n              <div class=\"relative flex flex-shrink-0\">\n                <div\n                  :style=\"{ visibility: displayPreset ? 'hidden' : 'visible' }\"\n                  :class=\"condensed ? 'min-w-28' : 'min-w-36'\"\n                  class=\"truncate tabular-nums\"\n                >\n                  {{ displayDate }}\n                </div>\n                <div\n                  v-show=\"displayPreset\"\n                  class=\"absolute inset-0 min-w-0 truncate\"\n                >\n                  {{ displayPreset }}\n                </div>\n              </div>\n              <div\n                v-if=\"\n                  perspectiveDate &&\n                  props.enablePerspective &&\n                  props.enableMainPerspective\n                \"\n                class=\"ml-auto h-[8px] w-[8px] rounded-full bg-primary-300/50\"\n                title=\"Perspective date enabled\"\n              ></div>\n            </div>\n          </RobustButton>\n        </RobustInputWrapper>\n        <RobustButton\n          variant=\"transparent\"\n          class=\"rounded active:bg-primary-500 active:text-white flex justify-center items-center transition-colors duration-100 focus:ring-0\"\n          :condensed=\"condensed\"\n          @click=\"addTimeframeFromDate\"\n          :disabled=\"!props.dateRange || stagedDateRange.length < 2\"\n        >\n          <PhCaretRight class=\"block\" />\n        </RobustButton>\n        <Component\n          :is=\"type === 'modal' ? RobustModal : RobustFloating\"\n          v-bind=\"wrapperAttrs\"\n          ref=\"mainElementRef\"\n        >\n          <section v-if=\"activeSection === 'main'\">\n            <RobustCalendar\n              ref=\"mainCalendar\"\n              v-model=\"stagedDateRange\"\n              v-model:preset=\"stagedActivePreset\"\n              :presets=\"presetsMainComputed\"\n              :filters=\"filtersComputed\"\n              :filter=\"stagedActiveMainFilter\"\n              :future=\"future\"\n              :past=\"past\"\n              :enable-preset=\"computedEnableMainPreset\"\n              :read-only=\"computedMainReadOnly\"\n              :hide-calendar=\"hideMainCalendar\"\n              dual-calendar\n              @update:filter=\"filterUpdated\"\n            >\n            </RobustCalendar>\n            <div\n              v-if=\"computedEnableMainPerspective\"\n              class=\"flex w-full justify-end gap-x-8 items-center py-2 pr-4\"\n              :class=\"hideMainCalendar && 'px-6'\"\n            >\n              <div>\n                {{ perspectiveTitle }}\n              </div>\n              <RobustDatePicker\n                v-model=\"stagedPerspectiveDate\"\n                v-model:preset=\"stagedPerspectivePreset\"\n                placeholder=\"Newest\"\n                condensed\n                resetable\n                :presets=\"perspectiveDatePresets\"\n              />\n            </div>\n          </section>\n\n          <section v-else>\n            <RobustCalendar\n              v-model=\"stagedDateRangeComparison\"\n              v-model:preset=\"stagedActivePresetComparison\"\n              v-model:presetReferenceDate=\"stagedPresetReferenceDate\"\n              v-model:filter=\"stagedActiveComparisonFilter\"\n              :filters=\"comparisonFiltersComputed\"\n              :presets=\"presetsComparisonComputed\"\n              :future=\"future\"\n              :past=\"past\"\n              :enable-preset=\"enableComparisonPreset\"\n              :read-only=\"computedComparisonReadOnly\"\n              variant=\"secondary\"\n              :hide-calendar=\"hideComparisonCalendar\"\n              dual-calendar\n              @update:filter=\"filterComparisonUpdated\"\n            />\n            <div\n              v-if=\"computedEnableComparisonPerspective\"\n              class=\"flex w-full justify-end gap-x-8 items-center py-4 px-4\"\n              :class=\"hideComparisonCalendar && 'px-6'\"\n            >\n              <div>\n                {{ perspectiveTitle }}\n              </div>\n              <RobustDatePicker\n                v-model=\"stagedPerspectiveDateComparison\"\n                v-model:preset=\"stagedPerspectivePresetComparison\"\n                placeholder=\"Newest\"\n                condensed\n                resetable\n                :presets=\"perspectiveDatePresets\"\n              />\n            </div>\n          </section>\n          <div\n            class=\"flex items-start justify-between border-t border-gray-200 p-4 dark:border-gray-700\"\n          >\n            <slot name=\"footer\" />\n            <RobustButton\n              type=\"primary\"\n              class=\"ml-auto\"\n              @click=\"saveTime\"\n              :disabled=\"\n                (activeSection === 'main' && stagedDateRange.length < 2) ||\n                (activeSection === 'comparison' &&\n                  stagedDateRangeComparison?.length < 2)\n              \"\n              >Apply time range</RobustButton\n            >\n          </div>\n        </Component>\n      </div>\n      <RobustInputWrapper\n        v-if=\"enableComparison\"\n        ref=\"inputWrapperComparisonRef\"\n        box-class=\"border-0 overflow-visible focus-within:ring-0\"\n        :condensed=\"condensed\"\n        @click=\"openComparisonModal\"\n      >\n        <RobustButton\n          variant=\"transparent\"\n          class=\"font-normal relative overflow-visible focus:ring-0\"\n          :class=\"condensed ? 'text-xs' : 'text-sm'\"\n          :disabled=\"!props.dateRange || props.dateRange.length < 2\"\n          :condensed=\"condensed\"\n        >\n          <PhXCircle\n            v-if=\"\n              (props.dateRangeComparison &&\n                props.dateRangeComparison.length === 2) ||\n              props.activePresetComparison\n            \"\n            class=\"absolute hover:text-red-500\"\n            :class=\"condensed ? 'top-[1px] right-0' : 'top-0.5 right-[1px]'\"\n            @mouseover=\"isClearComparisonOnHover = true\"\n            @mouseleave=\"isClearComparisonOnHover = false\"\n            :weight=\"isClearComparisonOnHover ? 'fill' : 'regular'\"\n            :size=\"condensed ? 14 : 16\"\n            @click.stop=\"clearComparisonDate\"\n          />\n          <div class=\"flex items-center gap-2 relative\">\n            <div\n              :style=\"{\n                visibility: displayComparisonPreset ? 'hidden' : 'visible',\n              }\"\n              :class=\"condensed ? 'min-w-28' : 'min-w-36'\"\n              class=\"min-w-0 truncate tabular-nums\"\n            >\n              {{ displayComparisonDate }}\n            </div>\n            <div\n              v-show=\"displayComparisonPreset\"\n              class=\"absolute inset-0 min-w-0 truncate\"\n            >\n              {{ displayComparisonPreset }}\n            </div>\n            <div\n              v-if=\"\n                perspectiveDateComparison &&\n                props.enablePerspective &&\n                props.enableComparisonPerspective\n              \"\n              class=\"ml-auto h-[8px] w-[8px] rounded-full bg-primary-300/50\"\n              title=\"Perspective date enabled\"\n            ></div>\n          </div>\n        </RobustButton>\n      </RobustInputWrapper>\n    </div>\n    <div v-if=\"hint !== undefined || error !== undefined\" class=\"mt-2\">\n      <div v-if=\"hint !== undefined\" class=\"select-none text-xs text-gray-400\">\n        {{ hint }}\n      </div>\n      <div\n        v-if=\"error !== undefined\"\n        class=\"select-none text-xs text-red-400 dark:text-red-400\"\n      >\n        {{ error }}\n      </div>\n    </div>\n  </div>\n</template>\n"],"names":["props","__props","emit","__emit","openMain","ref","openComparison","inputWrapperMainRef","inputWrapperComparisonRef","mainCalendar","isClearComparisonOnHover","presetsMainComputed","computed","d","presetsComparisonComputed","filtersComputed","mainFiltersComputed","comparisonFiltersComputed","computedMainFilterPreset","f","computedComparisonFilterPreset","mainElementRef","activeSection","isDateRange","value","isPast","date","today","isBefore","isFuture","isAfter","stagedDateRangeComparison","watch","stagedPerspectiveDateComparison","stagedDateRange","stagedPerspectiveDate","stagedActivePreset","stagedActivePresetComparison","stagedPerspectivePreset","stagedPerspectivePresetComparison","showComparisonPicker","stagedActiveMainFilter","stagedActiveComparisonFilter","computedEnableMainPreset","computedMainReadOnly","computedEnableMainPerspective","computedEnableComparisonPerspective","computedComparisonReadOnly","enableComparisonPreset","hideMainCalendar","hideComparisonCalendar","perspectiveDatePresets","displayDate","realDate","isDaterangeFullMonth","displayPreset","isDaterangeFullYear","formatter","displayComparisonDate","displayComparisonPreset","preset","_a","_b","onClickOutside","event","clearComparisonDate","closeDropdown","range","isSameDay","startOfMonth","endOfMonth","startOfYear","endOfYear","subTimeframeFromDate","bufferDateRange","previousMonthDate","subMonths","previousMonthStart","previousMonthEnd","previousYearDate","subYears","previousYearStart","previousYearEnd","diffDays","differenceInDays","subDays","saveTime","addTimeframeFromDate","addMonths","addYears","addDays","wrapperAttrs","filterUpdated","filterValue","foundFilter","filter","filterComparisonUpdated","openMainModal","openComparisonModal","foundDefaultFilter","stagedPresetReferenceDate","onMounted","foundComparisonFilter"],"mappings":"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"}