Updated on Nov 18, 2020

Modern React scheduler

Use it in responsive mobile & desktop web apps and Ionic React projects

Other product features to explore

Weekly schedule
Daily schedule

Other product features to explore

The scheduler features vertically scrollable daily and weekly views.
The three views - scheduler, calendar, agenda - can be combined to create the perfect user experience on mobile, desktop and everything in-between.

The capabilities like recurring events, all-day, multi-day events, responsiveness are supported by all three views.

As part of Event calendar and scheduler it can be picked up with the Framework and Complete licenses or with the component license.

Interested in the beta and
want to give it a try?
Back to v4

React Scheduler Scheduler for React

Scheduler - Mobile daily schedule

Change demo
Mobile daily schedule
Get started with this in React

View daily schedules with a fixed week view at the top and a scrollable schedule for the day. The week view is optional and can be turned off.

All-day events are fixed at the top below the header and calendar.

The dates can be quickly navigated by clicking on the month & year indicator.

Interested in weekly schedule?  Explore this example →

Scheduler - Desktop daily schedule

Change demo
Desktop daily schedule
Get started with this in React

Daily schedules can be displayed on large screens as well as small screens.

All-day events are fixed at the top below the header and calendar, while the schedule view is scrollable.

The dates can be quickly navigated by clicking on the month & year indicator.

Interested in weekly schedule?  Explore this example →

Scheduler - Mobile weekly schedule

Change demo
Mobile weekly schedule
Get started with this in React

A full week can be rendered on small screens if needed. The header with the days of the week fixed at the top while the schedule is scrollable.

The screen can easily become crowded so it might be a good idea to think in a responsive implementation - daily schedule on small screens and weekly schedule on bigger screens.

Interested in daily schedule?  Explore this example →

Scheduler - Desktop weekly schedule

Change demo
Desktop weekly schedule
Get started with this in React

Render a full weeks worth of schedule on the screen. The header with days of the week remains planted at the top while the grid with the hours of the week and scheduled events is scrollable.

The current hour is displayed so that upcoming events can be spotted easily.

Interested in daily schedule?  Explore this example →

Scheduler - Responsive behavior

Change demo
Responsive behavior

The scheduler is fully responsive, it adapts to the available space and fills the screen to look good everywhere.

Use the responsive option to configure how the scheduler behaves on different sized screens. You can set it up as a daily schedule view on small screens and a weekly schedule on bigger screens.

The responsive option is equipped with five breakpoints - xsmall, small, medium, large, xlarge - and custom values can be added for a perfect fine-tune.

Change the viewport

Scheduler - Switching views

Change demo

Dynamically switch views within one instance. Use a UI control to let users do the switching or do it programatically.

The example features a month view with with events as labels, a weekly schedule view, a daily schedule and a weekly agenda. Use property binding and when the value of the property changes the settings propagate.

Scheduler - Event customization

Change demo

The scheduler ships with a predefined way of rendering events. There is a variation of how the events look on the screen depending on the theme.

Above the built in rendering mode you can either customize the full event or just the content of the event. If we break up the event into pieces there are four fields that we are interested in:

  • The event start and end time
  • Whether it is an allDay event or not
  • The event color
  • The event title

The scheduler takes care of positioning the event container and everything else is your responsability.

You will have to place and provide styling to all event fields. Beside the ones mentioned above you'll be able to render other custom fields, like description, location, participants ... and add buttons, custom interactions.

You can pass a rendering function to the renderScheduleEvent option. All original event fields along with computed fields like isMultiDay, lastDay are passed to the function.

Scheduler - Move, resize & create

Change demo
Move, resize & create

Drag & drop is a core feature of the event calendar and it is composed of three sub-features:

  • Drag to create events - tap/click to start creating an event and drag to the desired length
  • Move events - grab an event and move it wherever needed
  • Resize events - change the length of en event, grab it from either end and resize it

You have granular control over the three features through the dragToCreate, dragToMove and dragToResize options, which are false by default.

