Sometimes it is necessary to guarantee that events don't overlap - eg. when scheduling workorders, interacting with a work calendar. You can reject the updates or additions and let the user know about it.
The event overlap can be turned on/off on an event basis or globally on the instance.
- On an event basis - by setting the
overlapproperty tofalsethe specified event cannot overlap. - Globally on the instance - by setting
eventOverlapoption tofalseoverlap is disbled globally.
If set to false, the event settings have precedence over the global calendar eventOverlap option.
Give feedback to the user - optionally, a toast can be displayed to explain why an event cannot be dropped, moved or created. For this we can use the onEventCreateFailed and onEventUpdateFailed lifecycle events.
Demo
eventOverlap=false// relevant events
const myData = [{
start: '2026-11-05T00:00',
end: '2026-11-07T00:00',
title: 'Event 2 (no event overlap)',
overlap: false
}, {
start: '2026-11-10T00:00',
end: '2026-11-12T00:00',
title: 'Event 4 (no event overlap)',
overlap: false
}];
<Eventcalendar
view={{
calendar: { type: 'month', labels: "all" }
}}
data={myData}
dragToMove={true}
dragToResize={true}
eventOverlap={true }
exclusiveEndDates ={true}
clickToCreate={true}
dragToCreate={true}
/>

import { Eventcalendar, setOptions, Toast } from '@mobiscroll/react';
import { useCallback, useMemo, useState } from 'react';
setOptions({
locale: ,
theme: ' ',
themeVariant: ' '
});
const now = new Date();
const y = now.getFullYear();
const m = now.getMonth();
const d = now.getDate();
function App() {
const [isToastOpen, setToastOpen] = useState(false);
const myEvents = useMemo(
() => [
{
start: new Date(y, m, d - 3),
end: new Date(y, m, d - 1),
title: 'Event 1',
},
{
start: new Date(y, m, d),
end: new Date(y, m, d + 2),
title: 'Event 2 (no event overlap)',
overlap: false,
},
{
start: new Date(y, m, d + 3),
end: new Date(y, m, d + 5),
title: 'Event 3',
},
{
start: new Date(y, m, d + 5),
end: new Date(y, m, d + 7),
title: 'Event 4 (no event overlap)',
overlap: false,
},
],
[],
);
const myView = useMemo(() => ({ calendar: { type: 'month', labels: 'all' } }), []);
const handleEventFailed = useCallback(() => {
setToastOpen(true);
}, []);
const handleToastClose = useCallback(() => {
setToastOpen(false);
}, []);
return (
<>
<Eventcalendar
data={myEvents}
view={myView}
dragToCreate={true}
dragToMove={true}
dragToResize={true}
clickToCreate={true}
eventOverlap={false}
onEventUpdateFailed={handleEventFailed}
onEventCreateFailed={handleEventFailed}
exclusiveEndDates={true}
/>
<Toast message="Make sure not to double book" isOpen={isToastOpen} onClose={handleToastClose} />
</>
);
}
export default App;
import { Eventcalendar, MbscCalendarEvent, MbscEventcalendarView, setOptions, Toast } from '@mobiscroll/react';
import { FC, useCallback, useMemo, useState } from 'react';
setOptions({
locale: ,
theme: ' ',
themeVariant: ' '
});
const now = new Date();
const y = now.getFullYear();
const m = now.getMonth();
const d = now.getDate();
const App: FC = () => {
const [isToastOpen, setToastOpen] = useState<boolean>(false);
const myEvents = useMemo<MbscCalendarEvent[]>(
() => [
{
start: new Date(y, m, d - 3),
end: new Date(y, m, d - 1),
title: 'Event 1',
},
{
start: new Date(y, m, d),
end: new Date(y, m, d + 2),
title: 'Event 2 (no event overlap)',
overlap: false,
},
{
start: new Date(y, m, d + 3),
end: new Date(y, m, d + 5),
title: 'Event 3',
},
{
start: new Date(y, m, d + 5),
end: new Date(y, m, d + 7),
title: 'Event 4 (no event overlap)',
overlap: false,
},
],
[],
);
const myView = useMemo<MbscEventcalendarView>(
() => ({
calendar: { type: 'month', labels: 'all' },
}),
[],
);
const handleEventFailed = useCallback(() => {
setToastOpen(true);
}, []);
const handleCloseToast = useCallback(() => {
setToastOpen(false);
}, []);
return (
<div>
<Eventcalendar
data={myEvents}
view={myView}
dragToCreate={true}
dragToMove={true}
dragToResize={true}
clickToCreate={true}
eventOverlap={false}
exclusiveEndDates={true}
onEventUpdateFailed={handleEventFailed}
onEventCreateFailed={handleEventFailed}
/>
<Toast message="Make sure not to double book" isOpen={isToastOpen} onClose={handleCloseToast} />
</div>
);
};
export default App;