diff --git a/packages/pluggableWidgets/calendar-web/src/Calendar.xml b/packages/pluggableWidgets/calendar-web/src/Calendar.xml index f9850a7a66..70f0d23d74 100644 --- a/packages/pluggableWidgets/calendar-web/src/Calendar.xml +++ b/packages/pluggableWidgets/calendar-web/src/Calendar.xml @@ -131,6 +131,14 @@ Show all events Auto-adjust calendar height to display all events without "more" links + + Step + Determines the selectable time increments in week and day views + + + Time slots + The number of slots per "section" in the time grid views. Adjust with step to change the default of 1 hour long groups, with 30 minute slots. + diff --git a/packages/pluggableWidgets/calendar-web/src/__tests__/Calendar.spec.tsx b/packages/pluggableWidgets/calendar-web/src/__tests__/Calendar.spec.tsx index 2bd2baeee0..5ed19a7919 100644 --- a/packages/pluggableWidgets/calendar-web/src/__tests__/Calendar.spec.tsx +++ b/packages/pluggableWidgets/calendar-web/src/__tests__/Calendar.spec.tsx @@ -86,6 +86,8 @@ const customViewProps: CalendarContainerProps = { customViewShowFriday: true, customViewShowSaturday: false, showAllEvents: true, + step: 60, + timeslots: 2, toolbarItems: [], topBarDateFormat: undefined }; diff --git a/packages/pluggableWidgets/calendar-web/src/__tests__/__snapshots__/Calendar.spec.tsx.snap b/packages/pluggableWidgets/calendar-web/src/__tests__/__snapshots__/Calendar.spec.tsx.snap index b7d86299ff..5bce2efd12 100644 --- a/packages/pluggableWidgets/calendar-web/src/__tests__/__snapshots__/Calendar.spec.tsx.snap +++ b/packages/pluggableWidgets/calendar-web/src/__tests__/__snapshots__/Calendar.spec.tsx.snap @@ -19,6 +19,8 @@ exports[`Calendar renders correctly with basic props 1`] = ` formats="[object Object]" localizer="[object Object]" messages="[object Object]" + step="60" + timeslots="2" views="[object Object]" /> diff --git a/packages/pluggableWidgets/calendar-web/src/helpers/CalendarPropsBuilder.ts b/packages/pluggableWidgets/calendar-web/src/helpers/CalendarPropsBuilder.ts index 72b492d25f..c896a01ddd 100644 --- a/packages/pluggableWidgets/calendar-web/src/helpers/CalendarPropsBuilder.ts +++ b/packages/pluggableWidgets/calendar-web/src/helpers/CalendarPropsBuilder.ts @@ -14,6 +14,8 @@ export class CalendarPropsBuilder { private minTime: Date; private maxTime: Date; private toolbarItems?: ResolvedToolbarItem[]; + private step: number; + private timeSlots: number; constructor(private props: CalendarContainerProps) { this.isCustomView = props.view === "custom"; @@ -23,6 +25,8 @@ export class CalendarPropsBuilder { this.minTime = this.buildTime(props.minHour ?? 0); this.maxTime = this.buildTime(props.maxHour ?? 24); this.toolbarItems = this.buildToolbarItems(); + this.step = props.step; + this.timeSlots = props.timeslots; } updateProps(props: CalendarContainerProps): void { @@ -71,7 +75,9 @@ export class CalendarPropsBuilder { titleAccessor: (event: CalendarEvent) => event.title, showAllEvents: this.props.showAllEvents, min: this.minTime, - max: this.maxTime + max: this.maxTime, + step: this.step, + timeslots: this.timeSlots }; } diff --git a/packages/pluggableWidgets/calendar-web/src/helpers/useCalendarEvents.ts b/packages/pluggableWidgets/calendar-web/src/helpers/useCalendarEvents.ts index 89e54f88a9..494aa2d6e3 100644 --- a/packages/pluggableWidgets/calendar-web/src/helpers/useCalendarEvents.ts +++ b/packages/pluggableWidgets/calendar-web/src/helpers/useCalendarEvents.ts @@ -1,12 +1,18 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { CalendarEvent, EventDropOrResize } from "../utils/typings"; import { CalendarContainerProps } from "../../typings/CalendarProps"; -import { CalendarProps, NavigateAction } from "react-big-calendar"; +import { CalendarProps, NavigateAction, View } from "react-big-calendar"; import { getViewRange } from "../utils/calendar-utils"; type CalendarEventHandlers = Pick< CalendarProps, - "onSelectEvent" | "onDoubleClickEvent" | "onKeyPressEvent" | "onSelectSlot" | "onNavigate" | "selected" + | "onSelectEvent" + | "onDoubleClickEvent" + | "onKeyPressEvent" + | "onSelectSlot" + | "onNavigate" + | "selected" + | "onRangeChange" > & { onEventDrop: (event: EventDropOrResize) => void; onEventResize: (event: EventDropOrResize) => void; @@ -116,7 +122,7 @@ export function useCalendarEvents(props: CalendarContainerProps): CalendarEventH [onDragDropResize] ); - const handleRangeChange = useCallback( + const handleNavigate = useCallback( (date: Date, view: string, _action: NavigateAction) => { const action = onViewRangeChange; @@ -132,6 +138,24 @@ export function useCalendarEvents(props: CalendarContainerProps): CalendarEventH [onViewRangeChange] ); + const handleRangeChange = useCallback( + (range: Date[] | { start: Date; end: Date }, view?: View) => { + const action = onViewRangeChange; + + if (action?.canExecute) { + const start = Array.isArray(range) ? range[0] : range.start; + const end = Array.isArray(range) ? range[range.length - 1] : range.end; + + action.execute({ + rangeStart: start, + rangeEnd: end, + currentView: view + }); + } + }, + [onViewRangeChange] + ); + useEffect(() => { /** * What Is This? @@ -152,7 +176,8 @@ export function useCalendarEvents(props: CalendarContainerProps): CalendarEventH onSelectSlot: handleCreateEvent, onEventDrop: handleEventDropOrResize, onEventResize: handleEventDropOrResize, - onNavigate: handleRangeChange, + onNavigate: handleNavigate, + onRangeChange: handleRangeChange, selected }; } diff --git a/packages/pluggableWidgets/calendar-web/typings/CalendarProps.d.ts b/packages/pluggableWidgets/calendar-web/typings/CalendarProps.d.ts index 519f41a392..b0a1628d5e 100644 --- a/packages/pluggableWidgets/calendar-web/typings/CalendarProps.d.ts +++ b/packages/pluggableWidgets/calendar-web/typings/CalendarProps.d.ts @@ -90,6 +90,8 @@ export interface CalendarContainerProps { minHour: number; maxHour: number; showAllEvents: boolean; + step: number; + timeslots: number; toolbarItems: ToolbarItemsType[]; customViewShowMonday: boolean; customViewShowTuesday: boolean; @@ -143,6 +145,8 @@ export interface CalendarPreviewProps { minHour: number | null; maxHour: number | null; showAllEvents: boolean; + step: number | null; + timeslots: number | null; toolbarItems: ToolbarItemsPreviewType[]; customViewShowMonday: boolean; customViewShowTuesday: boolean;