Use the dragTimeStep option (defaults to 15 minutes) to set the snap resolution of all drag actions.

Scheduler - Manage blocked out times

Change demo
Manage blocked out times
Get started with this in React

Entire days and time ranges can blocked out to manage event creation and editing more efficiently.

To disable specific times, ranges, days or recurring days and times you can pass an array to the invalid option. A couple of examples:

  • To disable weekends, use the recurring object - recurring: { repeat: 'weekly', weekDays: 'SA,SU' }
  • Lunch break between 12 PM and 1 PM with title - { start: "12:00", end: "13:00", title: 'Lunch break', recurring: { repeat: 'weekly', weekDays: 'MO,TU,WE,TH,FR' }

When dragging events onto disabled days or time-slots, they will automatically be denied and onEventCreateFailed/onEventUpdateFailed events will be triggered, from which custom logic can be executed to show a toast or maybe a modal for data correction.

Want to prevent double booking?  Learn how to manage event overlaps →

Scheduler - Prevent event overlap

Change demo
Prevent event overlap

Sometimes it is necessary to guarantee that events don't overlap - eg. when scheduling workorders, interacting with a work calendar.

Use the onEventCreate and onEventUpdate events to reject the updates, additions and let the user know about it.

These two lifecycle events run before the event is actually created or updated whenever someone interacts with the scheduler through drag & drop. For a complete list of lifecycle events take a look at this interactive exmaple.

Looking to implement time off or block out ranges?  Learn how to add lunch breaks, working hours and disable weekends →

Scheduler - Event properties

Change demo
Event properties

The event data structure for the scheduler is straightforward with a couple of base properties that the component understands and uses to render the UI. Besides the base properties you can add any custom property, like location, description ...

  • id - A unique ID for the event. If not specified a unique id will be generated
  • title - Defines the event text. This can be plaintext or HTML
  • color - Defines the event color
  • start - Sets the start date and time for the event. It can be a js date object, ISO date string or moment.js object. Learn about date formats
  • end - Sets the end date and time for the event. The same formats are supported as for start
  • allDay - Configures the event as a full-day event
  • recurring - Configures the recurring rules for the event. Learn about recurring events

Scheduler - Supported date formats

Change demo
Supported date formats

Understanding how to work with dates inside the scheduler is essential. You can pass to the data, marked, colors and labels in four different formats. The scheduler can work with Javascript date objects, ISO strings and Moment.js objects.

Scheduler - Understanding recurring events

Change demo
Understanding recurring events

Configure daily, weekly,monthly and yearly recurring events.

You can pass the recurrence rule in the recurring property of the event as an object or a string in RRULE format. Learn about the event data structure and where to place the recurring rules.

Use the configurator to experiment, build strings and objects that you can grab and use.

Scheduler - Loading inline data

Change demo

What is a scheduler without any events in it? To populate it with events all you have to do is pass the event array to the data option.

In a real-world scenario you would probabaly load the events from a remote resource or event better, load them on demand. However the point of this example is to understand how easy it is to add events to the scheduler.

Do you want to learn about the event data sctructure?  See how the event object is built →

Scheduler - Events from remote API

Change demo
Events from remote API
Get started with this in React

The scheduler can be populated by passing an array to the data option, that you can construct either inline or by getting it from a remote API. The important thing to remember is that events need to be in a format that the scheduler understands.

Interested in load on demand?  Dynamically load events on month change →

Scheduler - Loading events on demand

Change demo
Loading events on demand
Get started with this in React

The scheduler supports remote and local data sources. Besides that, events can be populated on initialization or loaded on demand.

Getting the events in real time as the user navigates improves load performance and always serves the most recent data.

Use the onPageLoading lifecycle event to load the data runtime. You can learn about lifecycle events and places where to drop logic to customize the experience.

Interested in loading events from Google Calendar?  Show events from Google Calendar →

Scheduler - Events from Google calendar

Change demo
Events from Google calendar
Get started with this in React

Data can be loaded from any number of places. The idea is to load the data and make sure to convert it into a format that the scheduler understands. You can use base fields and add custom fields that you can then render with the help of templates.

You can show events coming from google calendars. In this example you'll see how you can load events from a public calendar using the googleSDK. Make sure to set your API key and Client ID, that you can get from here.

Scheduler - Add/edit/delete events

Change demo
Add/edit/delete events
Get started with this in React

After looking at the different operations of add, edit and delete for events it can be all put together in a choesive application.

Create new events

Drag to create and click to create is enabled. A temporary event will be created and a custom edit dialog is popped to set the various properties of the event. If cancelled the event won't be created if confirmed, the event will stay in the scheduler.

Edit exiting events

Drag to resize and drag to move is enabled. Events can be reordered and resized. In addtion to that, clicking on the event will open a custom dialog that enables the editing.

Delete events

Delete can be implmented inside the edit dialog with a button or with any custom logic. It's just a matter of removing it from the data object.

Scheduler - Add/delete event

Change demo

The component renders event data that it gets from an API, however you can manually add and delete events in real time. The idea is to pass the event in the correct format, which means it needs a couple of base properties:

  • start & end and recurring if applicable - Defines the date and length of the event
  • title - Defines the title of the event, which can be anything from text to something more complex like HTML
  • color - Defines the color of the event
  • allDay - Sets if the event is an all-day event or not
  • everything else you would like - You can add any additional data that makes sense, like busy or location...

When making changes, like adding or removing events you'll have to create a new array of events and pass it to the component. Use the popup component along with inputs & fields to build the form you need.

Scheduler - View/update event

Change demo

This demo renders event data that it gets from an API, but a lot of times you want to make the events editable. You can find and load the event by ID into a form and then pass it back to the calendar on Save. Edit the fields:

  • start & end and recurring if applicable - Defines the date and length of the event - Use the date picker
  • title - Defines the title for the event, which can be anything from text to something more complex like HTML
  • color - Defines the color of the event - use the color picker
  • allDay - Sets if the event is an all-day event or not
  • everything else you would like - You can add any additional data that makes sense, like busy or location...

After you have the new data object ready with the event data you can pass it to the calendar. You'll have to create a new array of events and pass it to the component. Use the popup component along with inputs & fields to build the form you need.

Scheduler - Customizing the header

Change demo
Customizing the header
Get started with this in React

You can customize how the header of the scheduler looks and how the components are arranged. Besides that you can also add custom functionality, like a segmented control that lets people switch between scheduler and calendar.

Use the renderHeader option for passing a custom header layout. There are predefined components - shorthands if you will - that can be used to assemble the header:

  • Navigation component - <CalendarNav />. Use the .md-header-filter-controls CSS class for custom overrides.
  • Today button - <CalendarToday />. Use the .md-header-filter-today CSS class for custom overrides.
  • Previous month button - <CalendarPrev />. Use the .md-header-filter-prev CSS class for custom overrides.
  • Next month button - <CalendarNext />. Use the .md-header-filter-next CSS class for custom overrides.

For changing the order the controls are laid out, you only need to set up the renderHeader. This example sets a consistent order and layout across all themes and shows a custom control at the far right end.

Overriding the order for specific themes

For a custom order on a theme to theme basis, you will need to use a little CSS. Flex layout makes reordering easy. It's just a matter of setting the order in CSS. For material use the .mbsc-material, for windows the .mbsc-windows prefix and for iOS it is .mbsc-ios class. Eg.:

.mbsc-material .md-header-filter-prev { order: 1; }
.mbsc-material .md-header-filter-next { order: 2; }
.mbsc-material .md-header-filter-controls { order: 3; }
.mbsc-material .md-header-filter-today { order: 4; }
Want to add a filter to the header?  Check out the next example →

Scheduler - Custom component in header

Change demo
Custom component in header
Get started with this in React

The header of the scheduler is a canvas and an opportunity for customization. You can add custom components and enable new interaction in context.

Such an example would be a custom filter block created with the help of a segmented control and placed between the standard UI components, which are:

  • Navigation component - <CalendarNav />. Use the .md-header-filter-controls CSS class for custom overrides.
  • Today button - <CalendarToday />. Use the .md-header-filter-today CSS class for custom overrides.
  • Previous month button - <CalendarPrev />. Use the .md-header-filter-prev CSS class for custom overrides.
  • Next month button - <CalendarNext />. Use the .md-header-filter-next CSS class for custom overrides.

For changing the order the controls are laid out, you only need to set up the renderHeader.

Overriding the order for specific themes

For a custom order on a theme to theme basis, you will need to use a little CSS. Flex layout makes reordering easy. It's just a matter of setting the order in CSS. For material use the .mbsc-material, for windows the .mbsc-windows prefix and for iOS it is .mbsc-ios class. Eg.:

.mbsc-material .md-header-filter-prev { order: 1; }
.mbsc-material .md-header-filter-next { order: 2; }
.mbsc-material .md-header-filter-controls { order: 3; }
.mbsc-material .md-header-filter-today { order: 4; }
Want to style and reorder the header?  Take a look at the previous example →

Scheduler - Theming capabilities

Change demo
Theming capabilities

The look and feel of the scheduler can be deeply customized. There are four levels of customization:

  • Base themes: Choose between iOS, Material and Windows.
  • Light or dark: Every theme has a light and dark variant. Setting the themeVariant to 'auto' will switch based on system settings.
  • Custom themes: Use the theme builder to customize the colors and make it match your brand.
  • Custom CSS: If you need further customization, the sky is the limit with CSS overrides.

You can also see how every example looks by changing the theme from the header.

Scheduler - Calendar systems

Change demo
Calendar systems

The scheduler supports multiple calendar systems. You can control it with the calendarSystem setting, and it supports the following options:

  • Gregorian - it is included by default
  • Jalali - it is the default system of the Persian calendar and is inlcuded within the Farsi language pack
  • Hijri - it is included in the Arabic language pack
Interested in localization?  Explore this example →

Scheduler - Lifecycle events

Change demo
Lifecycle events

The scheduler ships with different hooks for deep customization. Events are triggered through the lifecycle of the component where you can tie in custom functionality and code.

While users interact with the UI events like onEventClick, onInit, onSelectedDateChange ... will be triggered.

For a complete list of events go to the documentation  See available lifecycle events →

Scheduler - Localization

Change demo

The components are fully localized. In case of the scheduler this covers date and time format, button copy, rtl and more. You can see how each example shows up by clicking on the small flag icon or checking the examples below.

All settings can be manually overriden  See what options the localization impacts →

Looking for something you didn't see or have a sales question?
Ask us about it, we're here to help.

There is no trial for the Beta at the moment
There is no trial available for V5 at the moment.
The latest features within the BETA are available for download to customers.

Feel free to explore the demos or get back to V4 for a trial.
Pick another framework
Looks like you have a license with no access to the BETA.
Feel free to explore the demos and let us know if we can help.

Introducing the next generation of Mobiscroll

The Mobiscroll 5 Beta 4 includes the brand new Scheduler, Agenda and Event calendar, Date, time, calendar and Range picker components.

We’ll be gradually adding more components and functionality. If you want to give the new version a go, you can check them out below.

Other highlights
  • Redesigned event calendar, scheduler with drag & drop
  • A new way of working with recurring events
  • Updated themes with dynamic dark mode
  • New date & time pickers
  • Range picker with advanced customization
  • Dynamic options with global updates
Read the full blogpost
Get in touch
Customize & try this demo locally
Sign in or start your free trial

We have to set you up with a trial for this to run 👍

Email address

Install demo in your app
Follow this quick, two minute install guide
Close window

Step 1.Install the Mobiscroll CLI from npm

Copy command
$ npm install -g @mobiscroll/cli

The CLI makes configuring your apps super simple 👍

Step 2.Run the following command in the root folder of your Ionic project

Copy command
$ mobiscroll config ionic --version=5.0.0-beta6

You will be prompted to log in with your mobiscroll account. Set your password here

Create an Ionic 3 & Mobiscroll starter with the CLI:

$ mobiscroll start ionic myStarter

Run this command for Ionic 4 & Mobiscroll starter:

$ mobiscroll start ionic-angular myStarter

Step 3.Copy the code into your app.

Copy TS
Copy HTML
Copy CSS
Copy Module

Step 4.Run ionic serve in the root folder of your app 🎉

Copy command
$ ionic serve

And voilà, everything should be running smoothly.

Install demo in your app
Follow this quick, two minute install guide
Close window

Step 1.Install the Mobiscroll CLI from npm

Copy command
$ npm install -g @mobiscroll/cli

The CLI makes configuring your apps super simple 👍

Step 2.Run the following command in the root folder of your Ionic project

Copy command
$ mobiscroll config ionic --version=5.0.0-beta6

You will be prompted to log in with your mobiscroll account. Set your password here

Run this command for Ionic 5 & React Mobiscroll starter:

$ mobiscroll start ionic-react myStarter

Step 3.Copy the code into your app.

Copy TSX
Copy CSS

Step 4.Run ionic serve in the root folder of your app 🎉

Copy command
$ ionic serve

And voilà, everything should be running smoothly.

Customize & try demos locally
How would you like to do it?
Install demo in your app
Follow this quick, two minute install guide
Close window

Step 1.Install the Mobiscroll CLI from npm

Copy command
$ npm install -g @mobiscroll/cli

The CLI makes configuring your apps super simple 👍

Step 2.Run the following command in the root folder of your Angular project

Copy command
$ mobiscroll config angular --version=5.0.0-beta6

You will be prompted to log in with your mobiscroll account. Set your password here

Step 3.Copy the code into your app. HTML goes into the markup, TS into Typescript.

Copy TS
Copy HTML
Copy CSS
Copy Module

Step 4.Run ng serve in the root folder of your app 🎉

Copy command
$ ng serve

And voilà, everything should be running smoothly.

Thanks for downloading
Try and customize the app locally

Extract the zip file and run the project like any Ionic app. Make sure to have Ionic CLI installed and open the terminal in the app root folder.

Step 1. Run in root folder
$ npm install
Step 2. Start the app
$ ionic serve

Let us know if we can help and enjoy!

Change your password
Need to update your password? Enter and hit the button below
Thanks for downloading
Customize demos locally

Everything is set up so that you can dig in right away and start exploring.

We have set up a trial so that you can try the demos locally.

Extract the zip file and open the demo in your favorite browser. To install Mobiscroll in your project follow instructions from this page.


Let us know if we can help and enjoy! 👍

Thanks for downloading
Customize demos locally

Please extract the zip file and run the project like any Angular CLI app. Make sure to have the Angular CLI installed.

For installation and usage, extract the zip file and open a terminal window and follow these steps.

Step 1. Run in root folder
$ npm install
Step 2. Start the app
$ ng serve --open

Let us know if we can help and enjoy! 👍

Thanks for downloading
Customize demos locally

Everything is set up so that you can dig in right away and start exploring.

We have set up a trial so that you can try the demos locally.

The easiest way to get started is to follow the installation steps and by grabbing the code directly from the demo page. Let us know if we can help and enjoy! 👍

You'll find a fully functional Kitchen-sink Ionic app in the zip file.

Thanks for downloading
Customize demos locally

Everything is set up so that you can dig in right away and start exploring.

We have set up a trial so that you can try the demos locally.

The demos are using Babel's in-browser ES6 and JSX transformer.
Extract the zip file and open the demo in your browser. To install Mobiscroll in your project follow instructions from this page.


Let us know if we can help and enjoy! 👍

Demos
Theme Select
Material
iOS
Windows
Language Locale