@mantine/schedule 9.4.0 → 9.4.2

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.
Files changed (62) hide show
  1. package/cjs/components/DayView/DayView.cjs +6 -2
  2. package/cjs/components/DayView/DayView.cjs.map +1 -1
  3. package/cjs/components/ResourcesDayView/ResourcesDayView.cjs +26 -18
  4. package/cjs/components/ResourcesDayView/ResourcesDayView.cjs.map +1 -1
  5. package/cjs/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.cjs +22 -6
  6. package/cjs/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.cjs.map +1 -1
  7. package/cjs/components/ResourcesSchedule/ResourcesSchedule.cjs +3 -0
  8. package/cjs/components/ResourcesSchedule/ResourcesSchedule.cjs.map +1 -1
  9. package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs +99 -25
  10. package/cjs/components/ResourcesWeekView/ResourcesWeekView.cjs.map +1 -1
  11. package/cjs/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.cjs +3 -2
  12. package/cjs/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.cjs.map +1 -1
  13. package/cjs/components/ScheduleEvent/ScheduleEvent.module.cjs.map +1 -1
  14. package/cjs/components/WeekView/WeekView.cjs +7 -3
  15. package/cjs/components/WeekView/WeekView.cjs.map +1 -1
  16. package/cjs/hooks/use-horizontal-event-resize.cjs +12 -4
  17. package/cjs/hooks/use-horizontal-event-resize.cjs.map +1 -1
  18. package/cjs/index.cjs +4 -0
  19. package/cjs/utils/clamp-interval-minutes/clamp-interval-minutes.cjs +13 -4
  20. package/cjs/utils/clamp-interval-minutes/clamp-interval-minutes.cjs.map +1 -1
  21. package/cjs/utils/get-day-relative-percent/get-day-relative-percent.cjs +18 -0
  22. package/cjs/utils/get-day-relative-percent/get-day-relative-percent.cjs.map +1 -0
  23. package/cjs/utils/get-time-axis-event-style/get-time-axis-event-style.cjs +21 -0
  24. package/cjs/utils/get-time-axis-event-style/get-time-axis-event-style.cjs.map +1 -0
  25. package/esm/components/DayView/DayView.mjs +6 -2
  26. package/esm/components/DayView/DayView.mjs.map +1 -1
  27. package/esm/components/ResourcesDayView/ResourcesDayView.mjs +26 -18
  28. package/esm/components/ResourcesDayView/ResourcesDayView.mjs.map +1 -1
  29. package/esm/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.mjs +22 -6
  30. package/esm/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.mjs.map +1 -1
  31. package/esm/components/ResourcesSchedule/ResourcesSchedule.mjs +3 -0
  32. package/esm/components/ResourcesSchedule/ResourcesSchedule.mjs.map +1 -1
  33. package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs +100 -26
  34. package/esm/components/ResourcesWeekView/ResourcesWeekView.mjs.map +1 -1
  35. package/esm/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.mjs +3 -2
  36. package/esm/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.mjs.map +1 -1
  37. package/esm/components/ScheduleEvent/ScheduleEvent.module.mjs.map +1 -1
  38. package/esm/components/WeekView/WeekView.mjs +7 -3
  39. package/esm/components/WeekView/WeekView.mjs.map +1 -1
  40. package/esm/hooks/use-horizontal-event-resize.mjs +12 -4
  41. package/esm/hooks/use-horizontal-event-resize.mjs.map +1 -1
  42. package/esm/index.mjs +3 -1
  43. package/esm/utils/clamp-interval-minutes/clamp-interval-minutes.mjs +13 -4
  44. package/esm/utils/clamp-interval-minutes/clamp-interval-minutes.mjs.map +1 -1
  45. package/esm/utils/get-day-relative-percent/get-day-relative-percent.mjs +18 -0
  46. package/esm/utils/get-day-relative-percent/get-day-relative-percent.mjs.map +1 -0
  47. package/esm/utils/get-time-axis-event-style/get-time-axis-event-style.mjs +21 -0
  48. package/esm/utils/get-time-axis-event-style/get-time-axis-event-style.mjs.map +1 -0
  49. package/lib/components/DayView/DayView.d.ts +1 -1
  50. package/lib/components/ResourcesDayView/ResourcesDayView.d.ts +6 -2
  51. package/lib/components/ResourcesDayView/get-resources-day-view-events/get-resources-day-view-events.d.ts +2 -1
  52. package/lib/components/ResourcesWeekView/ResourcesWeekView.d.ts +17 -1
  53. package/lib/components/ResourcesWeekView/get-resources-week-view-events/get-resources-week-view-events.d.ts +2 -1
  54. package/lib/components/WeekView/WeekView.d.ts +1 -1
  55. package/lib/hooks/use-horizontal-event-resize.d.ts +3 -1
  56. package/lib/utils/clamp-interval-minutes/clamp-interval-minutes.d.ts +10 -1
  57. package/lib/utils/get-day-relative-percent/get-day-relative-percent.d.ts +15 -0
  58. package/lib/utils/get-time-axis-event-style/get-time-axis-event-style.d.ts +26 -0
  59. package/lib/utils/index.d.ts +2 -0
  60. package/package.json +4 -4
  61. package/styles.css +16 -1
  62. package/styles.layer.css +16 -1
