@mantine-vue/schedule 3.4.0 → 3.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.
Files changed (40) hide show
  1. package/cjs/index.cjs +1146 -262
  2. package/cjs/index.cjs.map +1 -1
  3. package/esm/index.mjs +1145 -263
  4. package/esm/index.mjs.map +1 -1
  5. package/lib/component-props.d.ts +13 -2
  6. package/lib/components/DayView/DayView.types.d.ts +7 -3
  7. package/lib/components/DayView/DayView.vue.d.ts +2 -0
  8. package/lib/components/DayView/get-day-view-events/get-day-positioned-events.d.ts +4 -2
  9. package/lib/components/DayView/get-day-view-events/get-day-view-events.d.ts +3 -2
  10. package/lib/components/MonthView/MonthView.types.d.ts +9 -1
  11. package/lib/components/MonthView/MonthView.vue.d.ts +2 -0
  12. package/lib/components/MonthView/get-month-view-events/reserve-row.d.ts +7 -0
  13. package/lib/components/ResourcesDayView/ResourcesDayView.types.d.ts +10 -1
  14. package/lib/components/ResourcesDayView/ResourcesDayView.vue.d.ts +2 -0
  15. package/lib/components/ResourcesDayView/index.d.ts +0 -1
  16. package/lib/components/ResourcesMonthView/ResourcesMonthView.types.d.ts +10 -1
  17. package/lib/components/ResourcesMonthView/ResourcesMonthView.vue.d.ts +2 -0
  18. package/lib/components/ResourcesSchedule/ResourcesSchedule.types.d.ts +10 -1
  19. package/lib/components/ResourcesSchedule/ResourcesSchedule.vue.d.ts +2 -0
  20. package/lib/components/ResourcesWeekView/ResourcesWeekView.types.d.ts +10 -1
  21. package/lib/components/ResourcesWeekView/ResourcesWeekView.vue.d.ts +2 -0
  22. package/lib/components/Schedule/Schedule.types.d.ts +12 -2
  23. package/lib/components/Schedule/Schedule.vue.d.ts +2 -0
  24. package/lib/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.types.d.ts +12 -0
  25. package/lib/components/ScheduleBackgroundEvent/ScheduleBackgroundEvent.vue.d.ts +2 -0
  26. package/lib/components/WeekView/WeekView.types.d.ts +7 -3
  27. package/lib/components/WeekView/WeekView.vue.d.ts +2 -0
  28. package/lib/components/WeekView/get-week-view-events/get-week-positioned-events.d.ts +4 -2
  29. package/lib/hooks/use-event-resize.d.ts +10 -2
  30. package/lib/hooks/use-horizontal-event-resize.d.ts +9 -1
  31. package/lib/hooks/validate-event-resize.d.ts +26 -0
  32. package/lib/types.d.ts +40 -0
  33. package/lib/utils/apply-cascade-layout/apply-cascade-layout.d.ts +5 -0
  34. package/lib/utils/get-overlap-clusters/get-overlap-clusters.d.ts +2 -0
  35. package/lib/utils/index.d.ts +4 -0
  36. package/lib/utils/is-event-placement-allowed/is-event-placement-allowed.d.ts +13 -0
  37. package/package.json +4 -4
  38. package/styles.css +711 -379
  39. package/styles.layer.css +711 -379
  40. package/lib/components/ResourcesDayView/get-overlap-clusters/get-overlap-clusters.d.ts +0 -2
@@ -1,5 +1,6 @@
1
1
  import type { EventDropData } from '../component-props';
