Day/Week View Switcher
Usage
theme="ios" You can turn auto theming on and let it decide based on the platform.
Usage
themeVariant="light" You can turn auto dark mode on based on system settings.
Usage
clickToCreate={true}
// click to create is on dragToCreate={true}
// drag to create is on dragToMove={true}
// reordering is on dragToResize={true}
// resizing is on eventDelete={true}
// deleting is on Fine-tune drag & drop with these options, which are false by default.
Usage
locale={localeEn} Selecting the locale loads the localized settings and the translated UI text.
Day/Week View Switcher
Scheduling people, teams or an entire workforce requires different views. Sometimes you'll be needing a helicopter view of a week and other times you might want to dig into a specific day. This all can be served through a simple switching mechanism implemented with a segmented control right in the header of the calendar.
By dynamically changing the options you can set the level of detail you want to see. Eg. Show a daily timeline with hourly steps, show the work week with the same resolution or zoom out for a full week-view with 12 hour steps.
Demo

Code
View code on GitHub
import {
CalendarNav,
CalendarNext,
CalendarPrev,
CalendarToday,
Eventcalendar,
getJson,
Segmented,
SegmentedGroup,
setOptions,
Toast ,
} from '@mobiscroll/react';
import { useCallback, useEffect, useMemo, useState } from 'react';
setOptions({
locale: ,
theme: ' ',
themeVariant: ' '
});
function App() {
const [myEvents, setEvents] = useState([]);
const [view, setView] = useState('week');
const [isToastOpen, setToastOpen] = useState(false);
const [calView, setCalView] = useState({
timeline: {
type: 'week',
},
});
const myResources = useMemo(
() => [
{
id: 1,
name: 'Ryan',
color: '#ff0101',
title: 'Cloud System Engineer',
img: 'https://img.mobiscroll.com/demos/m1.png',
},
{
id: 2,
name: 'Kate',
color: '#239a21',
title: 'Help Desk Specialist',
img: 'https://img.mobiscroll.com/demos/f1.png',
},
{
id: 3,
name: 'John',
color: '#8f1ed6',
title: 'Application Developer',
img: 'https://img.mobiscroll.com/demos/m2.png',
},
{
id: 4,
name: 'Mark',
color: '#01adff',
title: 'Network Administrator',
img: 'https://img.mobiscroll.com/demos/m3.png',
},
{
id: 5,
name: 'Sharon',
color: '#d8ca1a',
title: 'Data Quality Manager',
img: 'https://img.mobiscroll.com/demos/f2.png',
},
],
[],
);
const myInvalids = useMemo(
() => [
{
start: '00:00',
end: '06:00',
recurring: {
repeat: 'weekly',
weekDays: 'MO,TU,WE,TH,FR',
},
},
{
start: '20:00',
end: '23:59',
recurring: {
repeat: 'weekly',
weekDays: 'MO,TU,WE,TH,FR',
},
},
{
recurring: {
repeat: 'weekly',
weekDays: 'SA,SU',
},
},
],
[],
);
const changeView = useCallback((event) => {
let calView;
switch (event.target.value) {
case 'day':
calView = {
timeline: { type: 'day' },
};
break;
case 'workweek':
calView = {
timeline: {
type: 'week',
startDay: 1,
endDay: 5,
},
};
break;
case 'week':
default:
calView = {
timeline: {
type: 'week',
},
};
break;
}
setView(event.target.value);
setCalView(calView);
}, []);
const renderMyHeader = useCallback(
() => (
<>
<CalendarNav className="md-work-week-nav" />
<div className="md-work-week-picker">
<SegmentedGroup value={view} onChange={changeView}>
<Segmented value="day">Day</Segmented>
<Segmented value="workweek">Work week</Segmented>
<Segmented value="week">Week</Segmented>
</SegmentedGroup>
</div>
<CalendarPrev className="md-work-week-prev" />
<CalendarToday className="md-work-week-today" />
<CalendarNext className="md-work-week-next" />
</>
),
[changeView, view],
);
const renderMyResource = useCallback(
(resource) => (
<div className="md-work-week-cont">
<div className="md-work-week-name">{resource.name}</div>
<div className="md-work-week-title">{resource.title}</div>
<img className="md-work-week-avatar" src={resource.img} alt="Avatar" />
</div>
),
[],
);
const handleEventUpdateFail = useCallback(() => {
setToastOpen(true);
}, []);
const handleCloseToast = useCallback(() => {
setToastOpen(false);
}, []);
useEffect(() => {
getJson(
'https://trial.mobiscroll.com/timeline-events/',
(events) => {
setEvents(events);
},
'jsonp',
);
}, []);
return (
<div>
<Eventcalendar
clickToCreate={ }
dragToCreate={ }
dragToMove={ }
dragToResize={ }
eventDelete={ }
view={calView}
data={myEvents}
invalid={myInvalids}
resources={myResources}
renderHeader={renderMyHeader}
renderResource={renderMyResource}
onEventCreateFailed={handleEventUpdateFail}
onEventUpdateFailed={handleEventUpdateFail}
cssClass="md-switching-timeline-view-cont"
/>
<Toast message="Can't schedule outside of working hours" isOpen={isToastOpen} onClose={handleCloseToast} />
</div>
);
}
export default App;
import {
CalendarNav,
CalendarNext,
CalendarPrev,
CalendarToday,
Eventcalendar,
getJson,
MbscCalendarEvent,
MbscEventcalendarView,
MbscResource,
Segmented,
SegmentedGroup,
setOptions,
Toast ,
} from '@mobiscroll/react';
import { ChangeEvent, FC, useCallback, useEffect, useMemo, useState } from 'react';
setOptions({
locale: ,
theme: ' ',
themeVariant: ' '
});
const App: FC = () => {
const [view, setView] = useState<string>('week');
const [myEvents, setEvents] = useState<MbscCalendarEvent[]>([]);
const [isToastOpen, setToastOpen] = useState<boolean>(false);
const [calView, setCalView] = useState<MbscEventcalendarView>({
timeline: {
type: 'week',
},
});
const myResources = useMemo<MbscResource[]>(
() => [
{
id: 1,
name: 'Ryan',
color: '#ff0101',
title: 'Cloud System Engineer',
img: 'https://img.mobiscroll.com/demos/m1.png',
},
{
id: 2,
name: 'Kate',
color: '#239a21',
title: 'Help Desk Specialist',
img: 'https://img.mobiscroll.com/demos/f1.png',
},
{
id: 3,
name: 'John',
color: '#8f1ed6',
title: 'Application Developer',
img: 'https://img.mobiscroll.com/demos/m2.png',
},
{
id: 4,
name: 'Mark',
color: '#01adff',
title: 'Network Administrator',
img: 'https://img.mobiscroll.com/demos/m3.png',
},
{
id: 5,
name: 'Sharon',
color: '#d8ca1a',
title: 'Data Quality Manager',
img: 'https://img.mobiscroll.com/demos/f2.png',
},
],
[],
);
const myInvalids = useMemo(
() => [
{
start: '00:00',
end: '06:00',
recurring: {
repeat: 'weekly',
weekDays: 'MO,TU,WE,TH,FR',
},
},
{
start: '20:00',
end: '23:59',
recurring: {
repeat: 'weekly',
weekDays: 'MO,TU,WE,TH,FR',
},
},
{
recurring: {
repeat: 'weekly',
weekDays: 'SA,SU',
},
},
],
[],
);
const changeView = useCallback((event: ChangeEvent<HTMLInputElement>) => {
let calView: MbscEventcalendarView;
switch (event.target.value) {
case 'day':
calView = {
timeline: { type: 'day' },
};
break;
case 'workweek':
calView = {
timeline: {
type: 'week',
startDay: 1,
endDay: 5,
},
};
break;
case 'week':
default:
calView = {
timeline: {
type: 'week',
},
};
break;
}
setView(event.target.value);
setCalView(calView);
}, []);
const renderMyHeader = useCallback(
() => (
<>
<CalendarNav className="md-work-week-nav" />
<div className="md-work-week-picker">
<SegmentedGroup value={view} onChange={changeView}>
<Segmented value="day">Day</Segmented>
<Segmented value="workweek">Work week</Segmented>
<Segmented value="week">Week</Segmented>
</SegmentedGroup>
</div>
<CalendarPrev className="md-work-week-prev" />
<CalendarToday className="md-work-week-today" />
<CalendarNext className="md-work-week-next" />
</>
),
[changeView, view],
);
const renderMyResource = useCallback(
(resource: MbscResource) => (
<div className="md-work-week-cont">
<div className="md-work-week-name">{resource.name}</div>
<div className="md-work-week-title">{resource.title}</div>
<img className="md-work-week-avatar" src={resource.img} alt="Avatar" />
</div>
),
[],
);
const handleEventUpdateFail = useCallback(() => {
setToastOpen(true);
}, []);
const handleCloseToast = useCallback(() => {
setToastOpen(false);
}, []);
useEffect(() => {
getJson(
'https://trial.mobiscroll.com/timeline-events/',
(events: MbscCalendarEvent[]) => {
setEvents(events);
},
'jsonp',
);
}, []);
return (
<div>
<Eventcalendar
view={calView}
data={myEvents}
invalid={myInvalids}
resources={myResources}
renderHeader={renderMyHeader}
renderResource={renderMyResource}
onEventCreateFailed={handleEventUpdateFail}
onEventUpdateFailed={handleEventUpdateFail}
cssClass="md-switching-timeline-view-cont"
/>
<Toast message="Can't schedule outside of working hours" isOpen={isToastOpen} onClose={handleCloseToast} />
</div>
);
};
export default App;
.md-work-week-cont {
position: relative;
padding-left: 50px;
}
.md-work-week-avatar {
position: absolute;
max-height: 50px;
max-width: 50px;
top: 21px;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
left: 20px;
}
.md-work-week-name {
font-size: 16px;
}
.md-work-week-title {
font-size: 12px;
margin-top: 5px;
}
.md-switching-timeline-view-cont .mbsc-segmented {
max-width: 350px;
margin: 0 auto;
padding: 1px;
}
.md-work-week-picker {
flex: 1 0 auto;
}
.md-work-week-nav {
width: 200px;
}
.md-switching-timeline-view-cont .mbsc-timeline-resource {
display: flex;
align-items: center;
}
.md-switching-timeline-view-cont .mbsc-timeline-resource-col {
width: 205px;
}
/* material header order */
.mbsc-material.md-work-week-prev {
order: 1;
}
.mbsc-material.md-work-week-next {
order: 2;
}
.mbsc-material.md-work-week-nav {
order: 3;
}
.mbsc-material .md-work-week-picker {
order: 4;
}
.mbsc-material .md-work-week-today {
order: 5;
}
/* windows header order */
.mbsc-windows.md-work-week-nav {
order: 1;
}
.mbsc-windows.md-work-week-prev {
order: 2;
}
.mbsc-windows.md-work-week-next {
order: 3;
}
.mbsc-windows .md-work-week-picker {
order: 4;
}
.mbsc-windows .md-work-week-today {
order: 5;
}