@@ -1,6 +1,6 @@
1
1
  import { BoxProps, DataAttributes, ElementProps, Factory, MantineRadius, ScrollAreaProps, StylesApiProps } from '@mantine/core';
2
2
  import { ScheduleLabelsOverride } from '../../labels';
3
- import { DateLabelFormat, DateStringValue, DateTimeStringValue, ScheduleEventData, ScheduleMode, ScheduleResourceData, ScheduleResourceGroup, ScheduleViewLevel } from '../../types';
3
+ import { AnyDateValue, DateLabelFormat, DateStringValue, DateTimeStringValue, ScheduleEventData, ScheduleMode, ScheduleResourceData, ScheduleResourceGroup, ScheduleViewLevel } from '../../types';
4
4
  import { MoreEventsProps, MoreEventsStylesNames } from '../MoreEvents/MoreEvents';
5
5
  import { RenderEvent, RenderEventBody } from '../ScheduleEvent/ScheduleEvent';
6
6
  import { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';
@@ -21,8 +21,10 @@ export interface ResourcesDayViewProps extends BoxProps, StylesApiProps<Resource
21
21
  startTime?: string;
22
22
  /** End time for the day view, in `HH:mm:ss` format @default 23:59:59 */
23
23
  endTime?: string;
24
- /** Number of minutes for each interval in the day view @default 60 */
24
+ /** Number of minutes for each interval in the day view. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours (e.g. `120`, `240`) @default 60 */
25
25
  intervalMinutes?: number;
26
+ /** Minimum on-screen size of an event along the time axis, in px. Prevents very short events from collapsing. Larger values make brief events easier to see but extend them past their real start time. @default 1 */
27
+ minEventSize?: number;
26
28
  /** Dayjs format for slot labels or a callback function that returns formatted value @default HH:mm */
27
29
  slotLabelFormat?: DateLabelFormat;
28
30
  /** Key of `theme.radius` or any valid CSS value to set `border-radius` @default theme.defaultRadius */
@@ -37,6 +39,8 @@ export interface ResourcesDayViewProps extends BoxProps, StylesApiProps<Resource
37
39
  withCurrentTimeIndicator?: boolean;
38
40
  /** If set, the time indicator displays the current time in the bubble @default true */
39
41
  withCurrentTimeBubble?: boolean;
42
+ /** A function to get the current time, called on every tick. Can be used to display the current time indicator in a different timezone. @default () => dayjs() */
43
+ getCurrentTime?: () => AnyDateValue;
40
44
  /** If set, the header is displayed @default true */
41
45
  withHeader?: boolean;
42
46
  /** Called when view level select button is clicked */
@@ -5,6 +5,7 @@ interface GetResourcesDayViewEventsInput {
5
5
  date: AnyDateValue;
6
6
  startTime?: string;
7
7
  endTime?: string;
8
+ intervalMinutes?: number;
8
9
  }
9
10
  export interface ResourcesDayViewEventsResult {
10
11
  regularEvents: Record<string | number, DayPositionedEventData[]>;
@@ -12,5 +13,5 @@ export interface ResourcesDayViewEventsResult {
12
13
  backgroundTimedEvents: Record<string | number, DayPositionedEventData[]>;
13
14
  backgroundAllDayEvents: Record<string | number, DayPositionedEventData[]>;
14
15
  }
15
- export declare function getResourcesDayViewEvents({ events, resources, date, startTime, endTime, }: GetResourcesDayViewEventsInput): ResourcesDayViewEventsResult;
16
+ export declare function getResourcesDayViewEvents({ events, resources, date, startTime, endTime, intervalMinutes, }: GetResourcesDayViewEventsInput): ResourcesDayViewEventsResult;
16
17
  export {};
@@ -1,6 +1,6 @@
1
1
  import { BoxProps, DataAttributes, ElementProps, Factory, MantineRadius, ScrollAreaProps, StylesApiProps } from '@mantine/core';
2
2
  import { ScheduleLabelsOverride } from '../../labels';
3
- import { DateLabelFormat, DateStringValue, DateTimeStringValue, DayOfWeek, ScheduleEventData, ScheduleMode, ScheduleResourceData, ScheduleResourceGroup, ScheduleViewLevel } from '../../types';
3
+ import { AnyDateValue, DateLabelFormat, DateStringValue, DateTimeStringValue, DayOfWeek, ScheduleEventData, ScheduleMode, ScheduleResourceData, ScheduleResourceGroup, ScheduleViewLevel } from '../../types';
4
4
  import { MoreEventsProps, MoreEventsStylesNames } from '../MoreEvents/MoreEvents';
5
5
  import { RenderEvent, RenderEventBody } from '../ScheduleEvent/ScheduleEvent';
6
6
  import { CombinedScheduleHeaderStylesNames } from '../ScheduleHeader/ScheduleHeader';
@@ -16,7 +16,10 @@ export interface ResourcesWeekViewProps extends BoxProps, StylesApiProps<Resourc
16
16
  resources: ScheduleResourceData[];
17
17
  startTime?: string;
18
18
  endTime?: string;
19
+ /** Number of minutes for each interval in the week view. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours (e.g. `120`, `240`) @default 60 */
19
20
  intervalMinutes?: number;
21
+ /** Minimum on-screen size of an event along the time axis, in px. Prevents very short events from collapsing. Larger values make brief events easier to see but extend them past their real start time. @default 1 */
22
+ minEventSize?: number;
20
23
  slotLabelFormat?: DateLabelFormat;
21
24
  radius?: MantineRadius;
22
25
  /** Date and time to scroll to on initial render, in `YYYY-MM-DD HH:mm:ss` format */
@@ -25,6 +28,8 @@ export interface ResourcesWeekViewProps extends BoxProps, StylesApiProps<Resourc
25
28
  locale?: string;
26
29
  withCurrentTimeIndicator?: boolean;
27
30
  withCurrentTimeBubble?: boolean;
31
+ /** A function to get the current time, called on every tick. Can be used to display the current time indicator in a different timezone. @default () => dayjs() */
32
+ getCurrentTime?: () => AnyDateValue;
28
33
  withHeader?: boolean;
29
34
  onViewChange?: (view: ScheduleViewLevel) => void;
30
35
  previousControlProps?: React.ComponentProps<'button'> & DataAttributes;
@@ -81,6 +86,17 @@ export interface ResourcesWeekViewProps extends BoxProps, StylesApiProps<Resourc
81
86
  dropDateTime: DateTimeStringValue;
82
87
  resourceId?: string | number;
83
88
  }) => void;