2
2
  import type { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types';
3
+ import type { PreventEventOverlap, ScheduleCanResizeEventToData, ScheduleEventPlacementRejectedData } from '../types';
3
4
  type ResizeEdge = 'start' | 'end';
4
5
  interface ResizeState {
5
6
  event: ScheduleEventData;
@@ -24,8 +25,15 @@ export declare function useHorizontalEventResize(input: {
24
25
  resizeIntervalMinutes?: () => number | undefined;
25
26
  onEventResize: (data: EventDropData) => void;
26
27
  canResizeEvent: () => ((event: ScheduleEventData) => boolean) | undefined;
28
+ withBackgroundEvents?: () => boolean;
29
+ events?: () => ScheduleEventData[];
30
+ preventEventOverlap?: () => PreventEventOverlap | undefined;
31
+ canResizeEventTo?: () => ((data: ScheduleCanResizeEventToData) => boolean) | undefined;
32
+ onEventPlacementRejected?: (data: ScheduleEventPlacementRejectedData) => void;
27
33
  }): {
28
34
  state: import("vue").ShallowRef<ResizeState | null, ResizeState | null>;
35
+ resizeValid: import("vue").Ref<boolean, boolean>;
36
+ readonly resizingEdge: ResizeEdge | null;
29
37
  handleResizeStart: (params: {
30
38
  event: ScheduleEventData;
31
39
  edge: ResizeEdge;
@@ -37,7 +45,7 @@ export declare function useHorizontalEventResize(input: {
37
45
  dayIndex?: number;
38
46
  dayCount?: number;
39
47
  }) => void;
40
- getResizePosition: (id: string | number) => {
48
+ getResizePosition: (id: string | number, eventDate?: string) => {
41
49
  left: number;
42
50
  width: number;
43
51
  } | null;
@@ -0,0 +1,26 @@
1
+ import type { DateTimeStringValue, PreventEventOverlap, ScheduleCanResizeEventToData, ScheduleEventData, ScheduleEventPlacementRejectedData } from '../types';
2
+ export interface EventResizeValidationOptions {
3
+ events?: ScheduleEventData[];
4
+ preventEventOverlap?: PreventEventOverlap;
5
+ canResizeEventTo?: (data: ScheduleCanResizeEventToData) => boolean;
6
+ onEventPlacementRejected?: (data: ScheduleEventPlacementRejectedData) => void;
7
+ }
8
+ export declare function validateEventResize({ event, start, end, edge, events, preventEventOverlap, canResizeEventTo, resourceId, }: EventResizeValidationOptions & {
9
+ event: ScheduleEventData;
10
+ start: DateTimeStringValue;
11
+ end: DateTimeStringValue;
12
+ edge: 'start' | 'end';
13
+ resourceId?: string | number;
14
+ }): {
15
+ valid: boolean;
16
+ conflicts: ScheduleEventData[];
17
+ reason: "overlap";
18
+ } | {
19
+ valid: boolean;
20
+ conflicts: never[];
21
+ reason: "rejected";
22
+ } | {
23
+ valid: boolean;
24
+ conflicts: never[];
25
+ reason: null;
26
+ };
package/lib/types.d.ts CHANGED
@@ -97,6 +97,8 @@ interface ScheduleEventRuntimeMeta {
97
97
  }
98
98
  /** Event data object passed to all `@mantine/schedule` components */
99
99
  export type ScheduleEventData<Payload extends EventPayload = EventPayload> = (ScheduleSingleEventData<Payload> & ScheduleEventRuntimeMeta) | (ScheduleRecurringSeriesEventData<Payload> & ScheduleEventRuntimeMeta) | (ScheduleRecurringOverrideEventData<Payload> & ScheduleEventRuntimeMeta);
100
+ /** Controls how events that overlap in time are laid out along the horizontal axis. */
101
+ export type ScheduleEventOverlapMode = 'columns' | 'cascade';
100
102
  export interface DayEventPositionData {
101
103
  /** All day events */
102
104
  allDay: boolean;
@@ -153,4 +155,42 @@ export interface DropTarget {
153
155
  /** Target slot index (for DayView/WeekView) */
154
156
  slotIndex?: number;
155
157
  }
158
+ export type PreventEventOverlap = boolean | ((stillEvent: ScheduleEventData, movingEvent: ScheduleEventData) => boolean);
159
+ export interface ScheduleCanDropEventData {
160
+ event: ScheduleEventData;
161
+ start: DateTimeStringValue;
162
+ end: DateTimeStringValue;
163
+ resourceId?: string | number;
164
+ }
165
+ export interface ScheduleCanDropExternalEventData {
166
+ dataTransfer: DataTransfer;
167
+ start: DateTimeStringValue;
168
+ resourceId?: string | number;
169
+ }
170
+ export interface ScheduleCanResizeEventToData {
171
+ event: ScheduleEventData;
172
+ start: DateTimeStringValue;
173
+ end: DateTimeStringValue;
174
+ edge: 'start' | 'end';
175
+ }
176
+ interface ScheduleEventPlacementRejectedBase {
177
+ start: DateTimeStringValue;
178
+ end: DateTimeStringValue;
179
+ conflicts: ScheduleEventData[];
180
+ reason: 'overlap' | 'rejected';
181
+ resourceId?: string | number;
182
+ }
183
+ export type ScheduleEventPlacementRejectedData = (ScheduleEventPlacementRejectedBase & {
184
+ action: 'drop';
185
+ event: ScheduleEventData;
186
+ }) | (ScheduleEventPlacementRejectedBase & {
187
+ action: 'resize';
188
+ event: ScheduleEventData;
189
+ edge: 'start' | 'end';
190
+ }) | (Omit<ScheduleEventPlacementRejectedBase, 'end'> & {
191
+ action: 'external-drop';
192
+ dataTransfer: DataTransfer;
193
+ reason: 'rejected';
194
+ conflicts: [];
195
+ });
156
196
  export {};
@@ -0,0 +1,5 @@
1
+ import type { DayEventPositionData, ScheduleEventData } from '../../types';
2
+ export type CascadePositionedEvent = ScheduleEventData & {
3
+ position: Pick<DayEventPositionData, 'allDay' | 'column' | 'width' | 'offset' | 'overlaps'>;
4
+ };
5
+ export declare function applyCascadeLayout<T extends CascadePositionedEvent>(events: T[]): void;
@@ -0,0 +1,2 @@
1
+ import type { ScheduleEventData } from '../../types';
2
+ export declare function getOverlapClusters<T extends ScheduleEventData>(events: T[]): T[][];
@@ -22,6 +22,8 @@ export { isAllDayEvent } from './is-all-day-event/is-all-day-event';
22
22
  export { validateEvent } from './validate-event/validate-event';
23
23
  export { sortEvents } from './sort-events/sort-events';
24
24
  export { isEventsOverlap } from './is-events-overlap/is-events-overlap';
25
+ export { isEventPlacementAllowed } from './is-event-placement-allowed/is-event-placement-allowed';
26
+ export type { IsEventPlacementAllowedInput } from './is-event-placement-allowed/is-event-placement-allowed';
25
27
  export { getVisibleEvents } from './get-visible-events/get-visible-events';
26
28
  export { isMultidayEvent } from './is-multiday-event/is-multiday-event';
27
29
  export { isEventInTimeRange } from './is-event-in-time-range/is-event-in-time-range';
@@ -34,6 +36,8 @@ export { calculateDropTime } from './calculate-drop-time/calculate-drop-time';
34
36
  export { calculateMonthDropDate } from './calculate-month-drop-date/calculate-month-drop-date';
35
37
  export { getBusinessHoursMod } from './get-business-hours-mod/get-business-hours-mod';
36
38
  export { expandRecurringEvents } from './expand-recurring-events/expand-recurring-events';
39
+ export { applyCascadeLayout } from './apply-cascade-layout/apply-cascade-layout';
40
+ export { getOverlapClusters } from './get-overlap-clusters/get-overlap-clusters';
37
41
  export type { DayTimeInterval } from './get-day-time-intervals/get-day-time-intervals';
38
42
  export type { ParsedTime } from './parse-time-string/parse-time-string';
39
43
  export type { CalculateDropTimeInput, CalculateDropTimeResult, } from './calculate-drop-time/calculate-drop-time';
@@ -0,0 +1,13 @@
1
+ import type { DateTimeStringValue, PreventEventOverlap, ScheduleEventData } from '../../types';
2
+ export interface IsEventPlacementAllowedInput {
3
+ event: ScheduleEventData;
4
+ start: DateTimeStringValue;
5
+ end: DateTimeStringValue;
6
+ events: ScheduleEventData[];
7
+ preventEventOverlap?: PreventEventOverlap;
8
+ resourceId?: string | number;
9
+ }
10
+ export declare function isEventPlacementAllowed({ event, start, end, events, preventEventOverlap, resourceId, }: IsEventPlacementAllowedInput): {
11
+ allowed: boolean;
12
+ conflicts: ScheduleEventData[];
13
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mantine-vue/schedule",
3
- "version": "3.4.0",
3
+ "version": "3.6.0",
4
4
  "description": "Vue schedule and calendar components equivalent to @mantine/schedule",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -44,9 +44,9 @@
44
44
  "vue": "^3.5.0"
45
45
  },
46
46
  "peerDependencies": {
47
- "@mantine-vue/core": "3.4.0",
48
- "@mantine-vue/dates": "3.4.0",
49
- "@mantine-vue/hooks": "3.4.0",
47
+ "@mantine-vue/core": "3.6.0",
48
+ "@mantine-vue/dates": "3.6.0",
49
+ "@mantine-vue/hooks": "3.6.0",
50
50
  "dayjs": ">=1.0.0",
51
51
  "vue": "^3.5.0"
52
52
  }