@mantine/schedule 9.5.1 → 9.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/_virtual/_rolldown/runtime.cjs +1 -1
- package/cjs/components/AgendaView/AgendaView.cjs +7 -6
- package/cjs/components/AgendaView/AgendaView.cjs.map +1 -1
- package/cjs/components/AgendaView/get-agenda-view-events.cjs.map +1 -1
- package/cjs/components/CurrentTimeIndicator/CurrentTimeIndicator.cjs +3 -2
- package/cjs/components/CurrentTimeIndicator/CurrentTimeIndicator.cjs.map +1 -1
- package/cjs/components/DayView/DayView.cjs +144 -78
- package/cjs/components/DayView/DayView.cjs.map +1 -1
- package/cjs/components/DayView/DayView.module.cjs +2 -1
- package/cjs/components/DayView/DayView.module.cjs.map +1 -1
- package/cjs/components/DayView/get-day-view-events/get-day-view-events.cjs.map +1 -1
- package/cjs/components/DragContext/DragContext.cjs.map +1 -1
- package/cjs/components/MobileMonthView/MobileMonthView.cjs +7 -6
- package/cjs/components/MobileMonthView/MobileMonthView.cjs.map +1 -1
- package/cjs/components/MobileMonthView/get-mobile-month-view-events.cjs.map +1 -1
- package/cjs/components/MonthView/MonthView.cjs +24 -34
- package/cjs/components/MonthView/MonthView.cjs.map +1 -1
- package/cjs/components/MonthView/MonthView.module.cjs.map +1 -1
- package/cjs/components/MonthView/get-month-view-events/find-available-row.cjs.map +1 -1
- package/cjs/components/MonthView/get-month-view-events/get-month-positioned-events.cjs +4 -2
- package/cjs/components/MonthView/get-month-view-events/get-month-positioned-events.cjs.map +1 -1
- package/cjs/components/MonthView/get-month-view-events/get-month-view-events.cjs.map +1 -1
- package/cjs/components/MonthView/get-month-view-events/get-weeks-in-range.cjs +3 -2
- package/cjs/components/MonthView/get-month-view-events/get-weeks-in-range.cjs.map +1 -1
- package/cjs/components/MonthView/get-renderable-month-event-segments.cjs +1 -1
- package/cjs/components/MonthView/get-renderable-month-event-segments.cjs.map +1 -1
- package/cjs/components/MoreEvents/MoreEvents.cjs.map +1 -1
- package/cjs/components/ResourcesDayView/ResourcesDayView.cjs +136 -52
- package/cjs/components/ResourcesDayView/ResourcesDayView.cjs.map +1 -1
- package/cjs/components/ResourcesDayView/ResourcesDayView.module.cjs +2 -1
- package/cjs/components/ResourcesDayView/ResourcesDayView.module.cjs.map +1 -1
- package/cjs/components/ResourcesDayView/ResourcesDayViewColumn.cjs.map +1 -1
- package/cjs/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.cjs.map +1 -1
- package/cjs/components/ResourcesMonthView/ResourcesMonthView.cjs.map +1 -1
- package/cjs/components/ResourcesSchedule/ResourcesSchedule.cjs +3 -1
- package/cjs/components/ResourcesSchedule/ResourcesSchedule.cjs.map +1 -1
- package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs +150 -59
- package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs.map +1 -1
- package/cjs/components/ResourcesWeekView/ResourcesWeekView.module.cjs +2 -1
- package/cjs/components/ResourcesWeekView/ResourcesWeekView.module.cjs.map +1 -1
- package/cjs/components/ResourcesWeekView/ResourcesWeekViewRow.cjs.map +1 -1
- package/cjs/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.cjs +6 -3
- package/cjs/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.cjs.map +1 -1
- package/cjs/components/Schedule/Schedule.cjs +4 -1
- package/cjs/components/Schedule/Schedule.cjs.map +1 -1
- package/cjs/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.cjs +53 -0
- package/cjs/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.cjs.map +1 -0
- package/cjs/components/ScheduleEvent/ScheduleEvent.cjs.map +1 -1
- package/cjs/components/ScheduleHeader/HeaderControl/HeaderControl.cjs +15 -14
- package/cjs/components/ScheduleHeader/HeaderControl/HeaderControl.cjs.map +1 -1
- package/cjs/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.cjs.map +1 -1
- package/cjs/components/ScheduleHeader/ScheduleHeader.cjs.map +1 -1
- package/cjs/components/ScheduleHeader/ScheduleHeaderBase.cjs.map +1 -1
- package/cjs/components/ScheduleHeader/ScheduleHeaderContext.cjs.map +1 -1
- package/cjs/components/ScheduleHeader/ViewSelect/ViewSelect.cjs.map +1 -1
- package/cjs/components/WeekView/WeekView.cjs +159 -82
- package/cjs/components/WeekView/WeekView.cjs.map +1 -1
- package/cjs/components/WeekView/WeekView.module.cjs +2 -1
- package/cjs/components/WeekView/WeekView.module.cjs.map +1 -1
- package/cjs/components/WeekView/WeekViewDay.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-label/get-week-label.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/calculate-all-day-event-offset.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/calculate-all-day-event-width.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/calculate-event-days.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/find-available-column.cjs +5 -10
- package/cjs/components/WeekView/get-week-view-events/find-available-column.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/get-event-end-date.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/get-hanging-status.cjs.map +1 -1
- package/cjs/components/WeekView/get-week-view-events/get-week-positioned-events.cjs +5 -3
- package/cjs/components/WeekView/get-week-view-events/get-week-positioned-events.cjs.map +1 -1
- package/cjs/components/YearView/YearView.cjs +7 -6
- package/cjs/components/YearView/YearView.cjs.map +1 -1
- package/cjs/components/YearView/YearViewMonth.cjs.map +1 -1
- package/cjs/components/YearView/get-visible-week-days.cjs.map +1 -1
- package/cjs/components/YearView/get-year-view-events/get-year-view-events.cjs.map +1 -1
- package/cjs/hooks/use-auto-scroll-on-drag.cjs.map +1 -1
- package/cjs/hooks/use-day-grid-event-resize.cjs.map +1 -1
- package/cjs/hooks/use-drag-drop-handlers.cjs +13 -2
- package/cjs/hooks/use-drag-drop-handlers.cjs.map +1 -1
- package/cjs/hooks/use-drag-state.cjs.map +1 -1
- package/cjs/hooks/use-event-resize.cjs +30 -15
- package/cjs/hooks/use-event-resize.cjs.map +1 -1
- package/cjs/hooks/use-horizontal-event-resize.cjs +30 -15
- package/cjs/hooks/use-horizontal-event-resize.cjs.map +1 -1
- package/cjs/hooks/use-slot-drag-select.cjs.map +1 -1
- package/cjs/index.cjs +2 -0
- package/cjs/utils/calculate-drop-time/calculate-drop-time.cjs +25 -4
- package/cjs/utils/calculate-drop-time/calculate-drop-time.cjs.map +1 -1
- package/cjs/utils/calculate-month-drop-date/calculate-month-drop-date.cjs.map +1 -1
- package/cjs/utils/calculate-month-resize-dates/calculate-month-resize-dates.cjs.map +1 -1
- package/cjs/utils/expand-recurring-events/expand-recurring-events.cjs +20 -8
- package/cjs/utils/expand-recurring-events/expand-recurring-events.cjs.map +1 -1
- package/cjs/utils/format-date/format-date.cjs.map +1 -1
- package/cjs/utils/get-current-time-position/get-current-time-position.cjs.map +1 -1
- package/cjs/utils/get-day-position/get-day-position.cjs.map +1 -1
- package/cjs/utils/get-end-of-week/get-end-of-week.cjs.map +1 -1
- package/cjs/utils/get-month-days/get-month-days.cjs +4 -2
- package/cjs/utils/get-month-days/get-month-days.cjs.map +1 -1
- package/cjs/utils/get-month-range/get-month-range.cjs.map +1 -1
- package/cjs/utils/get-months-by-quarter/get-months-by-quarter.cjs.map +1 -1
- package/cjs/utils/get-months-list/get-months-list.cjs.map +1 -1
- package/cjs/utils/get-start-of-week/get-start-of-week.cjs.map +1 -1
- package/cjs/utils/get-week-days/get-week-days.cjs.map +1 -1
- package/cjs/utils/get-week-number/get-week-number.cjs +4 -1
- package/cjs/utils/get-week-number/get-week-number.cjs.map +1 -1
- package/cjs/utils/get-weekdays-names/get-weekdays-names.cjs.map +1 -1
- package/cjs/utils/is-after-min-date/is-after-min-date.cjs.map +1 -1
- package/cjs/utils/is-all-day-event/is-all-day-event.cjs.map +1 -1
- package/cjs/utils/is-before-max-date/is-before-max-date.cjs.map +1 -1
- package/cjs/utils/is-event-in-time-range/is-event-in-time-range.cjs.map +1 -1
- package/cjs/utils/is-events-overlap/is-events-overlap.cjs +16 -4
- package/cjs/utils/is-events-overlap/is-events-overlap.cjs.map +1 -1
- package/cjs/utils/is-in-time-range/is-in-time-range.cjs.map +1 -1
- package/cjs/utils/is-multiday-event/is-multiday-event.cjs.map +1 -1
- package/cjs/utils/is-same-month/is-same-month.cjs.map +1 -1
- package/cjs/utils/is-within-week/is-within-week.cjs.map +1 -1
- package/cjs/utils/next-week/next-week.cjs.map +1 -1
- package/cjs/utils/previous-week/previous-week.cjs.map +1 -1
- package/cjs/utils/sort-events/sort-events.cjs.map +1 -1
- package/cjs/utils/to-date-string/to-date-string.cjs.map +1 -1
- package/cjs/utils/validate-event/validate-event.cjs.map +1 -1
- package/esm/components/AgendaView/AgendaView.mjs +7 -6
- package/esm/components/AgendaView/AgendaView.mjs.map +1 -1
- package/esm/components/CurrentTimeIndicator/CurrentTimeIndicator.mjs +4 -3
- package/esm/components/CurrentTimeIndicator/CurrentTimeIndicator.mjs.map +1 -1
- package/esm/components/DayView/DayView.mjs +145 -79
- package/esm/components/DayView/DayView.mjs.map +1 -1
- package/esm/components/DayView/DayView.module.mjs +2 -1
- package/esm/components/DayView/DayView.module.mjs.map +1 -1
- package/esm/components/MobileMonthView/MobileMonthView.mjs +7 -6
- package/esm/components/MobileMonthView/MobileMonthView.mjs.map +1 -1
- package/esm/components/MonthView/MonthView.mjs +25 -35
- package/esm/components/MonthView/MonthView.mjs.map +1 -1
- package/esm/components/MonthView/MonthView.module.mjs.map +1 -1
- package/esm/components/MonthView/get-month-view-events/get-month-positioned-events.mjs +4 -2
- package/esm/components/MonthView/get-month-view-events/get-month-positioned-events.mjs.map +1 -1
- package/esm/components/MonthView/get-month-view-events/get-weeks-in-range.mjs +3 -2
- package/esm/components/MonthView/get-month-view-events/get-weeks-in-range.mjs.map +1 -1
- package/esm/components/MonthView/get-renderable-month-event-segments.mjs +1 -1
- package/esm/components/MonthView/get-renderable-month-event-segments.mjs.map +1 -1
- package/esm/components/MoreEvents/MoreEvents.mjs.map +1 -1
- package/esm/components/ResourcesDayView/ResourcesDayView.mjs +138 -54
- package/esm/components/ResourcesDayView/ResourcesDayView.mjs.map +1 -1
- package/esm/components/ResourcesDayView/ResourcesDayView.module.mjs +2 -1
- package/esm/components/ResourcesDayView/ResourcesDayView.module.mjs.map +1 -1
- package/esm/components/ResourcesDayView/ResourcesDayViewColumn.mjs.map +1 -1
- package/esm/components/ResourcesMonthView/ResourcesMonthView.mjs.map +1 -1
- package/esm/components/ResourcesSchedule/ResourcesSchedule.mjs +3 -1
- package/esm/components/ResourcesSchedule/ResourcesSchedule.mjs.map +1 -1
- package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs +152 -61
- package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs.map +1 -1
- package/esm/components/ResourcesWeekView/ResourcesWeekView.module.mjs +2 -1
- package/esm/components/ResourcesWeekView/ResourcesWeekView.module.mjs.map +1 -1
- package/esm/components/ResourcesWeekView/ResourcesWeekViewRow.mjs.map +1 -1
- package/esm/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.mjs +6 -3
- package/esm/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.mjs.map +1 -1
- package/esm/components/Schedule/Schedule.mjs +4 -1
- package/esm/components/Schedule/Schedule.mjs.map +1 -1
- package/esm/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.mjs +53 -0
- package/esm/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.mjs.map +1 -0
- package/esm/components/ScheduleEvent/ScheduleEvent.mjs.map +1 -1
- package/esm/components/ScheduleHeader/HeaderControl/HeaderControl.mjs +15 -14
- package/esm/components/ScheduleHeader/HeaderControl/HeaderControl.mjs.map +1 -1
- package/esm/components/ScheduleHeader/MonthYearSelect/MonthYearSelect.mjs.map +1 -1
- package/esm/components/ScheduleHeader/ScheduleHeader.mjs.map +1 -1
- package/esm/components/ScheduleHeader/ScheduleHeaderBase.mjs.map +1 -1
- package/esm/components/ScheduleHeader/ViewSelect/ViewSelect.mjs.map +1 -1
- package/esm/components/WeekView/WeekView.mjs +160 -83
- package/esm/components/WeekView/WeekView.mjs.map +1 -1
- package/esm/components/WeekView/WeekView.module.mjs +2 -1
- package/esm/components/WeekView/WeekView.module.mjs.map +1 -1
- package/esm/components/WeekView/WeekViewDay.mjs.map +1 -1
- package/esm/components/WeekView/get-week-view-events/find-available-column.mjs +5 -10
- package/esm/components/WeekView/get-week-view-events/find-available-column.mjs.map +1 -1
- package/esm/components/WeekView/get-week-view-events/get-week-positioned-events.mjs +5 -3
- package/esm/components/WeekView/get-week-view-events/get-week-positioned-events.mjs.map +1 -1
- package/esm/components/YearView/YearView.mjs +7 -6
- package/esm/components/YearView/YearView.mjs.map +1 -1
- package/esm/components/YearView/YearViewMonth.mjs.map +1 -1
- package/esm/hooks/use-drag-drop-handlers.mjs +13 -2
- package/esm/hooks/use-drag-drop-handlers.mjs.map +1 -1
- package/esm/hooks/use-event-resize.mjs +30 -15
- package/esm/hooks/use-event-resize.mjs.map +1 -1
- package/esm/hooks/use-horizontal-event-resize.mjs +30 -15
- package/esm/hooks/use-horizontal-event-resize.mjs.map +1 -1
- package/esm/index.mjs +2 -1
- package/esm/utils/calculate-drop-time/calculate-drop-time.mjs +25 -4
- package/esm/utils/calculate-drop-time/calculate-drop-time.mjs.map +1 -1
- package/esm/utils/expand-recurring-events/expand-recurring-events.mjs +20 -8
- package/esm/utils/expand-recurring-events/expand-recurring-events.mjs.map +1 -1
- package/esm/utils/get-month-days/get-month-days.mjs +4 -2
- package/esm/utils/get-month-days/get-month-days.mjs.map +1 -1
- package/esm/utils/get-week-number/get-week-number.mjs +4 -1
- package/esm/utils/get-week-number/get-week-number.mjs.map +1 -1
- package/esm/utils/is-events-overlap/is-events-overlap.mjs +16 -4
- package/esm/utils/is-events-overlap/is-events-overlap.mjs.map +1 -1
- package/lib/components/DayView/DayView.d.ts +7 -1
- package/lib/components/MonthView/MonthView.d.ts +2 -0
- package/lib/components/ResourcesDayView/ResourcesDayView.d.ts +7 -1
- package/lib/components/ResourcesDayView/ResourcesDayViewColumn.d.ts +1 -1
- package/lib/components/ResourcesSchedule/ResourcesSchedule.d.ts +3 -1
- package/lib/components/ResourcesWeekView/ResourcesWeekView.d.ts +7 -1
- package/lib/components/ResourcesWeekView/ResourcesWeekViewRow.d.ts +1 -1
- package/lib/components/Schedule/Schedule.d.ts +3 -1
- package/lib/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.d.ts +19 -0
- package/lib/components/ScheduleBackgroundEvent/index.d.ts +2 -0
- package/lib/components/ScheduleHeader/HeaderControl/HeaderControl.d.ts +3 -3
- package/lib/components/ScheduleHeader/ScheduleHeaderBase.d.ts +1 -1
- package/lib/components/WeekView/WeekView.d.ts +7 -1
- package/lib/components/WeekView/WeekViewDay.d.ts +1 -1
- package/lib/components/WeekView/get-week-view-events/find-available-column.d.ts +7 -3
- package/lib/components/YearView/YearViewMonth.d.ts +1 -1
- package/lib/hooks/use-drag-drop-handlers.d.ts +10 -1
- package/lib/hooks/use-event-resize.d.ts +2 -1
- package/lib/hooks/use-horizontal-event-resize.d.ts +2 -1
- package/lib/index.d.mts +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/types.d.ts +1 -1
- package/lib/utils/calculate-drop-time/calculate-drop-time.d.ts +11 -1
- package/package.json +8 -5
- package/styles.css +160 -0
- package/styles.layer.css +160 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScheduleHeaderBase.mjs","names":["classes"],"sources":["../../../src/components/ScheduleHeader/ScheduleHeaderBase.tsx"],"sourcesContent":["import { NativeSelect, StylesApiProps } from '@mantine/core';\nimport { getLabel, ScheduleLabelsOverride } from '../../labels';\nimport { DateStringValue, ScheduleViewLevel } from '../../types';\nimport { MonthYearSelectProps } from './MonthYearSelect/MonthYearSelect';\nimport { ScheduleHeader } from './ScheduleHeader';\nimport { ViewSelectProps } from './ViewSelect/ViewSelect';\nimport classes from './ScheduleHeader.module.css';\n\ninterface NavigationHandlers {\n /** Handler for previous button click, returns new date */\n previous: () => DateStringValue;\n\n /** Handler for next button click, returns new date */\n next: () => DateStringValue;\n\n /** Handler for today button click, returns new date */\n today: () => DateStringValue;\n}\n\ninterface HeaderControlOptions {\n /** Title to render in a simple control (used by DayView, WeekView) */\n title?: React.ReactNode;\n /** MonthYearSelect props (used by MonthView, YearView) */\n monthYearSelect?: {\n yearValue: number;\n monthValue: number;\n onYearChange?: (year: number) => void;\n onMonthChange?: (month: number) => void;\n withMonths?: boolean;\n } & Partial<MonthYearSelectProps>;\n /** Minimum width for control */\n miw?: React.CSSProperties['minWidth'];\n}\n\nexport interface ScheduleHeaderBaseProps {\n /** Current view level */\n view: ScheduleViewLevel;\n\n /** Navigation handlers for previous, next, and today */\n navigationHandlers: NavigationHandlers;\n\n /** Central control configuration (either title or monthYearSelect) */\n control: HeaderControlOptions;\n\n /** Label overrides */\n labels?: ScheduleLabelsOverride;\n\n /** Called when date is changed */\n onDateChange?: (date: DateStringValue) => void;\n\n /** Called when view is changed */\n onViewChange?: (view: ScheduleViewLevel) => void;\n\n /** Props passed to previous control button */\n previousControlProps?: React.ComponentProps<'button'>;\n\n /** Props passed to next control button */\n nextControlProps?: React.ComponentProps<'button'>;\n\n /** Props passed to today control button */\n todayControlProps?: React.ComponentProps<'button'>;\n\n /** Props passed to view select */\n viewSelectProps?: Partial<ViewSelectProps>;\n\n /** Styles API props to pass through */\n stylesApiProps?: StylesApiProps<any>;\n\n /** Called when agenda button is clicked */\n onAgendaClick?: () => void;\n\n /** Whether the agenda view is currently active */\n agendaActive?: boolean;\n}\n\nconst VIEW_LEVELS: ScheduleViewLevel[] = ['day', 'week', 'month', 'year'];\n\nexport function ScheduleHeaderBase({\n view,\n navigationHandlers,\n control,\n labels,\n onDateChange,\n onViewChange,\n previousControlProps,\n nextControlProps,\n todayControlProps,\n viewSelectProps,\n stylesApiProps,\n onAgendaClick,\n agendaActive,\n}: ScheduleHeaderBaseProps) {\n const centralControl = control.monthYearSelect ? (\n <ScheduleHeader.MonthYearSelect\n {...stylesApiProps}\n labels={labels}\n {...control.monthYearSelect}\n />\n ) : (\n <ScheduleHeader.Control {...stylesApiProps} interactive={false} miw={control.miw}>\n {control.title}\n </ScheduleHeader.Control>\n );\n\n const views = viewSelectProps?.views || VIEW_LEVELS;\n const compactViewSelectData = views.map((v) => ({\n value: v,\n label: getLabel(v, labels) as string,\n }));\n\n return (\n <ScheduleHeader {...stylesApiProps} labels={labels}>\n <div className={classes.navigationGroup}>\n <ScheduleHeader.Previous\n {...stylesApiProps}\n onClick={() => onDateChange?.(navigationHandlers.previous())}\n labels={labels}\n {...previousControlProps}\n />\n\n {centralControl}\n\n <ScheduleHeader.Next\n {...stylesApiProps}\n onClick={() => onDateChange?.(navigationHandlers.next())}\n labels={labels}\n {...nextControlProps}\n />\n </div>\n\n <div className={classes.todayControl}>\n <ScheduleHeader.Today\n {...stylesApiProps}\n onClick={() => onDateChange?.(navigationHandlers.today())}\n labels={labels}\n {...todayControlProps}\n />\n {onAgendaClick && (\n <ScheduleHeader.Control\n {...stylesApiProps}\n data-type=\"agenda\"\n active={agendaActive}\n onClick={onAgendaClick}\n aria-label={getLabel('agenda', labels) as string}\n >\n {getLabel('agenda', labels)}\n </ScheduleHeader.Control>\n )}\n </div>\n\n <div className={classes.compactControls}>\n {onAgendaClick && (\n <ScheduleHeader.Control\n {...stylesApiProps}\n data-type=\"agenda\"\n active={agendaActive}\n onClick={onAgendaClick}\n aria-label={getLabel('agenda', labels) as string}\n className={classes.compactAgendaControl}\n >\n {getLabel('agenda', labels)}\n </ScheduleHeader.Control>\n )}\n <NativeSelect\n className={classes.compactViewSelect}\n data={compactViewSelectData}\n value={view}\n onChange={(event) => onViewChange?.(event.currentTarget.value as ScheduleViewLevel)}\n aria-label={getLabel('viewSelectLabel', labels) as string}\n size=\"sm\"\n />\n </div>\n\n <div className={classes.viewSelect} style={{ marginInlineStart: 'auto' }}>\n <ScheduleHeader.ViewSelect\n value={view}\n onChange={onViewChange}\n labels={labels}\n {...stylesApiProps}\n {...viewSelectProps}\n />\n </div>\n </ScheduleHeader>\n );\n}\n"],"mappings":";;;;;;;AA2EA,MAAM,cAAmC;CAAC;CAAO;CAAQ;CAAS;AAAM;AAExE,SAAgB,mBAAmB,EACjC,MACA,oBACA,SACA,QACA,cACA,cACA,sBACA,kBACA,mBACA,iBACA,gBACA,eACA,gBAC0B;CAC1B,MAAM,iBAAiB,QAAQ,kBAC7B,oBAAC,eAAe,iBAAhB;EACE,GAAI;EACI;EACR,GAAI,QAAQ;CACb,CAAA,IAED,oBAAC,eAAe,SAAhB;EAAwB,GAAI;EAAgB,aAAa;EAAO,KAAK,QAAQ;
|
|
1
|
+
{"version":3,"file":"ScheduleHeaderBase.mjs","names":["classes"],"sources":["../../../src/components/ScheduleHeader/ScheduleHeaderBase.tsx"],"sourcesContent":["import { NativeSelect, StylesApiProps } from '@mantine/core';\nimport { getLabel, ScheduleLabelsOverride } from '../../labels';\nimport { DateStringValue, ScheduleViewLevel } from '../../types';\nimport { MonthYearSelectProps } from './MonthYearSelect/MonthYearSelect';\nimport { ScheduleHeader } from './ScheduleHeader';\nimport { ViewSelectProps } from './ViewSelect/ViewSelect';\nimport classes from './ScheduleHeader.module.css';\n\ninterface NavigationHandlers {\n /** Handler for previous button click, returns new date */\n previous: () => DateStringValue;\n\n /** Handler for next button click, returns new date */\n next: () => DateStringValue;\n\n /** Handler for today button click, returns new date */\n today: () => DateStringValue;\n}\n\ninterface HeaderControlOptions {\n /** Title to render in a simple control (used by DayView, WeekView) */\n title?: React.ReactNode;\n /** MonthYearSelect props (used by MonthView, YearView) */\n monthYearSelect?: {\n yearValue: number;\n monthValue: number;\n onYearChange?: (year: number) => void;\n onMonthChange?: (month: number) => void;\n withMonths?: boolean;\n } & Partial<MonthYearSelectProps>;\n /** Minimum width for control */\n miw?: React.CSSProperties['minWidth'];\n}\n\nexport interface ScheduleHeaderBaseProps {\n /** Current view level */\n view: ScheduleViewLevel;\n\n /** Navigation handlers for previous, next, and today */\n navigationHandlers: NavigationHandlers;\n\n /** Central control configuration (either title or monthYearSelect) */\n control: HeaderControlOptions;\n\n /** Label overrides */\n labels?: ScheduleLabelsOverride;\n\n /** Called when date is changed */\n onDateChange?: (date: DateStringValue) => void;\n\n /** Called when view is changed */\n onViewChange?: (view: ScheduleViewLevel) => void;\n\n /** Props passed to previous control button */\n previousControlProps?: React.ComponentProps<'button'>;\n\n /** Props passed to next control button */\n nextControlProps?: React.ComponentProps<'button'>;\n\n /** Props passed to today control button */\n todayControlProps?: React.ComponentProps<'button'>;\n\n /** Props passed to view select */\n viewSelectProps?: Partial<ViewSelectProps>;\n\n /** Styles API props to pass through */\n stylesApiProps?: StylesApiProps<any>;\n\n /** Called when agenda button is clicked */\n onAgendaClick?: () => void;\n\n /** Whether the agenda view is currently active */\n agendaActive?: boolean;\n}\n\nconst VIEW_LEVELS: ScheduleViewLevel[] = ['day', 'week', 'month', 'year'];\n\nexport function ScheduleHeaderBase({\n view,\n navigationHandlers,\n control,\n labels,\n onDateChange,\n onViewChange,\n previousControlProps,\n nextControlProps,\n todayControlProps,\n viewSelectProps,\n stylesApiProps,\n onAgendaClick,\n agendaActive,\n}: ScheduleHeaderBaseProps) {\n const centralControl = control.monthYearSelect ? (\n <ScheduleHeader.MonthYearSelect\n {...stylesApiProps}\n labels={labels}\n {...control.monthYearSelect}\n />\n ) : (\n <ScheduleHeader.Control {...stylesApiProps} interactive={false} miw={control.miw}>\n {control.title}\n </ScheduleHeader.Control>\n );\n\n const views = viewSelectProps?.views || VIEW_LEVELS;\n const compactViewSelectData = views.map((v) => ({\n value: v,\n label: getLabel(v, labels) as string,\n }));\n\n return (\n <ScheduleHeader {...stylesApiProps} labels={labels}>\n <div className={classes.navigationGroup}>\n <ScheduleHeader.Previous\n {...stylesApiProps}\n onClick={() => onDateChange?.(navigationHandlers.previous())}\n labels={labels}\n {...previousControlProps}\n />\n\n {centralControl}\n\n <ScheduleHeader.Next\n {...stylesApiProps}\n onClick={() => onDateChange?.(navigationHandlers.next())}\n labels={labels}\n {...nextControlProps}\n />\n </div>\n\n <div className={classes.todayControl}>\n <ScheduleHeader.Today\n {...stylesApiProps}\n onClick={() => onDateChange?.(navigationHandlers.today())}\n labels={labels}\n {...todayControlProps}\n />\n {onAgendaClick && (\n <ScheduleHeader.Control\n {...stylesApiProps}\n data-type=\"agenda\"\n active={agendaActive}\n onClick={onAgendaClick}\n aria-label={getLabel('agenda', labels) as string}\n >\n {getLabel('agenda', labels)}\n </ScheduleHeader.Control>\n )}\n </div>\n\n <div className={classes.compactControls}>\n {onAgendaClick && (\n <ScheduleHeader.Control\n {...stylesApiProps}\n data-type=\"agenda\"\n active={agendaActive}\n onClick={onAgendaClick}\n aria-label={getLabel('agenda', labels) as string}\n className={classes.compactAgendaControl}\n >\n {getLabel('agenda', labels)}\n </ScheduleHeader.Control>\n )}\n <NativeSelect\n className={classes.compactViewSelect}\n data={compactViewSelectData}\n value={view}\n onChange={(event) => onViewChange?.(event.currentTarget.value as ScheduleViewLevel)}\n aria-label={getLabel('viewSelectLabel', labels) as string}\n size=\"sm\"\n />\n </div>\n\n <div className={classes.viewSelect} style={{ marginInlineStart: 'auto' }}>\n <ScheduleHeader.ViewSelect\n value={view}\n onChange={onViewChange}\n labels={labels}\n {...stylesApiProps}\n {...viewSelectProps}\n />\n </div>\n </ScheduleHeader>\n );\n}\n"],"mappings":";;;;;;;AA2EA,MAAM,cAAmC;CAAC;CAAO;CAAQ;CAAS;AAAM;AAExE,SAAgB,mBAAmB,EACjC,MACA,oBACA,SACA,QACA,cACA,cACA,sBACA,kBACA,mBACA,iBACA,gBACA,eACA,gBAC0B;CAC1B,MAAM,iBAAiB,QAAQ,kBAC7B,oBAAC,eAAe,iBAAhB;EACE,GAAI;EACI;EACR,GAAI,QAAQ;CACb,CAAA,IAED,oBAAC,eAAe,SAAhB;EAAwB,GAAI;EAAgB,aAAa;EAAO,KAAK,QAAQ;EAC1E,UAAA,QAAQ;CACa,CAAA;CAI1B,MAAM,yBADQ,iBAAiB,SAAS,YAAA,CACJ,KAAK,OAAO;EAC9C,OAAO;EACP,OAAO,SAAS,GAAG,MAAM;CAC3B,EAAE;CAEF,OACE,qBAAC,gBAAD;EAAgB,GAAI;EAAwB;EAA5C,UAAA;GACE,qBAAC,OAAD;IAAK,WAAWA,8BAAQ;IAAxB,UAAA;KACE,oBAAC,eAAe,UAAhB;MACE,GAAI;MACJ,eAAe,eAAe,mBAAmB,SAAS,CAAC;MACnD;MACR,GAAI;KACL,CAAA;KAEA;KAED,oBAAC,eAAe,MAAhB;MACE,GAAI;MACJ,eAAe,eAAe,mBAAmB,KAAK,CAAC;MAC/C;MACR,GAAI;KACL,CAAA;IACE;;GAEL,qBAAC,OAAD;IAAK,WAAWA,8BAAQ;IAAxB,UAAA,CACE,oBAAC,eAAe,OAAhB;KACE,GAAI;KACJ,eAAe,eAAe,mBAAmB,MAAM,CAAC;KAChD;KACR,GAAI;IACL,CAAA,GACA,iBACC,oBAAC,eAAe,SAAhB;KACE,GAAI;KACJ,aAAU;KACV,QAAQ;KACR,SAAS;KACT,cAAY,SAAS,UAAU,MAAM;KAEpC,UAAA,SAAS,UAAU,MAAM;IACJ,CAAA,CAEvB;;GAEL,qBAAC,OAAD;IAAK,WAAWA,8BAAQ;IAAxB,UAAA,CACG,iBACC,oBAAC,eAAe,SAAhB;KACE,GAAI;KACJ,aAAU;KACV,QAAQ;KACR,SAAS;KACT,cAAY,SAAS,UAAU,MAAM;KACrC,WAAWA,8BAAQ;KAElB,UAAA,SAAS,UAAU,MAAM;IACJ,CAAA,GAE1B,oBAAC,cAAD;KACE,WAAWA,8BAAQ;KACnB,MAAM;KACN,OAAO;KACP,WAAW,UAAU,eAAe,MAAM,cAAc,KAA0B;KAClF,cAAY,SAAS,mBAAmB,MAAM;KAC9C,MAAK;IACN,CAAA,CACE;;GAEL,oBAAC,OAAD;IAAK,WAAWA,8BAAQ;IAAY,OAAO,EAAE,mBAAmB,OAAO;IACrE,UAAA,oBAAC,eAAe,YAAhB;KACE,OAAO;KACP,UAAU;KACF;KACR,GAAI;KACJ,GAAI;IACL,CAAA;GACE,CAAA;EACS;;AAEpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ViewSelect.mjs","names":["classes"],"sources":["../../../../src/components/ScheduleHeader/ViewSelect/ViewSelect.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n Box,\n BoxProps,\n ElementProps,\n factory,\n Factory,\n MantineRadius,\n StylesApiProps,\n useDirection,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { getLabel, ScheduleLabels, ScheduleLabelsOverride } from '../../../labels';\nimport { ScheduleViewLevel } from '../../../types';\nimport { HeaderControl } from '../HeaderControl/HeaderControl';\nimport { useScheduleHeaderLabels } from '../ScheduleHeaderContext';\nimport classes from './ViewSelect.module.css';\n\nexport type ViewSelectStylesNames = 'viewSelect';\n\nexport interface ViewSelectProps\n extends BoxProps, StylesApiProps<ViewSelectFactory>, ElementProps<'div', 'value' | 'onChange'> {\n __staticSelector?: string;\n\n /** A list of views to display @default ['day', 'week', 'month', 'year'] */\n views?: readonly ScheduleViewLevel[];\n\n /** Selected view type */\n value?: ScheduleViewLevel;\n\n /** Called when view type changes */\n onChange?: (value: ScheduleViewLevel) => void;\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 */\n labels?: ScheduleLabelsOverride;\n}\n\nexport type ViewSelectFactory = Factory<{\n props: ViewSelectProps;\n ref: HTMLDivElement;\n stylesNames: ViewSelectStylesNames;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'ViewSelect',\n views: ['day', 'week', 'month', 'year'],\n} satisfies Partial<ViewSelectProps>;\n\nexport const ViewSelect = factory<ViewSelectFactory>((_props) => {\n const props = useProps('ViewSelect', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n attributes,\n value,\n onChange,\n views,\n __staticSelector,\n radius,\n labels,\n ...others\n } = props;\n\n const getStyles = useStyles<ViewSelectFactory>({\n name: __staticSelector,\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n rootSelector: 'viewSelect',\n });\n\n const resolvedLabels = useScheduleHeaderLabels(labels);\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<ViewSelectFactory>({\n classNames,\n styles,\n props,\n });\n\n const { dir } = useDirection();\n const controlsRef = useRef<(HTMLButtonElement | null)[]>([]);\n const activatedWithKeyboardRef = useRef(false);\n\n // Restore focus to the selected tab when the component mounts\n // This handles the case where focus is lost due to view switch (header unmount/remount)\n // Only restore focus if the view was activated via keyboard (Enter/Space)\n useEffect(() => {\n if (activatedWithKeyboardRef.current && document.activeElement === document.body) {\n const selectedIndex = views!.findIndex((view) => view === value);\n if (selectedIndex !== -1) {\n controlsRef.current[selectedIndex]?.focus();\n }\n }\n activatedWithKeyboardRef.current = false;\n }, []);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>, index: number) => {\n const isRtl = dir === 'rtl';\n const nextKey = isRtl ? 'ArrowLeft' : 'ArrowRight';\n const prevKey = isRtl ? 'ArrowRight' : 'ArrowLeft';\n\n if (event.key === nextKey) {\n event.preventDefault();\n const nextIndex = index < views!.length - 1 ? index + 1 : 0;\n controlsRef.current[nextIndex]?.focus();\n } else if (event.key === prevKey) {\n event.preventDefault();\n const prevIndex = index > 0 ? index - 1 : views!.length - 1;\n controlsRef.current[prevIndex]?.focus();\n } else if (event.key === 'Home') {\n event.preventDefault();\n controlsRef.current[0]?.focus();\n } else if (event.key === 'End') {\n event.preventDefault();\n controlsRef.current[views!.length - 1]?.focus();\n } else if (event.key === 'Enter' || event.key === ' ') {\n activatedWithKeyboardRef.current = true;\n }\n };\n\n const switchToLabelKeys: Record<ScheduleViewLevel, keyof ScheduleLabels> = {\n day: 'switchToDayView',\n week: 'switchToWeekView',\n month: 'switchToMonthView',\n year: 'switchToYearView',\n };\n\n const items = views!.map((view, index) => {\n const isSelected = value === view;\n return (\n <HeaderControl\n key={view}\n ref={(node) => {\n controlsRef.current[index] = node;\n }}\n data-type={view}\n active={isSelected}\n onClick={() => onChange?.(view)}\n onKeyDown={(event) => handleKeyDown(event, index)}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n __staticSelector={__staticSelector}\n radius={radius}\n role=\"tab\"\n aria-label={getLabel(switchToLabelKeys[view], resolvedLabels) as string}\n aria-selected={isSelected}\n tabIndex={isSelected ? 0 : -1}\n >\n {getLabel(view, resolvedLabels)}\n </HeaderControl>\n );\n });\n\n return (\n <Box\n {...getStyles('viewSelect')}\n role=\"tablist\"\n aria-label={getLabel('viewSelectLabel', resolvedLabels)}\n {...others}\n >\n {items}\n </Box>\n );\n});\n\nViewSelect.displayName = '@mantine/schedule/ViewSelect';\nViewSelect.classes = classes;\n"],"mappings":";;;;;;;;;AAgDA,MAAM,eAAe;CACnB,kBAAkB;CAClB,OAAO;EAAC;EAAO;EAAQ;EAAS;CAAM;AACxC;AAEA,MAAa,aAAa,SAA4B,WAAW;CAC/D,MAAM,QAAQ,SAAS,cAAc,cAAc,MAAM;CACzD,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,YACA,OACA,UACA,OACA,kBACA,QACA,QACA,GAAG,WACD;CAEJ,MAAM,YAAY,UAA6B;EAC7C,MAAM;EACN,SAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;CAChB,CAAC;CAED,MAAM,iBAAiB,wBAAwB,MAAM;CAErD,MAAM,EAAE,oBAAoB,mBAAmB,qBAAwC;EACrF;EACA;EACA;CACF,CAAC;CAED,MAAM,EAAE,QAAQ,aAAa;CAC7B,MAAM,cAAc,OAAqC,CAAC,CAAC;CAC3D,MAAM,2BAA2B,OAAO,KAAK;CAK7C,gBAAgB;EACd,IAAI,yBAAyB,WAAW,SAAS,kBAAkB,SAAS,MAAM;GAChF,MAAM,gBAAgB,MAAO,WAAW,SAAS,SAAS,KAAK;GAC/D,IAAI,kBAAkB,IACpB,YAAY,QAAQ,cAAc,EAAE,MAAM;EAE9C;EACA,yBAAyB,UAAU;CACrC,GAAG,CAAC,CAAC;CAEL,MAAM,iBAAiB,OAA+C,UAAkB;EACtF,MAAM,QAAQ,QAAQ;EACtB,MAAM,UAAU,QAAQ,cAAc;EACtC,MAAM,UAAU,QAAQ,eAAe;EAEvC,IAAI,MAAM,QAAQ,SAAS;GACzB,MAAM,eAAe;GACrB,MAAM,YAAY,QAAQ,MAAO,SAAS,IAAI,QAAQ,IAAI;GAC1D,YAAY,QAAQ,UAAU,EAAE,MAAM;EACxC,OAAO,IAAI,MAAM,QAAQ,SAAS;GAChC,MAAM,eAAe;GACrB,MAAM,YAAY,QAAQ,IAAI,QAAQ,IAAI,MAAO,SAAS;GAC1D,YAAY,QAAQ,UAAU,EAAE,MAAM;EACxC,OAAO,IAAI,MAAM,QAAQ,QAAQ;GAC/B,MAAM,eAAe;GACrB,YAAY,QAAQ,EAAE,EAAE,MAAM;EAChC,OAAO,IAAI,MAAM,QAAQ,OAAO;GAC9B,MAAM,eAAe;GACrB,YAAY,QAAQ,MAAO,SAAS,EAAE,EAAE,MAAM;EAChD,OAAO,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAChD,yBAAyB,UAAU;CAEvC;CAEA,MAAM,oBAAqE;EACzE,KAAK;EACL,MAAM;EACN,OAAO;EACP,MAAM;CACR;CAEA,MAAM,QAAQ,MAAO,KAAK,MAAM,UAAU;EACxC,MAAM,aAAa,UAAU;EAC7B,OACE,oBAAC,eAAD;GAEE,MAAM,SAAS;IACb,YAAY,QAAQ,SAAS;GAC/B;GACA,aAAW;GACX,QAAQ;GACR,eAAe,WAAW,IAAI;GAC9B,YAAY,UAAU,cAAc,OAAO,KAAK;GAChD,YAAY;GACZ,QAAQ;GACU;GACV;GACR,MAAK;GACL,cAAY,SAAS,kBAAkB,OAAO,cAAc;GAC5D,iBAAe;GACf,UAAU,aAAa,IAAI;
|
|
1
|
+
{"version":3,"file":"ViewSelect.mjs","names":["classes"],"sources":["../../../../src/components/ScheduleHeader/ViewSelect/ViewSelect.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n Box,\n BoxProps,\n ElementProps,\n factory,\n Factory,\n MantineRadius,\n StylesApiProps,\n useDirection,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { getLabel, ScheduleLabels, ScheduleLabelsOverride } from '../../../labels';\nimport { ScheduleViewLevel } from '../../../types';\nimport { HeaderControl } from '../HeaderControl/HeaderControl';\nimport { useScheduleHeaderLabels } from '../ScheduleHeaderContext';\nimport classes from './ViewSelect.module.css';\n\nexport type ViewSelectStylesNames = 'viewSelect';\n\nexport interface ViewSelectProps\n extends BoxProps, StylesApiProps<ViewSelectFactory>, ElementProps<'div', 'value' | 'onChange'> {\n __staticSelector?: string;\n\n /** A list of views to display @default ['day', 'week', 'month', 'year'] */\n views?: readonly ScheduleViewLevel[];\n\n /** Selected view type */\n value?: ScheduleViewLevel;\n\n /** Called when view type changes */\n onChange?: (value: ScheduleViewLevel) => void;\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 */\n labels?: ScheduleLabelsOverride;\n}\n\nexport type ViewSelectFactory = Factory<{\n props: ViewSelectProps;\n ref: HTMLDivElement;\n stylesNames: ViewSelectStylesNames;\n}>;\n\nconst defaultProps = {\n __staticSelector: 'ViewSelect',\n views: ['day', 'week', 'month', 'year'],\n} satisfies Partial<ViewSelectProps>;\n\nexport const ViewSelect = factory<ViewSelectFactory>((_props) => {\n const props = useProps('ViewSelect', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n attributes,\n value,\n onChange,\n views,\n __staticSelector,\n radius,\n labels,\n ...others\n } = props;\n\n const getStyles = useStyles<ViewSelectFactory>({\n name: __staticSelector,\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n rootSelector: 'viewSelect',\n });\n\n const resolvedLabels = useScheduleHeaderLabels(labels);\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<ViewSelectFactory>({\n classNames,\n styles,\n props,\n });\n\n const { dir } = useDirection();\n const controlsRef = useRef<(HTMLButtonElement | null)[]>([]);\n const activatedWithKeyboardRef = useRef(false);\n\n // Restore focus to the selected tab when the component mounts\n // This handles the case where focus is lost due to view switch (header unmount/remount)\n // Only restore focus if the view was activated via keyboard (Enter/Space)\n useEffect(() => {\n if (activatedWithKeyboardRef.current && document.activeElement === document.body) {\n const selectedIndex = views!.findIndex((view) => view === value);\n if (selectedIndex !== -1) {\n controlsRef.current[selectedIndex]?.focus();\n }\n }\n activatedWithKeyboardRef.current = false;\n }, []);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>, index: number) => {\n const isRtl = dir === 'rtl';\n const nextKey = isRtl ? 'ArrowLeft' : 'ArrowRight';\n const prevKey = isRtl ? 'ArrowRight' : 'ArrowLeft';\n\n if (event.key === nextKey) {\n event.preventDefault();\n const nextIndex = index < views!.length - 1 ? index + 1 : 0;\n controlsRef.current[nextIndex]?.focus();\n } else if (event.key === prevKey) {\n event.preventDefault();\n const prevIndex = index > 0 ? index - 1 : views!.length - 1;\n controlsRef.current[prevIndex]?.focus();\n } else if (event.key === 'Home') {\n event.preventDefault();\n controlsRef.current[0]?.focus();\n } else if (event.key === 'End') {\n event.preventDefault();\n controlsRef.current[views!.length - 1]?.focus();\n } else if (event.key === 'Enter' || event.key === ' ') {\n activatedWithKeyboardRef.current = true;\n }\n };\n\n const switchToLabelKeys: Record<ScheduleViewLevel, keyof ScheduleLabels> = {\n day: 'switchToDayView',\n week: 'switchToWeekView',\n month: 'switchToMonthView',\n year: 'switchToYearView',\n };\n\n const items = views!.map((view, index) => {\n const isSelected = value === view;\n return (\n <HeaderControl\n key={view}\n ref={(node) => {\n controlsRef.current[index] = node;\n }}\n data-type={view}\n active={isSelected}\n onClick={() => onChange?.(view)}\n onKeyDown={(event) => handleKeyDown(event, index)}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n __staticSelector={__staticSelector}\n radius={radius}\n role=\"tab\"\n aria-label={getLabel(switchToLabelKeys[view], resolvedLabels) as string}\n aria-selected={isSelected}\n tabIndex={isSelected ? 0 : -1}\n >\n {getLabel(view, resolvedLabels)}\n </HeaderControl>\n );\n });\n\n return (\n <Box\n {...getStyles('viewSelect')}\n role=\"tablist\"\n aria-label={getLabel('viewSelectLabel', resolvedLabels)}\n {...others}\n >\n {items}\n </Box>\n );\n});\n\nViewSelect.displayName = '@mantine/schedule/ViewSelect';\nViewSelect.classes = classes;\n"],"mappings":";;;;;;;;;AAgDA,MAAM,eAAe;CACnB,kBAAkB;CAClB,OAAO;EAAC;EAAO;EAAQ;EAAS;CAAM;AACxC;AAEA,MAAa,aAAa,SAA4B,WAAW;CAC/D,MAAM,QAAQ,SAAS,cAAc,cAAc,MAAM;CACzD,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,YACA,OACA,UACA,OACA,kBACA,QACA,QACA,GAAG,WACD;CAEJ,MAAM,YAAY,UAA6B;EAC7C,MAAM;EACN,SAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;CAChB,CAAC;CAED,MAAM,iBAAiB,wBAAwB,MAAM;CAErD,MAAM,EAAE,oBAAoB,mBAAmB,qBAAwC;EACrF;EACA;EACA;CACF,CAAC;CAED,MAAM,EAAE,QAAQ,aAAa;CAC7B,MAAM,cAAc,OAAqC,CAAC,CAAC;CAC3D,MAAM,2BAA2B,OAAO,KAAK;CAK7C,gBAAgB;EACd,IAAI,yBAAyB,WAAW,SAAS,kBAAkB,SAAS,MAAM;GAChF,MAAM,gBAAgB,MAAO,WAAW,SAAS,SAAS,KAAK;GAC/D,IAAI,kBAAkB,IACpB,YAAY,QAAQ,cAAc,EAAE,MAAM;EAE9C;EACA,yBAAyB,UAAU;CACrC,GAAG,CAAC,CAAC;CAEL,MAAM,iBAAiB,OAA+C,UAAkB;EACtF,MAAM,QAAQ,QAAQ;EACtB,MAAM,UAAU,QAAQ,cAAc;EACtC,MAAM,UAAU,QAAQ,eAAe;EAEvC,IAAI,MAAM,QAAQ,SAAS;GACzB,MAAM,eAAe;GACrB,MAAM,YAAY,QAAQ,MAAO,SAAS,IAAI,QAAQ,IAAI;GAC1D,YAAY,QAAQ,UAAU,EAAE,MAAM;EACxC,OAAO,IAAI,MAAM,QAAQ,SAAS;GAChC,MAAM,eAAe;GACrB,MAAM,YAAY,QAAQ,IAAI,QAAQ,IAAI,MAAO,SAAS;GAC1D,YAAY,QAAQ,UAAU,EAAE,MAAM;EACxC,OAAO,IAAI,MAAM,QAAQ,QAAQ;GAC/B,MAAM,eAAe;GACrB,YAAY,QAAQ,EAAE,EAAE,MAAM;EAChC,OAAO,IAAI,MAAM,QAAQ,OAAO;GAC9B,MAAM,eAAe;GACrB,YAAY,QAAQ,MAAO,SAAS,EAAE,EAAE,MAAM;EAChD,OAAO,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAChD,yBAAyB,UAAU;CAEvC;CAEA,MAAM,oBAAqE;EACzE,KAAK;EACL,MAAM;EACN,OAAO;EACP,MAAM;CACR;CAEA,MAAM,QAAQ,MAAO,KAAK,MAAM,UAAU;EACxC,MAAM,aAAa,UAAU;EAC7B,OACE,oBAAC,eAAD;GAEE,MAAM,SAAS;IACb,YAAY,QAAQ,SAAS;GAC/B;GACA,aAAW;GACX,QAAQ;GACR,eAAe,WAAW,IAAI;GAC9B,YAAY,UAAU,cAAc,OAAO,KAAK;GAChD,YAAY;GACZ,QAAQ;GACU;GACV;GACR,MAAK;GACL,cAAY,SAAS,kBAAkB,OAAO,cAAc;GAC5D,iBAAe;GACf,UAAU,aAAa,IAAI;GAE1B,UAAA,SAAS,MAAM,cAAc;EACjB,GAlBR,IAkBQ;CAEnB,CAAC;CAED,OACE,oBAAC,KAAD;EACE,GAAI,UAAU,YAAY;EAC1B,MAAK;EACL,cAAY,SAAS,mBAAmB,cAAc;EACtD,GAAI;EAEH,UAAA;CACE,CAAA;AAET,CAAC;AAED,WAAW,cAAc;AACzB,WAAW,UAAUA"}
|
|
@@ -8,6 +8,7 @@ import { getWeekDays } from "../../utils/get-week-days/get-week-days.mjs";
|
|
|
8
8
|
import { nextWeek } from "../../utils/next-week/next-week.mjs";
|
|
9
9
|
import { previousWeek } from "../../utils/previous-week/previous-week.mjs";
|
|
10
10
|
import { isAllDayEvent } from "../../utils/is-all-day-event/is-all-day-event.mjs";
|
|
11
|
+
import { getDayPosition } from "../../utils/get-day-position/get-day-position.mjs";
|
|
11
12
|
import { getTimeAxisEventStyle } from "../../utils/get-time-axis-event-style/get-time-axis-event-style.mjs";
|
|
12
13
|
import { calculateDropTime } from "../../utils/calculate-drop-time/calculate-drop-time.mjs";
|
|
13
14
|
import { getBusinessHoursMod } from "../../utils/get-business-hours-mod/get-business-hours-mod.mjs";
|
|
@@ -20,6 +21,7 @@ import { AgendaView } from "../AgendaView/AgendaView.mjs";
|
|
|
20
21
|
import { CurrentTimeIndicator } from "../CurrentTimeIndicator/CurrentTimeIndicator.mjs";
|
|
21
22
|
import { DragContext } from "../DragContext/DragContext.mjs";
|
|
22
23
|
import { ScheduleEvent } from "../ScheduleEvent/ScheduleEvent.mjs";
|
|
24
|
+
import { ScheduleBackgroundEvent } from "../ScheduleBackgroundEvent/ScheduleBackgroundEvent.mjs";
|
|
23
25
|
import { ScheduleHeaderBase } from "../ScheduleHeader/ScheduleHeaderBase.mjs";
|
|
24
26
|
import { getWeekLabel } from "./get-week-label/get-week-label.mjs";
|
|
25
27
|
import { getWeekViewEvents } from "./get-week-view-events/get-week-view-events.mjs";
|
|
@@ -27,7 +29,7 @@ import { handleWeekViewKeyDown } from "./handle-week-view-key-down.mjs";
|
|
|
27
29
|
import { WeekViewDay } from "./WeekViewDay.mjs";
|
|
28
30
|
import WeekView_module_default from "./WeekView.module.mjs";
|
|
29
31
|
import dayjs from "dayjs";
|
|
30
|
-
import { Box, ScrollArea, UnstyledButton, createVarsResolver, factory, getRadius, rem,
|
|
32
|
+
import { Box, ScrollArea, UnstyledButton, createVarsResolver, factory, getRadius, rem, useProps, useResolvedStylesApi, useStyles } from "@mantine/core";
|
|
31
33
|
import { useIsomorphicEffect, useMergedRef } from "@mantine/hooks";
|
|
32
34
|
import { createElement, useCallback, useMemo, useRef, useState } from "react";
|
|
33
35
|
import { useDatesContext } from "@mantine/dates";
|
|
@@ -53,7 +55,8 @@ const defaultProps = {
|
|
|
53
55
|
withEventsDragAndDrop: false,
|
|
54
56
|
withDragSlotSelect: false,
|
|
55
57
|
withEventResize: false,
|
|
56
|
-
mode: "default"
|
|
58
|
+
mode: "default",
|
|
59
|
+
withInteractiveBackgroundEvents: false
|
|
57
60
|
};
|
|
58
61
|
const varsResolver = createVarsResolver((_theme, { radius, allDaySlotHeight, slotHeight }) => ({ weekView: {
|
|
59
62
|
"--week-view-radius": radius !== void 0 ? getRadius(radius) : void 0,
|
|
@@ -62,7 +65,7 @@ const varsResolver = createVarsResolver((_theme, { radius, allDaySlotHeight, slo
|
|
|
62
65
|
} }));
|
|
63
66
|
const WeekView = factory((_props) => {
|
|
64
67
|
const props = useProps("WeekView", defaultProps, _props);
|
|
65
|
-
const { classNames, className, style, styles, unstyled, attributes, vars, startTime, endTime, date, onDateChange, intervalMinutes, withSubHourGridLines, slotLabelFormat, withWeekendDays, weekendDays, firstDayOfWeek, weekdayFormat, radius, highlightToday, withCurrentTimeIndicator, forceCurrentTimeIndicator, getCurrentTime, scrollAreaProps, locale, withWeekNumber, withCurrentTimeBubble, withAllDaySlots, __staticSelector, withHeader, onViewChange, previousControlProps, nextControlProps, todayControlProps, viewSelectProps, weekLabelFormat, events, allDaySlotHeight, slotHeight, labels, highlightBusinessHours, businessHours, renderEventBody, renderEvent, withEventsDragAndDrop, onEventDrop, canDragEvent, onEventDragStart, onEventDragEnd, onTimeSlotClick, onAllDaySlotClick, onEventClick, withDragSlotSelect, onSlotDragEnd, mode, startScrollTime, renderWeekLabel, onExternalEventDrop, withEventResize, onEventResize, canResizeEvent, recurrenceExpansionLimit, getTimeSlotProps, withAgenda, ...others } = props;
|
|
68
|
+
const { classNames, className, style, styles, unstyled, attributes, vars, startTime, endTime, date, onDateChange, intervalMinutes, withSubHourGridLines, slotLabelFormat, withWeekendDays, weekendDays, firstDayOfWeek, weekdayFormat, radius, highlightToday, withCurrentTimeIndicator, forceCurrentTimeIndicator, getCurrentTime, scrollAreaProps, locale, withWeekNumber, withCurrentTimeBubble, withAllDaySlots, __staticSelector, withHeader, onViewChange, previousControlProps, nextControlProps, todayControlProps, viewSelectProps, weekLabelFormat, events, allDaySlotHeight, slotHeight, labels, highlightBusinessHours, businessHours, renderEventBody, renderEvent, withEventsDragAndDrop, onEventDrop, canDragEvent, eventDragInterval, onEventDragStart, onEventDragEnd, onTimeSlotClick, onAllDaySlotClick, onEventClick, withInteractiveBackgroundEvents, withDragSlotSelect, onSlotDragEnd, mode, startScrollTime, renderWeekLabel, onExternalEventDrop, withEventResize, onEventResize, canResizeEvent, eventResizeInterval, recurrenceExpansionLimit, getTimeSlotProps, withAgenda, ...others } = props;
|
|
66
69
|
const [agendaOpen, setAgendaOpen] = useState(false);
|
|
67
70
|
const getStyles = useStyles({
|
|
68
71
|
name: __staticSelector,
|
|
@@ -90,7 +93,6 @@ const WeekView = factory((_props) => {
|
|
|
90
93
|
__staticSelector,
|
|
91
94
|
radius
|
|
92
95
|
};
|
|
93
|
-
const theme = useMantineTheme();
|
|
94
96
|
const [scrolled, setScrolled] = useState(false);
|
|
95
97
|
const ctx = useDatesContext();
|
|
96
98
|
const slots = getDayTimeIntervals({
|
|
@@ -103,11 +105,56 @@ const WeekView = factory((_props) => {
|
|
|
103
105
|
viewportRef,
|
|
104
106
|
enabled: (withEventsDragAndDrop || !!onExternalEventDrop) && mode !== "static"
|
|
105
107
|
});
|
|
108
|
+
const dragOffsetRef = useRef({
|
|
109
|
+
offset: 0,
|
|
110
|
+
size: 0
|
|
111
|
+
});
|
|
112
|
+
const getDropTimeForSlot = (target, draggedEvent) => {
|
|
113
|
+
const slotTime = slots[target.slotIndex].startTime;
|
|
114
|
+
return calculateDropTime({
|
|
115
|
+
draggedEvent,
|
|
116
|
+
targetDate: target.day,
|
|
117
|
+
targetSlotTime: slotTime,
|
|
118
|
+
intervalMinutes,
|
|
119
|
+
dragIntervalMinutes: eventDragInterval,
|
|
120
|
+
slotOffset: eventDragInterval == null ? void 0 : dragOffsetRef.current.offset,
|
|
121
|
+
slotSize: eventDragInterval == null ? void 0 : dragOffsetRef.current.size,
|
|
122
|
+
startTime,
|
|
123
|
+
endTime
|
|
124
|
+
});
|
|
125
|
+
};
|
|
106
126
|
const handleExternalDrop = useCallback((e, target) => {
|
|
107
127
|
if (!onExternalEventDrop) return;
|
|
108
128
|
const slotDate = dayjs(target.day).format("YYYY-MM-DD");
|
|
109
|
-
|
|
110
|
-
|
|
129
|
+
const slotTime = slots[target.slotIndex].startTime;
|
|
130
|
+
if (eventDragInterval == null) {
|
|
131
|
+
onExternalEventDrop(e.dataTransfer, `${slotDate} ${slotTime}`);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const slotStart = `${slotDate} ${slotTime}`;
|
|
135
|
+
const { start } = calculateDropTime({
|
|
136
|
+
draggedEvent: {
|
|
137
|
+
start: slotStart,
|
|
138
|
+
end: slotStart
|
|
139
|
+
},
|
|
140
|
+
targetDate: target.day,
|
|
141
|
+
targetSlotTime: slotTime,
|
|
142
|
+
intervalMinutes,
|
|
143
|
+
dragIntervalMinutes: eventDragInterval,
|
|
144
|
+
slotOffset: dragOffsetRef.current.offset,
|
|
145
|
+
slotSize: dragOffsetRef.current.size,
|
|
146
|
+
startTime,
|
|
147
|
+
endTime
|
|
148
|
+
});
|
|
149
|
+
onExternalEventDrop(e.dataTransfer, dayjs(start).format("YYYY-MM-DD HH:mm:ss"));
|
|
150
|
+
}, [
|
|
151
|
+
onExternalEventDrop,
|
|
152
|
+
slots,
|
|
153
|
+
eventDragInterval,
|
|
154
|
+
intervalMinutes,
|
|
155
|
+
startTime,
|
|
156
|
+
endTime
|
|
157
|
+
]);
|
|
111
158
|
const handleExternalAllDayDrop = useCallback((e, day) => {
|
|
112
159
|
if (!onExternalEventDrop) return;
|
|
113
160
|
onExternalEventDrop(e.dataTransfer, `${dayjs(day).format("YYYY-MM-DD")} 00:00:00`);
|
|
@@ -119,17 +166,21 @@ const WeekView = factory((_props) => {
|
|
|
119
166
|
canDragEvent,
|
|
120
167
|
onEventDragStart,
|
|
121
168
|
onEventDragEnd,
|
|
122
|
-
calculateDropTarget:
|
|
123
|
-
const slotTime = slots[target.slotIndex].startTime;
|
|
124
|
-
return calculateDropTime({
|
|
125
|
-
draggedEvent,
|
|
126
|
-
targetDate: target.day,
|
|
127
|
-
targetSlotTime: slotTime,
|
|
128
|
-
intervalMinutes
|
|
129
|
-
});
|
|
130
|
-
},
|
|
169
|
+
calculateDropTarget: getDropTimeForSlot,
|
|
131
170
|
onExternalDrop: onExternalEventDrop ? handleExternalDrop : void 0
|
|
132
171
|
});
|
|
172
|
+
const updateDragPreview = (target) => {
|
|
173
|
+
const draggedEvent = dragDrop.dragContextValue.draggedEvent;
|
|
174
|
+
if (eventDragInterval == null || !draggedEvent) return;
|
|
175
|
+
const { start, end } = getDropTimeForSlot(target, draggedEvent);
|
|
176
|
+
const newStart = dayjs(start).format("YYYY-MM-DD HH:mm:ss");
|
|
177
|
+
if (dragDrop.dragPreview?.start !== newStart || dragDrop.dragPreview?.target.day !== target.day) dragDrop.setDragPreview({
|
|
178
|
+
start: newStart,
|
|
179
|
+
end: dayjs(end).format("YYYY-MM-DD HH:mm:ss"),
|
|
180
|
+
target
|
|
181
|
+
});
|
|
182
|
+
};
|
|
183
|
+
const suppressDropHighlight = eventDragInterval != null && dragDrop.dragContextValue.isDragging;
|
|
133
184
|
const allDayDragDrop = useDragDropHandlers({
|
|
134
185
|
enabled: withEventsDragAndDrop,
|
|
135
186
|
mode,
|
|
@@ -161,6 +212,7 @@ const WeekView = factory((_props) => {
|
|
|
161
212
|
startTime,
|
|
162
213
|
endTime,
|
|
163
214
|
intervalMinutes,
|
|
215
|
+
resizeIntervalMinutes: eventResizeInterval,
|
|
164
216
|
onEventResize,
|
|
165
217
|
canResizeEvent
|
|
166
218
|
});
|
|
@@ -183,14 +235,15 @@ const WeekView = factory((_props) => {
|
|
|
183
235
|
weekendDays: ctx.getWeekendDays(weekendDays),
|
|
184
236
|
firstDayOfWeek: ctx.getFirstDayOfWeek(firstDayOfWeek)
|
|
185
237
|
});
|
|
238
|
+
const expandedEvents = expandRecurringEvents({
|
|
239
|
+
events,
|
|
240
|
+
rangeStart: dayjs(weekdays[0]).startOf("day").toDate(),
|
|
241
|
+
rangeEnd: dayjs(weekdays[weekdays.length - 1]).endOf("day").toDate(),
|
|
242
|
+
expansionLimit: recurrenceExpansionLimit
|
|
243
|
+
});
|
|
186
244
|
const weekEvents = getWeekViewEvents({
|
|
187
245
|
date,
|
|
188
|
-
events:
|
|
189
|
-
events,
|
|
190
|
-
rangeStart: dayjs(weekdays[0]).startOf("day").toDate(),
|
|
191
|
-
rangeEnd: dayjs(weekdays[weekdays.length - 1]).endOf("day").toDate(),
|
|
192
|
-
expansionLimit: recurrenceExpansionLimit
|
|
193
|
-
}),
|
|
246
|
+
events: expandedEvents,
|
|
194
247
|
startTime,
|
|
195
248
|
endTime,
|
|
196
249
|
intervalMinutes,
|
|
@@ -200,8 +253,9 @@ const WeekView = factory((_props) => {
|
|
|
200
253
|
});
|
|
201
254
|
const timeValues = slots.reduce((acc, interval) => {
|
|
202
255
|
if (!interval.isHourStart) return acc;
|
|
256
|
+
const intervalTime = dayjs(`${dayjs(date).format("YYYY-MM-DD")} ${interval.startTime}`);
|
|
203
257
|
const label = formatDate({
|
|
204
|
-
date:
|
|
258
|
+
date: intervalTime,
|
|
205
259
|
locale: ctx.getLocale(locale),
|
|
206
260
|
format: slotLabelFormat
|
|
207
261
|
});
|
|
@@ -250,14 +304,33 @@ const WeekView = factory((_props) => {
|
|
|
250
304
|
const rect = slotNode.getBoundingClientRect();
|
|
251
305
|
return event.clientY >= rect.top && event.clientY <= rect.bottom;
|
|
252
306
|
});
|
|
253
|
-
if (slotIndex >= 0)
|
|
307
|
+
if (slotIndex >= 0) {
|
|
308
|
+
const rect = daySlots[slotIndex].getBoundingClientRect();
|
|
309
|
+
dragOffsetRef.current = {
|
|
310
|
+
offset: event.clientY - rect.top,
|
|
311
|
+
size: rect.height
|
|
312
|
+
};
|
|
313
|
+
return slotIndex;
|
|
314
|
+
}
|
|
254
315
|
const firstSlot = daySlots[0];
|
|
255
316
|
const lastSlot = daySlots[daySlots.length - 1];
|
|
256
317
|
if (!firstSlot || !lastSlot) return null;
|
|
257
318
|
const firstRect = firstSlot.getBoundingClientRect();
|
|
258
319
|
const lastRect = lastSlot.getBoundingClientRect();
|
|
259
|
-
if (event.clientY < firstRect.top)
|
|
260
|
-
|
|
320
|
+
if (event.clientY < firstRect.top) {
|
|
321
|
+
dragOffsetRef.current = {
|
|
322
|
+
offset: 0,
|
|
323
|
+
size: firstRect.height
|
|
324
|
+
};
|
|
325
|
+
return 0;
|
|
326
|
+
}
|
|
327
|
+
if (event.clientY > lastRect.bottom) {
|
|
328
|
+
dragOffsetRef.current = {
|
|
329
|
+
offset: lastRect.height,
|
|
330
|
+
size: lastRect.height
|
|
331
|
+
};
|
|
332
|
+
return daySlots.length - 1;
|
|
333
|
+
}
|
|
261
334
|
return null;
|
|
262
335
|
}, []);
|
|
263
336
|
const handleSlotKeyDown = (event, dayIndex, slotIndex) => {
|
|
@@ -323,32 +396,20 @@ const WeekView = factory((_props) => {
|
|
|
323
396
|
...getStyles("weekViewDayNumber"),
|
|
324
397
|
key: "date"
|
|
325
398
|
}, dayjs(day).date())));
|
|
399
|
+
const interactiveBackgroundEvents = withInteractiveBackgroundEvents && mode !== "static";
|
|
326
400
|
const days = weekdays.map((day, dayIndex) => {
|
|
327
|
-
const backgroundEventNodes = (weekEvents.backgroundEvents[day] || []).filter((event) => !event.position.allDay).map((event) => {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
height: `${event.position.height}%`,
|
|
340
|
-
width: "100%"
|
|
341
|
-
} }),
|
|
342
|
-
__vars: {
|
|
343
|
-
"--bg-event-bg": colors.background,
|
|
344
|
-
"--bg-event-color": colors.color
|
|
345
|
-
},
|
|
346
|
-
children: bgEventBody
|
|
347
|
-
};
|
|
348
|
-
if (typeof renderEvent === "function") return renderEvent(event, bgEventProps);
|
|
349
|
-
const { key: bgEventKey, ...restBgEventProps } = bgEventProps;
|
|
350
|
-
return /* @__PURE__ */ jsx(Box, { ...restBgEventProps }, bgEventKey);
|
|
351
|
-
});
|
|
401
|
+
const backgroundEventNodes = (weekEvents.backgroundEvents[day] || []).filter((event) => !event.position.allDay).map((event) => /* @__PURE__ */ jsx(ScheduleBackgroundEvent, {
|
|
402
|
+
event,
|
|
403
|
+
renderEvent,
|
|
404
|
+
renderEventBody,
|
|
405
|
+
interactive: interactiveBackgroundEvents,
|
|
406
|
+
onEventClick,
|
|
407
|
+
...getStyles("weekViewBackgroundEvent", { style: {
|
|
408
|
+
top: `${event.position.top}%`,
|
|
409
|
+
height: `${event.position.height}%`,
|
|
410
|
+
width: "100%"
|
|
411
|
+
} })
|
|
412
|
+
}, `bg-${event.id}`));
|
|
352
413
|
const dayEvents = (weekEvents.regularEvents[day] || []).map((event) => {
|
|
353
414
|
const eventIsAllDay = isAllDayEvent({
|
|
354
415
|
event,
|
|
@@ -418,10 +479,16 @@ const WeekView = factory((_props) => {
|
|
|
418
479
|
} : void 0,
|
|
419
480
|
onDaySlotsDragOver: (event, dayStr, dayIdx) => {
|
|
420
481
|
const slotIndex = getSlotIndexFromDragPoint(event, dayIdx);
|
|
421
|
-
if (slotIndex !== null)
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
482
|
+
if (slotIndex !== null) {
|
|
483
|
+
dragDrop.handleDragOver(event, {
|
|
484
|
+
day: dayStr,
|
|
485
|
+
slotIndex
|
|
486
|
+
});
|
|
487
|
+
updateDragPreview({
|
|
488
|
+
day: dayStr,
|
|
489
|
+
slotIndex
|
|
490
|
+
});
|
|
491
|
+
}
|
|
425
492
|
},
|
|
426
493
|
onDaySlotsDragLeave: dragDrop.handleDragLeave,
|
|
427
494
|
onDaySlotsDrop: (event, dayStr, dayIdx) => {
|
|
@@ -431,7 +498,7 @@ const WeekView = factory((_props) => {
|
|
|
431
498
|
slotIndex
|
|
432
499
|
});
|
|
433
500
|
},
|
|
434
|
-
dropTargetSlotIndex: dragDrop.dropTarget?.day === day ? dragDrop.dropTarget.slotIndex : void 0,
|
|
501
|
+
dropTargetSlotIndex: !suppressDropHighlight && dragDrop.dropTarget?.day === day ? dragDrop.dropTarget.slotIndex : void 0,
|
|
435
502
|
withDragSlotSelect,
|
|
436
503
|
onSlotPointerDown: slotDragSelect.handleSlotPointerDown,
|
|
437
504
|
isSlotDragSelected: slotDragSelect.isSlotSelected,
|
|
@@ -439,7 +506,29 @@ const WeekView = factory((_props) => {
|
|
|
439
506
|
daySlotsContainersRef.current[dayIndex] = node;
|
|
440
507
|
},
|
|
441
508
|
getTimeSlotProps,
|
|
442
|
-
children: [
|
|
509
|
+
children: [
|
|
510
|
+
backgroundEventNodes,
|
|
511
|
+
dayEvents,
|
|
512
|
+
dragDrop.dragPreview?.target.day === day && dragDrop.dragContextValue.draggedEvent && /* @__PURE__ */ jsx(Box, { ...getStyles("weekViewDragPreview", { style: (() => {
|
|
513
|
+
const { top, height } = getDayPosition({
|
|
514
|
+
event: {
|
|
515
|
+
...dragDrop.dragContextValue.draggedEvent,
|
|
516
|
+
start: dragDrop.dragPreview.start,
|
|
517
|
+
end: dragDrop.dragPreview.end
|
|
518
|
+
},
|
|
519
|
+
startTime,
|
|
520
|
+
endTime,
|
|
521
|
+
intervalMinutes
|
|
522
|
+
});
|
|
523
|
+
return {
|
|
524
|
+
position: "absolute",
|
|
525
|
+
insetInlineStart: 0,
|
|
526
|
+
insetInlineEnd: 0,
|
|
527
|
+
top: `${top}%`,
|
|
528
|
+
height: `${height}%`
|
|
529
|
+
};
|
|
530
|
+
})() }) })
|
|
531
|
+
]
|
|
443
532
|
}, day);
|
|
444
533
|
});
|
|
445
534
|
const allDaySlots = weekdays.map((day, dayIndex) => /* @__PURE__ */ jsx(UnstyledButton, {
|
|
@@ -480,32 +569,19 @@ const WeekView = factory((_props) => {
|
|
|
480
569
|
const allDayBgEvents = (weekEvents.backgroundEvents[day] || []).filter((event) => event.position.allDay);
|
|
481
570
|
const dayWidth = 100 / weekdays.length;
|
|
482
571
|
const dayOffset = dayIndex * dayWidth;
|
|
483
|
-
return allDayBgEvents.map((event) => {
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
left: `${dayOffset}%`,
|
|
497
|
-
width: `${dayWidth}%`
|
|
498
|
-
} }),
|
|
499
|
-
__vars: {
|
|
500
|
-
"--bg-event-bg": colors.background,
|
|
501
|
-
"--bg-event-color": colors.color
|
|
502
|
-
},
|
|
503
|
-
children: bgEventBody
|
|
504
|
-
};
|
|
505
|
-
if (typeof renderEvent === "function") return renderEvent(event, bgEventProps);
|
|
506
|
-
const { key: bgEventKey, ...restBgEventProps } = bgEventProps;
|
|
507
|
-
return /* @__PURE__ */ jsx(Box, { ...restBgEventProps }, bgEventKey);
|
|
508
|
-
});
|
|
572
|
+
return allDayBgEvents.map((event) => /* @__PURE__ */ jsx(ScheduleBackgroundEvent, {
|
|
573
|
+
event,
|
|
574
|
+
renderEvent,
|
|
575
|
+
renderEventBody,
|
|
576
|
+
interactive: interactiveBackgroundEvents,
|
|
577
|
+
onEventClick,
|
|
578
|
+
...getStyles("weekViewBackgroundEvent", { style: {
|
|
579
|
+
top: 0,
|
|
580
|
+
height: "100%",
|
|
581
|
+
left: `${dayOffset}%`,
|
|
582
|
+
width: `${dayWidth}%`
|
|
583
|
+
} })
|
|
584
|
+
}, `bg-allday-${event.id}-${day}`));
|
|
509
585
|
});
|
|
510
586
|
const extraRows = Math.max(...weekEvents.allDayEvents.map((event) => event.position.row), 1) - 1;
|
|
511
587
|
const content = /* @__PURE__ */ jsxs(Box, {
|
|
@@ -563,7 +639,8 @@ const WeekView = factory((_props) => {
|
|
|
563
639
|
mod: {
|
|
564
640
|
"with-weekends": withWeekendDays,
|
|
565
641
|
"hide-sub-hour-grid-lines": !withSubHourGridLines,
|
|
566
|
-
"event-interaction": eventResize.isResizing || dragDrop.dragContextValue.isDragging
|
|
642
|
+
"event-interaction": eventResize.isResizing || dragDrop.dragContextValue.isDragging,
|
|
643
|
+
"all-day-dragging": allDayDragDrop.dragContextValue.isDragging
|
|
567
644
|
},
|
|
568
645
|
children: /* @__PURE__ */ jsxs(ScrollArea.Autosize, {
|
|
569
646
|
scrollbarSize: 4,
|