89
+ /** If true, events can be resized by dragging their left/right edges @default false */
90
+ withEventResize?: boolean;
91
+ /** Called when event is resized */
92
+ onEventResize?: (data: {
93
+ eventId: string | number;
94
+ newStart: DateTimeStringValue;
95
+ newEnd: DateTimeStringValue;
96
+ event: ScheduleEventData;
97
+ }) => void;
98
+ /** Function to determine if event can be resized */
99
+ canResizeEvent?: (event: ScheduleEventData) => boolean;
84
100
  recurrenceExpansionLimit?: number;
85
101
  /** Maximum number of events visible per time slot before "+more" indicator shows, minimum value is 1 @default 2 */
86
102
  maxEventsPerTimeSlot?: number;
@@ -23,7 +23,8 @@ interface GetResourcesWeekViewEventsInput {
23
23
  weekdays: string[];
24
24
  startTime?: string;
25
25
  endTime?: string;
26
+ intervalMinutes?: number;
26
27
  expansionLimit?: number;
27
28
  }
28
- export declare function getResourcesWeekViewEvents({ events, resources, weekdays, startTime, endTime, expansionLimit, }: GetResourcesWeekViewEventsInput): ResourcesWeekViewEventsResult;
29
+ export declare function getResourcesWeekViewEvents({ events, resources, weekdays, startTime, endTime, intervalMinutes, expansionLimit, }: GetResourcesWeekViewEventsInput): ResourcesWeekViewEventsResult;
29
30
  export {};
