{"version":3,"file":"AgendaView.mjs","names":["classes"],"sources":["../../../src/components/AgendaView/AgendaView.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport React from 'react';\nimport {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getRadius,\n  getThemeColor,\n  MantineRadius,\n  StylesApiProps,\n  Text,\n  UnstyledButton,\n  useMantineTheme,\n  useProps,\n  useStyles,\n} from '@mantine/core';\nimport { useDatesContext } from '@mantine/dates';\nimport { getLabel, ScheduleLabelsOverride } from '../../labels';\nimport { AnyDateValue, DateLabelFormat, ScheduleEventData, ScheduleMode } from '../../types';\nimport {\n  expandRecurringEvents,\n  formatDate,\n  isAllDayEvent,\n  isMultidayEvent,\n  sortEvents,\n} from '../../utils';\nimport { RenderEvent } from '../ScheduleEvent/ScheduleEvent';\nimport { getAgendaViewEvents } from './get-agenda-view-events';\nimport classes from './AgendaView.module.css';\n\nexport type AgendaViewStylesNames =\n  | 'agendaView'\n  | 'agendaViewHeader'\n  | 'agendaViewHeaderLabel'\n  | 'agendaViewBody'\n  | 'agendaViewDateGroup'\n  | 'agendaViewDateHeader'\n  | 'agendaViewEvent'\n  | 'agendaViewEventBody'\n  | 'agendaViewEventColor'\n  | 'agendaViewEventTitle'\n  | 'agendaViewEventTime'\n  | 'agendaViewNoEvents';\n\nexport type AgendaViewCssVariables = {\n  agendaView: '--agenda-view-radius';\n};\n\nexport interface AgendaViewProps\n  extends BoxProps, StylesApiProps<AgendaViewFactory>, ElementProps<'div'> {\n  __staticSelector?: string;\n\n  /** Start of the date range to display events for */\n  rangeStart: AnyDateValue;\n\n  /** End of the date range to display events for */\n  rangeEnd: AnyDateValue;\n\n  /** Events to display */\n  events?: ScheduleEventData[];\n\n  /** Locale passed down to dayjs, overrides value defined on `DatesProvider` */\n  locale?: string;\n\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */\n  radius?: MantineRadius;\n\n  /** Labels override for i18n */\n  labels?: ScheduleLabelsOverride;\n\n  /** Interaction mode: 'default' allows all interactions, 'static' disables event interactions @default 'default' */\n  mode?: ScheduleMode;\n\n  /** Function to fully customize event rendering, receives all props that would be passed to the root element including children */\n  renderEvent?: RenderEvent;\n\n  /** Format for the date group headers @default 'dddd, MMMM D' */\n  dateHeaderFormat?: DateLabelFormat;\n\n  /** Format for the header label showing the date range @default 'MMMM D, YYYY' */\n  headerFormat?: DateLabelFormat;\n\n  /** Called when event is clicked */\n  onEventClick?: (event: ScheduleEventData, e: React.MouseEvent<HTMLButtonElement>) => void;\n\n  /** Max number of generated recurring instances per recurring series @default 2000 */\n  recurrenceExpansionLimit?: number;\n}\n\nexport type AgendaViewFactory = Factory<{\n  props: AgendaViewProps;\n  ref: HTMLDivElement;\n  stylesNames: AgendaViewStylesNames;\n  vars: AgendaViewCssVariables;\n}>;\n\nconst defaultProps = {\n  __staticSelector: 'AgendaView',\n  mode: 'default',\n  dateHeaderFormat: 'dddd, MMMM D',\n  headerFormat: 'MMMM D, YYYY',\n} satisfies Partial<AgendaViewProps>;\n\nconst varsResolver = createVarsResolver<AgendaViewFactory>((_theme, { radius }) => ({\n  agendaView: {\n    '--agenda-view-radius': getRadius(radius),\n  },\n}));\n\nexport const AgendaView = factory<AgendaViewFactory>((_props) => {\n  const props = useProps('AgendaView', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    attributes,\n    __staticSelector,\n    rangeStart,\n    rangeEnd,\n    events,\n    locale,\n    radius,\n    labels,\n    mode,\n    renderEvent,\n    dateHeaderFormat,\n    headerFormat,\n    onEventClick,\n    recurrenceExpansionLimit,\n    ...others\n  } = props;\n\n  const ctx = useDatesContext();\n  const theme = useMantineTheme();\n\n  const getStyles = useStyles<AgendaViewFactory>({\n    name: __staticSelector,\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    attributes,\n    vars,\n    varsResolver,\n    rootSelector: 'agendaView',\n  });\n\n  const expandedEvents = expandRecurringEvents({\n    events,\n    rangeStart: dayjs(rangeStart).startOf('day').toDate(),\n    rangeEnd: dayjs(rangeEnd).endOf('day').toDate(),\n    expansionLimit: recurrenceExpansionLimit,\n  });\n\n  const groupedEvents = getAgendaViewEvents({\n    rangeStart,\n    rangeEnd,\n    events: expandedEvents,\n  });\n\n  const sortedDates = Object.keys(groupedEvents).sort();\n\n  const headerLabel = `${formatDate({\n    locale: ctx.getLocale(locale),\n    date: rangeStart,\n    format: headerFormat,\n  })} – ${formatDate({\n    locale: ctx.getLocale(locale),\n    date: rangeEnd,\n    format: headerFormat,\n  })}`;\n\n  const dateGroups = sortedDates.map((dateStr) => {\n    const dateEvents = sortEvents(groupedEvents[dateStr]);\n\n    const eventNodes = dateEvents.map((event) => {\n      const startTime = dayjs(event.start).format('HH:mm');\n      const endTime = dayjs(event.end).format('HH:mm');\n      const isAllDay = isMultidayEvent(event) || isAllDayEvent({ event, date: dateStr });\n\n      const eventChildren = (\n        <Box {...getStyles('agendaViewEventBody')}>\n          <div\n            {...getStyles('agendaViewEventColor', {\n              style: { backgroundColor: getThemeColor(event.color, theme) },\n            })}\n          />\n          <div>\n            <Text {...getStyles('agendaViewEventTitle')}>{event.title}</Text>\n            <Text {...getStyles('agendaViewEventTime')}>\n              {isAllDay ? getLabel('allDay', labels) : `${startTime} – ${endTime}`}\n            </Text>\n          </div>\n        </Box>\n      );\n\n      const rootProps: React.ComponentPropsWithoutRef<'button'> & { children: React.ReactNode } = {\n        ...getStyles('agendaViewEvent'),\n        onClick:\n          mode === 'static'\n            ? undefined\n            : (e: React.MouseEvent<HTMLButtonElement>) => {\n                onEventClick?.(event, e);\n              },\n        tabIndex: mode === 'static' ? -1 : 0,\n        children: eventChildren,\n      };\n\n      if (typeof renderEvent === 'function') {\n        return <React.Fragment key={event.id}>{renderEvent(event, rootProps)}</React.Fragment>;\n      }\n\n      return <UnstyledButton {...rootProps} key={event.id} />;\n    });\n\n    return (\n      <div {...getStyles('agendaViewDateGroup')} key={dateStr}>\n        <Text {...getStyles('agendaViewDateHeader')}>\n          {formatDate({\n            locale: ctx.getLocale(locale),\n            date: dateStr,\n            format: dateHeaderFormat,\n          })}\n        </Text>\n        {eventNodes}\n      </div>\n    );\n  });\n\n  return (\n    <Box {...getStyles('agendaView')} {...others}>\n      <div {...getStyles('agendaViewHeader')}>\n        <Text {...getStyles('agendaViewHeaderLabel')}>{headerLabel}</Text>\n      </div>\n\n      <Box {...getStyles('agendaViewBody')}>\n        {dateGroups.length > 0 ? (\n          dateGroups\n        ) : (\n          <Text {...getStyles('agendaViewNoEvents')}>{getLabel('noEvents', labels)}</Text>\n        )}\n      </Box>\n    </Box>\n  );\n});\n\nAgendaView.displayName = '@mantine/schedule/AgendaView';\nAgendaView.classes = classes;\nAgendaView.varsResolver = varsResolver;\n\nexport namespace AgendaView {\n  export type Props = AgendaViewProps;\n  export type Factory = AgendaViewFactory;\n  export type StylesNames = AgendaViewStylesNames;\n  export type CssVariables = AgendaViewCssVariables;\n}\n"],"mappings":"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"}