{"version":3,"file":"CalendarBody.cjs","sources":["../../../../../src/components/DateTimePickers/TimeRangePicker/CalendarBody.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { useCallback } from 'react';\nimport Calendar, { CalendarType } from 'react-calendar';\n\nimport { GrafanaTheme2, dateTimeParse, DateTime, TimeZone } from '@grafana/data';\nimport { t } from '@grafana/i18n';\n\nimport { useStyles2 } from '../../../themes/ThemeContext';\nimport { Icon } from '../../Icon/Icon';\nimport { getWeekStart, WeekStart } from '../WeekStartPicker';\nimport { adjustDateForReactCalendar } from '../utils/adjustDateForReactCalendar';\n\nimport { TimePickerCalendarProps } from './TimePickerCalendar';\n\nconst weekStartMap: Record<WeekStart, CalendarType> = {\n  saturday: 'islamic',\n  sunday: 'gregory',\n  monday: 'iso8601',\n};\n\nexport function Body({ onChange, from, to, timeZone, weekStart }: TimePickerCalendarProps) {\n  const value = inputToValue(from, to, new Date(), timeZone);\n  const onCalendarChange = useOnCalendarChange(onChange, timeZone);\n  const styles = useStyles2(getBodyStyles);\n  const weekStartValue = getWeekStart(weekStart);\n\n  return (\n    <Calendar\n      selectRange={true}\n      next2Label={null}\n      prev2Label={null}\n      className={styles.body}\n      tileClassName={styles.title}\n      value={value}\n      nextLabel={<Icon name=\"angle-right\" />}\n      nextAriaLabel={t('time-picker.calendar.next-month', 'Next month')}\n      prevLabel={<Icon name=\"angle-left\" />}\n      prevAriaLabel={t('time-picker.calendar.previous-month', 'Previous month')}\n      onChange={onCalendarChange}\n      locale=\"en\"\n      calendarType={weekStartMap[weekStartValue]}\n    />\n  );\n}\n\nBody.displayName = 'Body';\n\nexport function inputToValue(\n  from: DateTime,\n  to: DateTime,\n  invalidDateDefault: Date = new Date(),\n  timezone?: string\n): [Date, Date] {\n  let fromAsDate = from.isValid() ? from.toDate() : invalidDateDefault;\n  let toAsDate = to.isValid() ? to.toDate() : invalidDateDefault;\n\n  if (timezone) {\n    fromAsDate = adjustDateForReactCalendar(fromAsDate, timezone);\n    toAsDate = adjustDateForReactCalendar(toAsDate, timezone);\n  }\n\n  if (fromAsDate > toAsDate) {\n    return [toAsDate, fromAsDate];\n  }\n\n  return [fromAsDate, toAsDate];\n}\n\nfunction useOnCalendarChange(onChange: (from: DateTime, to: DateTime) => void, timeZone?: TimeZone) {\n  return useCallback<NonNullable<React.ComponentProps<typeof Calendar>['onChange']>>(\n    (value) => {\n      if (!Array.isArray(value)) {\n        return console.error('onCalendarChange: should be run in selectRange={true}');\n      }\n\n      if (value[0] && value[1]) {\n        const from = dateTimeParse(dateInfo(value[0]), { timeZone });\n        const to = dateTimeParse(dateInfo(value[1]), { timeZone });\n\n        onChange(from, to);\n      }\n    },\n    [onChange, timeZone]\n  );\n}\n\nfunction dateInfo(date: Date): number[] {\n  return [date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()];\n}\n\nexport const getBodyStyles = (theme: GrafanaTheme2) => {\n  // If a time range is part of only 1 day but does not encompass the whole day,\n  // the class that react-calendar uses is '--hasActive' by itself (without being part of a '--range')\n  const hasActiveSelector = `.react-calendar__tile--hasActive:not(.react-calendar__tile--range)`;\n\n  return {\n    title: css({\n      color: theme.colors.text.primary,\n      backgroundColor: theme.colors.background.primary,\n      fontSize: theme.typography.size.md,\n      border: '1px solid transparent',\n\n      '&:hover, &:focus': {\n        position: 'relative',\n      },\n\n      '&:disabled': {\n        color: theme.colors.action.disabledText,\n        cursor: 'not-allowed',\n      },\n    }),\n    body: css({\n      zIndex: theme.zIndex.modal,\n      backgroundColor: theme.colors.background.elevated,\n      width: '268px',\n\n      '.react-calendar__navigation': {\n        display: 'flex',\n      },\n\n      '.react-calendar__navigation__label, .react-calendar__navigation__arrow, .react-calendar__navigation': {\n        paddingTop: '4px',\n        backgroundColor: 'inherit',\n        color: theme.colors.text.primary,\n        border: 0,\n        fontWeight: theme.typography.fontWeightMedium,\n      },\n\n      '.react-calendar__month-view__weekdays': {\n        backgroundColor: 'inherit',\n        textAlign: 'center',\n        color: theme.colors.primary.text,\n\n        abbr: {\n          border: 0,\n          textDecoration: 'none',\n          cursor: 'default',\n          display: 'block',\n          padding: '4px 0 4px 0',\n        },\n      },\n\n      '.react-calendar__month-view__days': {\n        backgroundColor: 'inherit',\n      },\n\n      '.react-calendar__tile, .react-calendar__tile--now': {\n        marginBottom: '4px',\n        backgroundColor: 'inherit',\n        height: '26px',\n      },\n\n      '.react-calendar__navigation__label, .react-calendar__navigation > button:focus, .time-picker-calendar-tile:focus':\n        {\n          outline: 0,\n        },\n\n      // The --hover modifier is active when the user is selecting a range and hovering over a tile - it shows the pending range.\n      // It is applied to all dates between the clicked date and the hovered date.\n      // The *clicked* date should have primary bg, while *pending* range dates should have hover bg.\n      '.react-calendar__tile--hover': {\n        backgroundColor: theme.colors.action.hover,\n        // eslint-disable-next-line @grafana/no-border-radius-literal\n        borderRadius: 0,\n      },\n\n      '.react-calendar__tile--hoverStart': {\n        borderTopLeftRadius: theme.shape.radius.pill,\n        borderBottomLeftRadius: theme.shape.radius.pill,\n      },\n\n      '.react-calendar__tile--hoverEnd': {\n        borderTopRightRadius: theme.shape.radius.pill,\n        borderBottomRightRadius: theme.shape.radius.pill,\n      },\n\n      // Addiitonally, when hovering a date before clicking any, it should show the hover bg.\n      '.react-calendar__tile:hover:not(.react-calendar__tile--hover):not(.react-calendar__tile--active):not(.react-calendar__tile--hasActive)':\n        {\n          backgroundColor: theme.colors.action.hover,\n          borderRadius: theme.shape.radius.pill,\n        },\n\n      // When the user is selecting a range (they've clicked one date, tiles have --hover), both --rangeStart and --rangeEnd are on the tile.\n      // The --hover classes above  handle the rounding of the tiles so they're contigious with the range\n      [`${hasActiveSelector}, .react-calendar__tile--rangeStart:not(.react-calendar__tile--hover)`]: {\n        borderTopLeftRadius: theme.shape.radius.pill,\n        borderBottomLeftRadius: theme.shape.radius.pill,\n      },\n\n      [`${hasActiveSelector}, .react-calendar__tile--rangeEnd:not(.react-calendar__tile--hover)`]: {\n        borderTopRightRadius: theme.shape.radius.pill,\n        borderBottomRightRadius: theme.shape.radius.pill,\n      },\n\n      [`${hasActiveSelector}, .react-calendar__tile--active, .react-calendar__tile--rangeEnd, .react-calendar__tile--rangeStart`]:\n        {\n          color: theme.colors.primary.contrastText,\n          fontWeight: theme.typography.fontWeightMedium,\n          background: theme.colors.primary.main,\n          border: '0px',\n        },\n    }),\n  };\n};\n"],"names":["useStyles2","getWeekStart","jsx","Calendar","Icon","t","adjustDateForReactCalendar","useCallback","dateTimeParse","css"],"mappings":";;;;;;;;;;;;;;;;;;;;AAcA,MAAM,YAAA,GAAgD;AAAA,EACpD,QAAA,EAAU,SAAA;AAAA,EACV,MAAA,EAAQ,SAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,KAAK,EAAE,QAAA,EAAU,MAAM,EAAA,EAAI,QAAA,EAAU,WAAU,EAA4B;AACzF,EAAA,MAAM,QAAQ,YAAA,CAAa,IAAA,EAAM,oBAAI,IAAI,IAAA,IAAQ,QAAQ,CAAA;AACzD,EAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AAC/D,EAAA,MAAM,MAAA,GAASA,wBAAW,aAAa,CAAA;AACvC,EAAA,MAAM,cAAA,GAAiBC,6BAAa,SAAS,CAAA;AAE7C,EAAA,uBACEC,cAAA;AAAA,IAACC,yBAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAa,IAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MACZ,UAAA,EAAY,IAAA;AAAA,MACZ,WAAW,MAAA,CAAO,IAAA;AAAA,MAClB,eAAe,MAAA,CAAO,KAAA;AAAA,MACtB,KAAA;AAAA,MACA,SAAA,kBAAWD,cAAA,CAACE,SAAA,EAAA,EAAK,IAAA,EAAK,aAAA,EAAc,CAAA;AAAA,MACpC,aAAA,EAAeC,MAAA,CAAE,iCAAA,EAAmC,YAAY,CAAA;AAAA,MAChE,SAAA,kBAAWH,cAAA,CAACE,SAAA,EAAA,EAAK,IAAA,EAAK,YAAA,EAAa,CAAA;AAAA,MACnC,aAAA,EAAeC,MAAA,CAAE,qCAAA,EAAuC,gBAAgB,CAAA;AAAA,MACxE,QAAA,EAAU,gBAAA;AAAA,MACV,MAAA,EAAO,IAAA;AAAA,MACP,YAAA,EAAc,aAAa,cAAc;AAAA;AAAA,GAC3C;AAEJ;AAEA,IAAA,CAAK,WAAA,GAAc,MAAA;AAEZ,SAAS,aACd,IAAA,EACA,EAAA,EACA,qCAA2B,IAAI,IAAA,IAC/B,QAAA,EACc;AACd,EAAA,IAAI,aAAa,IAAA,CAAK,OAAA,EAAQ,GAAI,IAAA,CAAK,QAAO,GAAI,kBAAA;AAClD,EAAA,IAAI,WAAW,EAAA,CAAG,OAAA,EAAQ,GAAI,EAAA,CAAG,QAAO,GAAI,kBAAA;AAE5C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,UAAA,GAAaC,qDAAA,CAA2B,YAAY,QAAQ,CAAA;AAC5D,IAAA,QAAA,GAAWA,qDAAA,CAA2B,UAAU,QAAQ,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,OAAO,CAAC,UAAU,UAAU,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,CAAC,YAAY,QAAQ,CAAA;AAC9B;AAEA,SAAS,mBAAA,CAAoB,UAAkD,QAAA,EAAqB;AAClG,EAAA,OAAOC,iBAAA;AAAA,IACL,CAAC,KAAA,KAAU;AACT,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,QAAA,OAAO,OAAA,CAAQ,MAAM,uDAAuD,CAAA;AAAA,MAC9E;AAEA,MAAA,IAAI,KAAA,CAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,EAAG;AACxB,QAAA,MAAM,IAAA,GAAOC,mBAAc,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,EAAE,QAAA,EAAU,CAAA;AAC3D,QAAA,MAAM,EAAA,GAAKA,mBAAc,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,EAAE,QAAA,EAAU,CAAA;AAEzD,QAAA,QAAA,CAAS,MAAM,EAAE,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,UAAU,QAAQ;AAAA,GACrB;AACF;AAEA,SAAS,SAAS,IAAA,EAAsB;AACtC,EAAA,OAAO,CAAC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,OAAA,EAAQ,EAAG,IAAA,CAAK,UAAS,EAAG,IAAA,CAAK,YAAW,EAAG,IAAA,CAAK,YAAY,CAAA;AACpH;AAEO,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAyB;AAGrD,EAAA,MAAM,iBAAA,GAAoB,CAAA,kEAAA,CAAA;AAE1B,EAAA,OAAO;AAAA,IACL,OAAOC,OAAA,CAAI;AAAA,MACT,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,OAAA;AAAA,MACzB,eAAA,EAAiB,KAAA,CAAM,MAAA,CAAO,UAAA,CAAW,OAAA;AAAA,MACzC,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,IAAA,CAAK,EAAA;AAAA,MAChC,MAAA,EAAQ,uBAAA;AAAA,MAER,kBAAA,EAAoB;AAAA,QAClB,QAAA,EAAU;AAAA,OACZ;AAAA,MAEA,YAAA,EAAc;AAAA,QACZ,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,YAAA;AAAA,QAC3B,MAAA,EAAQ;AAAA;AACV,KACD,CAAA;AAAA,IACD,MAAMA,OAAA,CAAI;AAAA,MACR,MAAA,EAAQ,MAAM,MAAA,CAAO,KAAA;AAAA,MACrB,eAAA,EAAiB,KAAA,CAAM,MAAA,CAAO,UAAA,CAAW,QAAA;AAAA,MACzC,KAAA,EAAO,OAAA;AAAA,MAEP,6BAAA,EAA+B;AAAA,QAC7B,OAAA,EAAS;AAAA,OACX;AAAA,MAEA,qGAAA,EAAuG;AAAA,QACrG,UAAA,EAAY,KAAA;AAAA,QACZ,eAAA,EAAiB,SAAA;AAAA,QACjB,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,OAAA;AAAA,QACzB,MAAA,EAAQ,CAAA;AAAA,QACR,UAAA,EAAY,MAAM,UAAA,CAAW;AAAA,OAC/B;AAAA,MAEA,uCAAA,EAAyC;AAAA,QACvC,eAAA,EAAiB,SAAA;AAAA,QACjB,SAAA,EAAW,QAAA;AAAA,QACX,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA;AAAA,QAE5B,IAAA,EAAM;AAAA,UACJ,MAAA,EAAQ,CAAA;AAAA,UACR,cAAA,EAAgB,MAAA;AAAA,UAChB,MAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,OAAA;AAAA,UACT,OAAA,EAAS;AAAA;AACX,OACF;AAAA,MAEA,mCAAA,EAAqC;AAAA,QACnC,eAAA,EAAiB;AAAA,OACnB;AAAA,MAEA,mDAAA,EAAqD;AAAA,QACnD,YAAA,EAAc,KAAA;AAAA,QACd,eAAA,EAAiB,SAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACV;AAAA,MAEA,kHAAA,EACE;AAAA,QACE,OAAA,EAAS;AAAA,OACX;AAAA;AAAA;AAAA;AAAA,MAKF,8BAAA,EAAgC;AAAA,QAC9B,eAAA,EAAiB,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,KAAA;AAAA;AAAA,QAErC,YAAA,EAAc;AAAA,OAChB;AAAA,MAEA,mCAAA,EAAqC;AAAA,QACnC,mBAAA,EAAqB,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,IAAA;AAAA,QACxC,sBAAA,EAAwB,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO;AAAA,OAC7C;AAAA,MAEA,iCAAA,EAAmC;AAAA,QACjC,oBAAA,EAAsB,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,IAAA;AAAA,QACzC,uBAAA,EAAyB,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO;AAAA,OAC9C;AAAA;AAAA,MAGA,wIAAA,EACE;AAAA,QACE,eAAA,EAAiB,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,KAAA;AAAA,QACrC,YAAA,EAAc,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO;AAAA,OACnC;AAAA;AAAA;AAAA,MAIF,CAAC,CAAA,EAAG,iBAAiB,CAAA,qEAAA,CAAuE,GAAG;AAAA,QAC7F,mBAAA,EAAqB,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,IAAA;AAAA,QACxC,sBAAA,EAAwB,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO;AAAA,OAC7C;AAAA,MAEA,CAAC,CAAA,EAAG,iBAAiB,CAAA,mEAAA,CAAqE,GAAG;AAAA,QAC3F,oBAAA,EAAsB,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,IAAA;AAAA,QACzC,uBAAA,EAAyB,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO;AAAA,OAC9C;AAAA,MAEA,CAAC,CAAA,EAAG,iBAAiB,CAAA,mGAAA,CAAqG,GACxH;AAAA,QACE,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,YAAA;AAAA,QAC5B,UAAA,EAAY,MAAM,UAAA,CAAW,gBAAA;AAAA,QAC7B,UAAA,EAAY,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,IAAA;AAAA,QACjC,MAAA,EAAQ;AAAA;AACV,KACH;AAAA,GACH;AACF;;;;;;"}