@@ -21,7 +21,7 @@ export interface WeekViewProps extends BoxProps, StylesApiProps<WeekViewFactory>
21
21
  startTime?: string;
22
22
  /** End time for the day view, in `HH:mm:ss` format @default 23:59:59 */
23
23
  endTime?: string;
24
- /** Number of minutes for each interval in the day view @default 60 */
24
+ /** Number of minutes for each interval in the day view. Must divide evenly into an hour (e.g. `15`, `30`) or be a whole number of hours (e.g. `120`, `240`) @default 60 */
25
25
  intervalMinutes?: number;
26
26
  /** If set, grid lines are displayed for intervals smaller than one hour, for example 15 and 30 minutes intervals @default true */
27
27
  withSubHourGridLines?: boolean;
@@ -15,13 +15,15 @@ export interface UseHorizontalEventResizeInput {
15
15
  canResizeEvent?: (event: ScheduleEventData) => boolean;
16
16
  }
17
17
  export declare function useHorizontalEventResize({ enabled, mode, startTime, endTime, intervalMinutes, onEventResize, canResizeEvent, }: UseHorizontalEventResizeInput): {
18
- handleResizeStart: ({ event, edge, container, originalLeft, originalWidth, eventDate, pointerEvent, }: {
18
+ handleResizeStart: ({ event, edge, container, originalLeft, originalWidth, eventDate, dayIndex, dayCount, pointerEvent, }: {
19
19
  event: ScheduleEventData;
20
20
  edge: ResizeEdge;
21
21
  container: HTMLElement;
22
22
  originalLeft: number;
23
23
  originalWidth: number;
24
24
  eventDate: string;
25
+ dayIndex?: number;
26
+ dayCount?: number;
25
27
  pointerEvent: React.PointerEvent;
26
28
  }) => void;
27
29
  isResizing: boolean;
@@ -1,2 +1,11 @@
1
- /** Clamp interval minutes to valid values (1-60) and ensure it divides evenly into 60 */
1
+ /**
2
+ * Clamps interval minutes to a value that keeps the time grid consistent:
3
+ *
4
+ * - Values of 60 or less must divide evenly into an hour (e.g. `15`, `20`, `30`, `60`).
5
+ * - Values above an hour must be a whole number of hours (e.g. `120`, `240`) so that slots
6
+ * still start on hour boundaries.
7
+ *
8
+ * Values that don't satisfy these rules fall back to `60`. The result is capped to a single
9
+ * day (`1440`).
10
+ */
2
11
  export declare function clampIntervalMinutes(intervalMinutes: number): number;
@@ -0,0 +1,15 @@
1
+ interface GetDayRelativePercentInput {
2
+ clientX: number;
3
+ containerLeft: number;
4
+ containerWidth: number;
5
+ dayIndex: number;
6
+ dayCount: number;
7
+ }
8
+ /**
9
+ * Maps a horizontal pointer position to a percent (0-100) within a single day's
10
+ * sub-region of a container that holds `dayCount` equal-width days side by side.
11
+ * `dayIndex === 0` and `dayCount === 1` make it equivalent to a plain percent
12
+ * across the whole container. The result is clamped to the `[0, 100]` range.
13
+ */
14
+ export declare function getDayRelativePercent({ clientX, containerLeft, containerWidth, dayIndex, dayCount, }: GetDayRelativePercentInput): number;
15
+ export {};
@@ -0,0 +1,26 @@
1
+ export interface GetTimeAxisEventStyleInput {
2
+ /** Offset of the event's leading edge along the time axis, in percent */
3
+ start: number;
4
+ /** Span of the event along the time axis, in percent */
5
+ span: number;
6
+ /** Axis along which time flows @default 'horizontal' */
7
+ axis?: 'horizontal' | 'vertical';
8
+ /** Minimum visible size of the event along the time axis, in px. Prevents very short events from collapsing to zero. The minimum grows toward the trailing edge so the box never starts before the event's real start. @default 1 */
9
+ minSize?: number;
10
+ }
11
+ export interface HorizontalEventStyle {
12
+ left: string;
13
+ right: string;
14
+ minWidth: string;
15
+ }
16
+ export interface VerticalEventStyle {
17
+ top: string;
18
+ bottom: string;
19
+ minHeight: string;
20
+ }
21
+ export declare function getTimeAxisEventStyle(input: GetTimeAxisEventStyleInput & {
22
+ axis?: 'horizontal';
23
+ }): HorizontalEventStyle;
24
+ export declare function getTimeAxisEventStyle(input: GetTimeAxisEventStyleInput & {
25
+ axis: 'vertical';
26
+ }): VerticalEventStyle;
@@ -30,6 +30,7 @@ export { getMonthRange } from './get-month-range/get-month-range';
30
30
  export { parseTimeString } from './parse-time-string/parse-time-string';
31
31
  export { toTimeString } from './to-time-string/to-time-string';
32
32
  export { getDayPosition } from './get-day-position/get-day-position';
33
+ export { getTimeAxisEventStyle } from './get-time-axis-event-style/get-time-axis-event-style';
33
34
  export { calculateDropTime } from './calculate-drop-time/calculate-drop-time';
34
35
  export { calculateMonthDropDate } from './calculate-month-drop-date/calculate-month-drop-date';
35
36
  export { getBusinessHoursMod } from './get-business-hours-mod/get-business-hours-mod';
@@ -45,3 +46,4 @@ export { handleResourcesGridKeyDown } from './handle-resources-grid-key-down/han
45
46
  export type { HandleResourcesGridKeyDownInput, ResourcesGridControlsRef, } from './handle-resources-grid-key-down/handle-resources-grid-key-down';
46
47
  export { getGroupToResourceIdMap } from './get-group-to-resource-id-map/get-group-to-resource-id-map';
47
48
  export { getIndexFromDragPoint } from './get-index-from-drag-point/get-index-from-drag-point';
49
+ export { getDayRelativePercent } from './get-day-relative-percent/get-day-relative-percent';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mantine/schedule",
3
- "version": "9.4.0",
3
+ "version": "9.4.2",
4
4
  "description": "Schedule Mantine component",
5
5
  "homepage": "https://mantine.dev/",
6
6
  "license": "MIT",
@@ -35,9 +35,9 @@
35
35
  "directory": "packages/@mantine/schedule"
36
36
  },
37
37
  "peerDependencies": {
38
- "@mantine/core": "9.4.0",
39
- "@mantine/dates": "9.4.0",
40
- "@mantine/hooks": "9.4.0",
38
+ "@mantine/core": "9.4.2",
39
+ "@mantine/dates": "9.4.2",
40
+ "@mantine/hooks": "9.4.2",
41
41
  "react": "^19.2.0",
42
42
  "react-dom": "^19.2.0"
43
43
  },
package/styles.css CHANGED
@@ -296,7 +296,7 @@
296
296
  background-color: var(--event-bg);
297
297
  color: var(--event-color);
298
298
  pointer-events: all;
299
- border-radius: var(--event-radius);
299
+ border-radius: min(var(--event-radius), 50%);
300
300
  font-weight: var(--mantine-font-weight-medium);
301
301
  font-size: calc(0.75rem * var(--mantine-scale));
302
302
  line-height: 1;
@@ -333,6 +333,21 @@
333
333
  }
334
334
  }
335
335
 
336
+ @container (max-width: 12px) {
337
+
338
+ .m_71699dc6:where([data-auto-size]) {
339
+ padding-inline: 0
340
+ }
341
+ }
342
+
343
+ @container (min-width: 16px) {
344
+
345
+ .m_71699dc6:where([data-auto-size]) {
346
+ width: calc(100% - 2px);
347
+ margin-inline: auto
348
+ }
349
+ }
350
+
336
351
  @container (max-height: 18px) {
337
352
 
338
353
  .m_71699dc6:where([data-auto-size]) {
package/styles.layer.css CHANGED
@@ -296,7 +296,7 @@
296
296
  background-color: var(--event-bg);
297
297
  color: var(--event-color);
298
298
  pointer-events: all;
299
- border-radius: var(--event-radius);
299
+ border-radius: min(var(--event-radius), 50%);
300
300
  font-weight: var(--mantine-font-weight-medium);
301
301
  font-size: calc(0.75rem * var(--mantine-scale));
302
302
  line-height: 1;
@@ -333,6 +333,21 @@
333
333
  }
334
334
  }
335
335
 
336
+ @container (max-width: 12px) {
337
+
338
+ .m_71699dc6:where([data-auto-size]) {
339
+ padding-inline: 0
340
+ }
341
+ }
342
+
343
+ @container (min-width: 16px) {
344
+
345
+ .m_71699dc6:where([data-auto-size]) {
346
+ width: calc(100% - 2px);
347
+ margin-inline: auto
348
+ }
349
+ }
350
+
336
351
  @container (max-height: 18px) {
337
352
 
338
353
  .m_71699dc6:where([data-auto-size]) {