Event Calendar for React

Learn about Event Calendar

Responsive event calendar with month view, variable week view, range view and event listing.

Supporting one-time, recurring, all-day and multi-day events with pop-over and schedule listing capability. Use it for mobile, desktop and responsive websites.

Shipping with useful features for a refined UX, including:

  • Usage on mobile and desktop with responsive features
  • Single and multi-day events
  • One-time and recurring events
  • Daily, weekly, monthly and custom event schedules
  • Month view, week view and range view
  • Liquid layout with inline display mode
  • Pop-over event listing or list view for schedule
  • Multiple theme support
  • RTL support
  • Full localization


Interested in calendar views? Other demos that could be useful:

Calendar Range


Event calendar demos available for other frameworks.

Viewing demos & code for

light
dark

Change the theme setting here

Event Calendar - Mobile month view

Change demo
Mobile month view

Use the event calendar for mobile, desktop and everything in-between. The content perfectly fills the parent container or the mobile screen in full width. You can chooose to render an agenda-view below the calendar broken up into days ordered chronologically. For more ways to customize the agenda view check out this example.

Interested to see how the event calendar looks on largers screens?  Check out the next demo →
class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);
        
        this.state = {
            myEvents: []
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events/', (events) => {
            this.setState({ myEvents: events});
        }, 'jsonp');
    }
    render() {
        return (
            <mobiscroll.Eventcalendar
                lang=""
                theme=""
                display="inline"
                data={this.state.myEvents}
                view={{
                    calendar: { type: 'month' },
                    eventList: { type: 'month' }
                }}
                data={this.state.myEvents}
            />
        );
    }    
}

<div id="content"></div>

Event Calendar - Desktop month view

Change demo
Desktop month view

Depending on the screen width the calendar seamlesly transforms into a desktop-view using the available space more intelligently. The main difference between the mobile and desktop rendering is how the day cells are laid out. People can now see on a glance how many events a day holds and by clicking on day the event list will show up in a pop-over.

Interested to see how the event calendar looks on smaller screens?  Check out the previous demo →
class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            myEvents: []
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events/', (events) => {
            this.setState({ myEvents: events});
        }, 'jsonp');
    }
    render() {
        return (
            <mobiscroll.Eventcalendar
                lang=""
                theme=""
                display="inline"
                calendarHeight={614}
                showEventCount={true}
                data={this.state.myEvents}
            />
        );
    }    
}

<div id="content"></div>

Event Calendar - Responsive

Change demo
Responsive

The event calendar is fully responsive. It adapts to the available space and fills the screen to look good everywhere. While the you don't have to worry about the width the height can be manually adjusted with the calendarHeight property.

class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            myEvents: []
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events/', (events) => {
            this.setState({ myEvents: events});
        }, 'jsonp');
    }
    render() {
        return (
            <mobiscroll.Eventcalendar
                lang=""
                theme=""
                display="inline"
                calendarHeight={513}
                view={{
                    calendar: {
                        labels: true,
                        popover: true
                    }
                }}
                data={this.state.myEvents}
            />
        );
    }    
}

<div id="content"></div>

Event Calendar - Variable weeks

Change demo
Variable weeks

The calendar view supports variable weeks. Save space by only displaying one or two weeks or go for a full month where it makes sense. Use the weeks setting that expects a number of rows. The default is six weeks, but feel free to play around.

mobiscroll.settings = {
    lang: '',
    theme: ''
};

class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            myEvents: []
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events/', (events) => {
            this.setState({ myEvents: events});
        }, 'jsonp');
    }
    render() {
        return (
            <mobiscroll.Form>
                <div className="mbsc-grid">
                    <div className="mbsc-row">
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <div className="mbsc-form-group">
                                <div className="mbsc-form-group-title">One week view</div>
                                <mobiscroll.Eventcalendar
                                    display="inline"
                                    data={this.state.myEvents}
                                    view={{
                                        calendar: { type: 'week' }
                                    }}
                                />
                            </div>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <div className="mbsc-form-group">
                                <div className="mbsc-form-group-title">Two week view</div>
                                <mobiscroll.Eventcalendar
                                    display="inline"
                                    data={this.state.myEvents}
                                    view={{
                                        calendar: { type: 'week', size: 2 }
                                    }}
                                />
                            </div>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <div className="mbsc-form-group">
                                <div className="mbsc-form-group-title">Three week view</div>
                                <mobiscroll.Eventcalendar
                                    display="inline"
                                    data={this.state.myEvents}
                                    view={{
                                        calendar: { type: 'week', size: 3 }
                                    }}
                                />
                            </div>
                        </div>
                    </div>
                </div>
            </mobiscroll.Form>
        );
    }    
}

<div id="content"></div>

Event Calendar - Compact daily schedule

Change demo
Compact daily schedule

Use a compact week calendar that you can place at the top of your screen and list a daily schedule below. The calendar view is configured with the calendar object (take a look the previous example) while the agenda view is configured by the eventList setting. For more details on the agenda view see this example. Both are set up inside the view setting.

Days with events are marked with a little dot and days without any events have a localized empty view. Btw. the components are completely localized. Go on and check out this example.

class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            myEvents: []
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events/', (events) => {
            this.setState({ myEvents: events});
        }, 'jsonp');
    }
    render() {
        return (
            <mobiscroll.Eventcalendar
                lang=""
                theme=""
                display="inline"
                data={this.state.myEvents}
                view={{
                    calendar: { type: 'week' },
                    eventList: { type: 'day' }
                }}
            />
        );
    }    
}

<div id="content"></div>

Event Calendar - Switching views

Change demo
Switching views

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

The example features a month view with full event schedule, a week view with a weekly schedule and daily event list. Use the option method to dynamically change the settings.

Interested in building more complex views?  See how to synchronize a calendar and a separate event list →
mobiscroll.settings = {
    lang: '',
    theme: ''
};

class EventCalendarDemo extends React.Component {
     constructor(props) {
        super(props);

        this.state = {
            view: 'month',
            myEvents: [] 
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events/', (events) => {
            this.setState({ myEvents: events});
        }, 'jsonp');
    }
    changeView = (event) => {
        switch (event.target.value) {
            case 'month':
                this.refs.calendar.instance.option({ 
                    view: {
                        calendar: { type: 'month' },
                        eventList: { type: 'month' }
                    }
                });
                break;
            case 'week':
                this.refs.calendar.instance.option({ 
                    view: {
                        calendar: { type: 'week' },
                        eventList: { type: 'week' }
                    }
                });
                break;
            case 'day':
                this.refs.calendar.instance.option({
                    view: {
                        eventList: { type: 'day' }
                    }
                });
                break;
        }
        this.setState({
            view: event.target.value
        });
    }
    render () {
        return (
            <mobiscroll.Form>
                <mobiscroll.FormGroup>
                    <mobiscroll.FormGroupTitle>Month, week and day view</mobiscroll.FormGroupTitle>
                    <mobiscroll.Segmented value="month" name="view" checked={this.state.view === 'month'} onChange={this.changeView}>
                        Month
                    </mobiscroll.Segmented>
                    <mobiscroll.Segmented value="week" name="view" checked={this.state.view === 'week'} onChange={this.changeView}>
                        Week
                    </mobiscroll.Segmented>
                    <mobiscroll.Segmented value="day" name="view" checked={this.state.view === 'day'} onChange={this.changeView}>
                        Day
                    </mobiscroll.Segmented>
                    <mobiscroll.Eventcalendar
                        ref="calendar"
                        display="inline"
                        view={{
                            calendar: { type: 'month' },
                            eventList: { type: 'month' }
                        }}
                        data={this.state.myEvents}
                    />
                </mobiscroll.FormGroup>
            </mobiscroll.Form>
        );
    }    
}

<div id="content"></div>

Event Calendar - Agenda view

Change demo
Agenda view

Use the eventList object, configurable inside the view setting to render a scrollable schedule or agenda view. type and size can be set:

  • day - eventList: { type: 'day', size: 20 } can be configured for a single day or a range of days
  • week - eventList: { type: 'week', size: 3 } can be configured for a single week or a range
  • month - eventList: { type: 'month' } can be configured for a single month or a range
Interested in combining this with a calendar view?  Check out the previous example →
mobiscroll.settings = {
    lang: '',
    theme: ''
};

class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            myEvents: []
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events-new/', (events) => {
            this.setState({ myEvents: events});
        }, 'jsonp');
    }
    render() {
        return (
            <mobiscroll.Form>
                <div className="mbsc-grid">
                    <div className="mbsc-row">
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <div className="mbsc-form-group">
                                <div className="mbsc-form-group-title">Daily schedule</div>
                                <mobiscroll.Eventcalendar
                                    display="inline"
                                    view={{
                                        eventList: { type: 'day' }
                                    }}
                                    data={this.state.myEvents}
                                />
                            </div>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <div className="mbsc-form-group">
                                <div className="mbsc-form-group-title">Weekly schedule</div>
                                <mobiscroll.Eventcalendar
                                    display="inline"
                                    view={{
                                        eventList: { type: 'week' }
                                    }}
                                    data={this.state.myEvents}
                                />
                            </div>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <div className="mbsc-form-group">
                                <div className="mbsc-form-group-title">Monthly schedule</div>
                                <mobiscroll.Eventcalendar
                                    display="inline"
                                    view={{
                                        eventList: { type: 'month' }
                                    }}
                                    data={this.state.myEvents}
                                />
                            </div>
                        </div>
                    </div>
                </div>
            </mobiscroll.Form>
        );
    }    
}

<div id="content"></div>

Event Calendar - Synchronized views

Change demo
Synchronized views

You can usually get away with using a single event calendar instance, but being able to use and synchronize multiple views can come in handy.

In this example we have a two-pane layout with a calendar view on the left and a large agenda view on the right. Because the default rendering of agenda below the calendar doesn't fit we'll be needing two instances. The sync has to happen for both. The day view calls the navigate method of the calendar in its onPageChange event, while the calendar sets the day view with navigate from its onSetDate event.

class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);
        
        this.state = {
            preventSet: false,
            myEvents: []
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events/', (events) => {
            this.setState({ myEvents: events});
        }, 'jsonp');
    }
    
    onPageChange = (event, inst) => {
        this.state.preventSet = true;
        this.navigate(this.refs.monthCal.instance, event.firstDay);
    }
    
    onSetDate = (event, inst) => {
         if (!this.state.preventSet && this.refs.dayCal != undefined) {
            this.navigate(this.refs.dayCal.instance, event.date);
         }
        this.state.preventSet = false;
    }
    
    navigate = (inst, val) => {
        if (inst) {
            inst.navigate(val);
        }
    }

    render () {
        return (
            <div className="mbsc-grid md-demo-synchronized-views">
                <div className="mbsc-row mbsc-no-padding">
                    <div className="mbsc-col-md-4 mbsc-col-12">
                        <mobiscroll.Eventcalendar
                            lang=""
                            theme=""
                            ref="monthCal"
                            display="inline"
                            view={{
                                calendar: { type: 'month' }
                            }}
                            data={this.state.myEvents}
                            onSetDate={this.onSetDate}
                        />
                    </div>
                    <div className="mbsc-col-md-8 mbsc-col-12 md-col-right">
                        <mobiscroll.Eventcalendar
                            theme=""
                            lang=""
                            ref="dayCal"
                            display="inline"
                            view={{
                                eventList: { type: 'day' }
                            }}
                            data={this.state.myEvents}
                            onPageChange={this.onPageChange}
                        />
                    </div>
                </div>
            </div>
        );
    }    
}

<div id="content"></div>
.md-demo-synchronized-views {
    position: absolute;
    height: 100%;
}

.md-demo-synchronized-views .mbsc-row {
    height: 100%;
}

.md-demo-synchronized-views .md-col-right {
    overflow: auto;
    height: 100%;
    border-left: 1px solid #ccc;
}

Event Calendar - Marked, colored & labels

Change demo
Marked, colored & labels

For additional information you can mark days with colored dots, add labels or completely color the background of the days. This offers means to add more information to the calemdar that is valuable to users. Take a look at this example of marked days and description.

You can add these with exact dates, ranges, days of week, days of month and recurring dates. When processing a lot of data you can load the marked days, labels, colors dynamically in the onMonthChange event.

Want to show event data and use multiple labels?  We have an example for that →
mobiscroll.settings = {
    lang: '',
    theme: ''
};

class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        var now = new Date();
        this.state = {
            marked : [
                { d: '5/1', color: '#ffc400' },
                { d: '12/24', color: '#ffee00' },
                { d: '12/25', color: 'red' },
                { d: new Date(now.getFullYear(), now.getMonth() + 1, 4) },
                { d: new Date(now.getFullYear(), now.getMonth() - 2, 13) },
                { d: new Date(now.getFullYear(), now.getMonth(), 2), color: '#46c4f3' },
                { d: new Date(now.getFullYear(), now.getMonth(), 6), color: '#7e56bd' },
                { d: new Date(now.getFullYear(), now.getMonth(), 11), color: '#7e56bd' },
                { d: new Date(now.getFullYear(), now.getMonth(), 19), color: '#89d7c9' },
                { d: new Date(now.getFullYear(), now.getMonth(), 28), color: '#ea4986' },
                { d: new Date(now.getFullYear(), now.getMonth(), 13), color: '#7e56bd' },
                { d: new Date(now.getFullYear(), now.getMonth(), 13), color: '#f13f77' },
                { d: new Date(now.getFullYear(), now.getMonth(), 13), color: '#89d7c9' },
                { d: new Date(now.getFullYear(), now.getMonth(), 13), color: '#8dec7d' },
                { d: new Date(now.getFullYear(), now.getMonth(), 21), color: '#ffc400' },
                { d: new Date(now.getFullYear(), now.getMonth(), 21), color: '#8dec7d' },
                { start: new Date(now.getFullYear(), now.getMonth() + 1, 15), end: new Date(now.getFullYear(), now.getMonth() + 1, 18), color: '#f4511e' }
            ],
            colors: [
                { d: '12/8', background: '#9ccc65' },
                { d: '5/1', background: 'red' },
                { d: '12/24', background: "#fff568" },
                { d: '12/25', background: "#e88080" },
                { d: new Date(now.getFullYear(), now.getMonth() + 1, 4), background: '#cfd8dc' },
                { d: new Date(now.getFullYear(), now.getMonth() + 2, 24), background: '#9575cd' },
                { d: new Date(now.getFullYear(), now.getMonth() - 2, 13), background: '#d4e157' },
                { d: new Date(now.getFullYear(), now.getMonth() - 1, 6), background: "#f4511e" },
                { d: new Date(now.getFullYear(), now.getMonth() + 1, 6), background: '#46c4f3' },
                { d: new Date(now.getFullYear(), now.getMonth() + 1, 22), background: '#7e56bd' },
                { d: new Date(now.getFullYear(), now.getMonth() - 1, 11), background: '#46c4f3' },
                { d: new Date(now.getFullYear(), now.getMonth() - 1, 29), background: '#7e56bd' },
                { d: new Date(now.getFullYear(), now.getMonth(), 2), background: '#46c4f3' },
                { d: new Date(now.getFullYear(), now.getMonth(), 3), background: '#7e56bd' },
                { d: new Date(now.getFullYear(), now.getMonth(), 11), background: '#f13f77' },
                { d: new Date(now.getFullYear(), now.getMonth(), 19), background: '#8dec7d' },
                { d: new Date(now.getFullYear(), now.getMonth(), 28), background: '#ea4986' },
                { start: new Date(now.getFullYear(), now.getMonth() + 1, 15), end: new Date(now.getFullYear(), now.getMonth() + 1, 18), text: 'Conference', background: '#f4511e' }
            ],
            labels: [
                { d: '12/25', text: 'Christmas', color: "#f48fb1" },
                { d: '1/1', text: 'New year' },
                { d: '12/1', text: 'Meeting', color: '#ffc400' },
                { d: new Date(now.getFullYear(), now.getMonth() + 1, 4), text: 'Spa day', color: '#cfd8dc' },
                { d: new Date(now.getFullYear(), now.getMonth() + 2, 24), text: 'BD Party', color: '#9ccc65' },
                { d: new Date(now.getFullYear(), now.getMonth() - 2, 13), text: 'Exams', color: '#d4e157' },
                { d: new Date(now.getFullYear(), now.getMonth() - 1, 6), text: 'Trip', color: "#f4511e" },
                { d: new Date(now.getFullYear(), now.getMonth() + 1, 6), color: '#46c4f3', text: 'Pizza Night' },
                { d: new Date(now.getFullYear(), now.getMonth() + 1, 22), color: '#7e56bd', text: 'Beerpong' },
                { d: new Date(now.getFullYear(), now.getMonth() - 1, 11), color: '#46c4f3', text: 'Anniversary' },
                { d: new Date(now.getFullYear(), now.getMonth() - 1, 29), color: '#7e56bd', text: 'Pete BD' },
                { d: new Date(now.getFullYear(), now.getMonth(), 2), color: '#46c4f3', text: 'Ana BD' },
                { d: new Date(now.getFullYear(), now.getMonth(), 3), color: '#7e56bd', text: 'Concert' },
                { d: new Date(now.getFullYear(), now.getMonth(), 11), color: '#f13f77', text: 'Trip' },
                { d: new Date(now.getFullYear(), now.getMonth(), 19), color: '#8dec7d', text: 'Math exam' },
                { d: new Date(now.getFullYear(), now.getMonth(), 28), color: '#ea4986', text: 'Party' },
                { start: new Date(now.getFullYear(), now.getMonth() + 1, 15), end: new Date(now.getFullYear(), now.getMonth() + 1, 18), text: 'Conference', color: '#f4511e' }
            ]
        };
    }
    
    render() {
        return (
            <mobiscroll.Form>
                <div className="mbsc-grid">
                    <div className="mbsc-row">
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <mobiscroll.FormGroup>
                                <mobiscroll.FormGroupTitle>Marked days</mobiscroll.FormGroupTitle>
                                <mobiscroll.Eventcalendar
                                    marked={this.state.marked}
                                    display="inline"
                                />
                            </mobiscroll.FormGroup>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <mobiscroll.FormGroup>
                                <mobiscroll.FormGroupTitle>Colored days</mobiscroll.FormGroupTitle>
                                <mobiscroll.Eventcalendar
                                    colors={this.state.colors}
                                    display="inline"
                                />
                            </mobiscroll.FormGroup>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <mobiscroll.FormGroup>
                                <mobiscroll.FormGroupTitle>Labels</mobiscroll.FormGroupTitle>
                                <mobiscroll.Eventcalendar
                                    labels={this.state.labels}
                                    display="inline"
                                />
                            </mobiscroll.FormGroup>
                        </div>
                    </div>
                </div>
            </mobiscroll.Form>
        );
    }   
}

<div id="content"></div>

Event Calendar - Events as labels

Change demo
Events as labels

Events can be displayed a couple of different ways. Most of the time showing the event data inside and across the calendar cells is the way to go.

When configuring the calendar object, you can set labels: true. All of this happens under the view setting.

Rather show events in a pop-over?  Take a look at the next example →
class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            myEvents: []
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events/', (events) => {
            this.setState({ myEvents: events});
        }, 'jsonp');
    }
    render() {
        return (
            <mobiscroll.Eventcalendar
                lang=""
                theme=""
                display="inline"
                calendarHeight={614}
                view={{
                    calendar: {
                        labels: true
                    }
                }}
                data={this.state.myEvents}
            />
        );
    }    
}

<div id="content"></div>

Event Calendar - Events in popover

Change demo
Events in popover

Besides displaying event labels or listing them in an agenda view, you can have them show up in a pop-over. Set it up though the calendar: {popover: true} object inside the view setting. Using the popover setting saves vertical space and provides a subtle cue to the user that there are events. A small dot will apear in day cells with events.

Would a full-blown event list help?  Take a look at the next example →
class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            myEvents: []
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events/', (events) => {
            this.setState({ myEvents: events});
        }, 'jsonp');
    }
    render() {
        return (
            <mobiscroll.Eventcalendar
                lang=""
                theme=""
                display="inline"
                data={this.state.myEvents}
            />
        );
    }    
}

<div id="content"></div>

Event Calendar - Events in agenda view

Change demo
Events in agenda view

The calendar view ships with two methods for listing events. Either as event labels or in a pop-over. Besides these two the third way is to configure an event list under the view setting.

Configure the event list like this view: {eventList: {type: 'month'}}.

Looking for more options for event lists?  Try the daily/weekly/monthly schedule →
class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            myEvents: []
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events/', (events) => {
            this.setState({ myEvents: events});
        }, 'jsonp');
    }
    render() {
        return (
            <div className="mbsc-grid-fixed mbsc-grid-md">
                <mobiscroll.Eventcalendar
                    lang=""
                    theme=""
                    display="inline"
                    data={this.state.myEvents}
                    view={{
                        calendar: { type: 'month' },
                        eventList: { type: 'month' }
                    }}
                    data={this.state.myEvents}
                />
            </div>
        );
    }    
}

<div id="content"></div>

Event Calendar - Custom event data

Change demo
Custom event data
React Event calendar with custom HTML for formatted event data. Bake in any markup, emoji or styling into the event list. For React.
class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        var now = new Date();
        
        this.state = {
            myEvents: [{
                d: new Date(now.getFullYear(), now.getMonth(), 8, 8, 0),
                text: 'Green box to post office',
                color: '#6e7f29',
            }, {
                start: new Date(now.getFullYear(), now.getMonth(), 8, 8, 45),
                end: new Date(now.getFullYear(), now.getMonth(), 8, 9, 0),
                text: 'Quick mtg. with Martin <div class="mbsc-bold md-event-desc">Deal offer</div><div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>13 Walnut Avenue, Eden Hazelton</div><span class="md-event-emoji">🎉</span>',
                color: '#de3d83',
                category: 'meeting',
                location: '13 Walnut Avenue, Eden Hazelton'
            }, {
                start: new Date(now.getFullYear(), now.getMonth(), 8, 9, 30),
                end: new Date(now.getFullYear(), now.getMonth(), 8, 10, 30),
                text: 'Product team mtg. <div class="mbsc-bold md-event-desc">Promote Justin</div><div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>Office</div><span class="md-event-emoji">💬</span>',
                color: '#f67944',
                category: 'meeting',
                location: 'Office'
            }, {
                start: new Date(now.getFullYear(), now.getMonth(), 8, 11, 0),
                end: new Date(now.getFullYear(), now.getMonth(), 8, 11, 30),
                text: 'Stakeholder mtg. <div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>Office</div><span class="md-event-emoji">💬</span>',
                color: '#f67944',
                category: 'meeting',
                location: 'Office'
            }, {
                start: new Date(now.getFullYear(), now.getMonth(), 8, 13, 0),
                end: new Date(now.getFullYear(), now.getMonth(), 8, 13, 30),
                text: 'Pick up Kate <div class="mbsc-bold md-event-desc">Lunch @ Butcher\'s</div><div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>38 Hardman Road, Cedar Court</div><span class="md-event-emoji">🍔</span>',
                color: '#00aabb',
                category: 'date',
                location: '38 Hardman Road, Cedar Court'
            }, {
                start: new Date(now.getFullYear(), 9, 9, 9),
                text: 'Coffee with Steve <div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>1334 Rose Street, Walpole</div><span class="md-event-emoji">☕</span>',
                color: '#00aabb',
                category: 'coffee break',
                location: '1334 Rose Street, Walpole'
            }, {
                start: new Date(now.getFullYear(), 10, 2, 12),
                text: 'Trip to England <div class="mbsc-bold md-event-desc">Family visit</div><div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>Evergreen Drive</div><span class="md-event-emoji">✈</span>',
                color: '#00aabb',
                category: 'vacation',
                location: 'Evergreen Drive'
            }, {
                start: new Date(now.getFullYear(), 4, 3, 11),
                end: new Date(now.getFullYear(), 4, 3, 12),
                text: 'Photoshoot <div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>431 Durham Road, Indianapolis</div><span class="md-event-emoji">📸</span>',
                color: '#00aabb',
                category: 'hobby',
                location: '431 Durham Road, Indianapolis'
            }, {
                start: new Date(now.getFullYear(), now.getMonth(), 17, 30, 0),
                text: 'Shopping with mom <div class="mbsc-bold md-event-desc">List on the fridge</div><div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>587 Grant Street, Montpelier</div><span class="md-event-emoji">🛒</span>',
                color: '#f67944',
                category: 'hobby',
                location: '587 Grant Street, Montpelier'
            }, {
                d: (now.getMonth() + 1) + '/14',
                text: 'Dexter BD <div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>52 Crescent Street, Phoenix</div><span class="md-event-emoji">🎂</span>',
                color: '#37bbe4',
                category: 'party',
                location: '52 Crescent Street, Phoenix'
            }, {
                d: (now.getMonth() + 1) + '/5',
                text: 'Luke BD <div class="mbsc-bold md-event-desc">Party at 4 PM</div><div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>57 Mulberry Street, Fremont</div><span class="md-event-emoji">🎉</span>',
                color: '#37bbe4',
                category: 'birthday',
                location: '57 Mulberry Street, Fremont'
            }, {
                d: 'w3',
                text: 'Employment <div class="mbsc-bold md-event-desc">Semi-weekly</div><div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>Office</div><span class="md-event-emoji">✍</span>',
                color: '#635045',
                category: 'meeting',
                location: 'Office'
            }, {
                d: 'w5',
                text: 'Employment <div class="mbsc-bold md-event-desc">Semi-weekly</div><div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>Office</div><span class="md-event-emoji">✍</span>',
                color: '#ff9966',
                category: 'meeting',
                location: 'Office'
            }, {
                start: new Date(now.getFullYear(), 1, 7),
                end: new Date(now.getFullYear(), 1, 25),
                text: 'Dean OFF <div class="mbsc-bold md-event-desc">Vacation</div><span class="md-event-emoji">🌄</span>',
                color: '#99ff33',
                category: 'vacation'
            }, {
                start: new Date(now.getFullYear(), 2, 1),
                end: new Date(now.getFullYear(), 2, 14),
                text: 'Mike probation time <div class="mbsc-bold md-event-desc">Jack\'s supervision</div><div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>Office</div><span class="md-event-emoji">📋</span>',
                color: '#e7b300',
                category: 'work',
                location: 'Office'
            }, {
                start: new Date(now.getFullYear(), 4, 7),
                end: new Date(now.getFullYear(), 4, 16),
                text: 'John OFF <div class="mbsc-bold md-event-desc">Sick leave</div><span class="md-event-emoji">💊</span>',
                color: '#669900',
                category: 'sickness',
            }, {
                start: new Date(now.getFullYear(), 5, 1),
                end: new Date(now.getFullYear(), 5, 11),
                text: 'Carol OFF <div class="mbsc-bold md-event-desc">Personal problems</div>',
                color: '#6699ff',
                category: 'vacation'
            }, {
                start: new Date(now.getFullYear(), 6, 2),
                end: new Date(now.getFullYear(), 6, 17),
                text: 'Business trip <div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>5th Street North</div><span class="md-event-emoji">🚌</span>',
                color: '#cc9900',
                category: 'vacation',
                location: '5th Street North'
            }, {
                start: new Date(now.getFullYear(), 7, 6),
                end: new Date(now.getFullYear(), 7, 14),
                text: 'Ashley OFF <div class="mbsc-bold md-event-desc">On a trip</div><span class="md-event-emoji">🚌</span>',
                color: '#339966',
                category: 'vacation'
            }, {
                start: new Date(now.getFullYear(), 8, 10),
                end: new Date(now.getFullYear(), 8, 20),
                text: 'Marisol OFF <div class="mbsc-bold md-event-desc">Family time</div><span class="md-event-emoji">👨‍‍👧‍👦</span>',
                color: '#8701a9',
                category: 'vacation'
            }, {
                start: new Date(now.getFullYear(), 9, 1),
                end: new Date(now.getFullYear(), 9, 4),
                text: 'Sharon OFF <div class="mbsc-bold md-event-desc">Sick leave</div><span class="md-event-emoji">🤕</span>',
                color: '#cc6699',
                category: 'sickness'
            }, {
                d: '12/25',
                text: 'Christmas Day <div class="md-event-loc mbsc-txt-muted"><span class="mbsc-ic mbsc-ic-location"></span>Home</div><span class="md-event-emoji">🎄</span>',
                color: '#ff0066',
                category: 'holiday',
                location: 'Home'
            }, {
                d: '1/1',
                text: 'New Year\'s day <span class="md-event-emoji">🎆</span>',
                color: '#99ccff',
                category: 'holiday'
            }, {
                d: '4/1',
                text: 'April Fool\'s Day <div class="mbsc-bold md-event-desc">Just kidding!</div><span class="md-event-emoji">🤡</span>',
                color: '#ff6666',
                category: 'joke'
            }, {
                d: '11/2',
                text: 'File Form 720 for the third quarter <span class="md-event-emoji">📃</span>',
                color: '#a63e14',
                category: 'work'
            }]
        };
    }
    render() {
        return (
            <mobiscroll.Eventcalendar
                lang=""
                theme=""
                display="inline"
                data={this.state.myEvents}
                view={{
                    calendar: { type: 'month' },
                    eventList: { type: 'month' }
                }}
                cssClass="md-custom-data"
            />
        );
    }    
}

<div id="content"></div>
.md-custom-data .mbsc-event-txt {
    line-height: 1.3em;
}

.md-event-loc {
    padding-top: .5em;
    font-size: 12px;
}

.md-event-emoji {
    position: absolute;
    top: 19px;
    right: 15px;
    font-size: 14px;
}

.md-event-desc+.md-event-loc+.md-event-emoji {
    top: 30px;
}

.md-event-loc .mbsc-ic-location {
    margin-right: 5px;
}

Event Calendar - Date types

Change demo
Date types

The event calendar support multiple data types. The data, marked, colors and labels objects all understand the different formats. Let's see how they look:

  • JS date objects - new Date(1995, 11, 17, 15, 24)
  • ISO date strings - '2008-09-15T15:53:00'
  • Localized date strings - '04/25/2010 8:15 AM'
  • Moment.js objects - moment([2018, 3, 27, 12, 15])
mobiscroll.settings = {
    lang: '',
    theme: '',
    display: 'inline'
};

class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            dateObjData: [],
            dateStrData: [],
            momentJsData: []
        };
    }
    
    addDate = () => {
        var state = this.state;
        state.dateObjData = state.dateObjData.concat([{
            start: new Date(2019, 4, 8, 10, 45),
            end: new Date(2019, 4, 8, 11, 45),
            text: 'New Event'
        }]);
        this.setState(state);
        this.refs.dateObj.instance.navigate(new Date(2019, 4, 8));
    };
    
    addISO = () => {
        var state = this.state;
        state.dateStrData = state.dateStrData.concat([{
            start: '2019-09-15T15:30:00',
            end: '2019-09-15T16:00:00',
            text: 'New Event'
        }]);
        this.setState(state);
        this.refs.dateStr.instance.navigate('2019-09-15');
    };
    
    addMoment = () => {
        var state = this.state;
        state.momentJsData = state.momentJsData.concat([{
            // make sure that moment js is loaded
            start: moment([2019, 3, 20, 18]),
            end: moment([2019, 3, 20, 20]),
            text: 'New Event'
        }]);
        this.setState(state);
        this.refs.momentJs.instance.navigate(moment([2019, 3, 20]));
    };
    
    render() {
        return (
            <mobiscroll.Form>
                <div className="mbsc-grid">
                    <div className="mbsc-row">
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <mobiscroll.FormGroup>
                                <mobiscroll.FormGroupTitle>Date object</mobiscroll.FormGroupTitle>
                                <div className="mbsc-btn-group-block">
                                    <mobiscroll.Button onClick={this.addDate} className="mbsc-btn-primary">start: new Date(2019, 4, 8, 10, 45) <br /> end: new Date(2019, 4, 8, 11, 45)</mobiscroll.Button>
                                </div>
                                <mobiscroll.Eventcalendar
                                    ref="dateObj"
                                    data={this.state.dateObjData}
                                />
                            </mobiscroll.FormGroup>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <mobiscroll.FormGroup>
                                <mobiscroll.FormGroupTitle>ISO string</mobiscroll.FormGroupTitle>
                                <div className="mbsc-btn-group-block">
                                    <mobiscroll.Button onClick={this.addISO} className="mbsc-btn-primary">start: 2019-09-15T15:30:00 <br /> end: 2019-09-15T16:00:00</mobiscroll.Button>
                                </div>
                                <mobiscroll.Eventcalendar
                                    ref="dateStr"
                                    data={this.state.dateStrData}
                                />
                            </mobiscroll.FormGroup>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <mobiscroll.FormGroup>
                                <mobiscroll.FormGroupTitle>Moment js</mobiscroll.FormGroupTitle>
                                <div className="mbsc-btn-group-block">
                                    <mobiscroll.Button onClick={this.addMoment} className="mbsc-btn-primary">start: moment([2019, 3, 20, 18]) <br /> end: moment([2019, 3, 20, 20])</mobiscroll.Button>
                                </div>
                                <mobiscroll.Eventcalendar
                                    ref="momentJs"
                                    data={this.state.momentJsData}
                                />
                            </mobiscroll.FormGroup>
                        </div>
                    </div>
                </div>
            </mobiscroll.Form>
        );
    }    
}

<div id="content"></div>

Event Calendar - Event data structure

Change demo
Event data structure

The event data structure for 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 ...

  • text - 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 date object, ISO date string or moment.js object
  • end - Sets the end date and time for the event. The same formats are supported as for start

This is how a simple event looks like with a couple of extra properties:

{
    text: 'Product planning',
    color: '#56ca70',
    start: new Date(2018, 11, 21, 13, 00),
    end: new Date(2018, 11, 21, 14, 00),
    busy: true,
    description: 'Weekly meeting with team',
    location: 'Office'
}

mobiscroll.settings = {
    lang: '',
    theme: ''
};

class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);
        
        this.state = {
            text: 'Sarah OFF',
            color: '#56ca70',
            start: new Date(2018, 11, 21, 13, 0),
            end: new Date(2018, 11, 21, 14, 0),
            busy: true,
            desc: 'Sick leave',
            loc: 'Home',
            events: []
        };

        this.addEvent = this.addEvent.bind(this);
    }
    
    addEvent(event, inst) {
        var changedState = this.state;
        changedState.events = changedState.events.concat([{
            text: changedState.text,
            color: changedState.color,
            start: changedState.start,
            end: changedState.end,
            busy: changedState.busy,
            desc: changedState.desc,
            loc: changedState.loc
        }]);
        
        this.setState(changedState);
    }
    
    render() {
        return (
            <mobiscroll.Form>
                <div className="mbsc-grid">
                    <div className="mbsc-row mbsc-justify-content-center">
                        <div className="mbsc-col-sm-12 mbsc-col-md-5">
                            <mobiscroll.FormGroup>
                                <mobiscroll.FormGroupTitle>Base properties</mobiscroll.FormGroupTitle>
                                <label>
                                    Text
                                    <input value={this.state.text} disabled />
                                </label>
                                <label>
                                    Color
                                    <input value={this.state.color} disabled />
                                </label>
                                <label>
                                    Start
                                    <input value={this.state.start} disabled />
                                </label>
                                <label>
                                    End
                                    <input value={this.state.end} disabled />
                                </label>
                            </mobiscroll.FormGroup>
                            <mobiscroll.FormGroup>
                                <mobiscroll.FormGroupTitle>Add any property you'd like</mobiscroll.FormGroupTitle>
                                <label>
                                    Busy
                                    <input value={this.state.busy} disabled />
                                </label>
                                <label>
                                    Description
                                    <input value={this.state.desc} disabled />
                                </label>
                                <label>
                                    Location
                                    <input value={this.state.loc} disabled />
                                </label>
                            </mobiscroll.FormGroup>
                            <button type="button" onClick={this.addEvent}>Add event</button>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-5">
                            <mobiscroll.FormGroup>
                                <mobiscroll.FormGroupTitle>Event calendar</mobiscroll.FormGroupTitle>
                                <mobiscroll.Eventcalendar
                                    display="inline"
                                    data={this.state.events}
                                />
                            </mobiscroll.FormGroup>
                        </div>
                    </div>
                </div>
            </mobiscroll.Form>
        );
    }    
}

<div id="content"></div>

Event Calendar - Events from remote API

Change demo
Events from remote API
React Event calendar demo with data loading from remote API. Load and populate with events coming from external JSON. For React.
class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            myEvents: []
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events/', (events) => {
            this.setState({ myEvents: events});
        }, 'jsonp');
    }
    render() {
        return (
            <mobiscroll.Eventcalendar
                lang=""
                theme=""
                display="inline"
                view={{
                    calendar: { type: 'month' },
                    eventList: { type: 'month' }
                }}
                data={this.state.myEvents}
            />
        );
    }    
}


<div id="content"></div>

Event Calendar - Loading events on demand

Change demo
Loading events on demand
React Event calendar demo with dynamic data. Load events on demand with month change from external JSON API. For React.
class EventcalendarDemo extends React.Component {
    onPageLoading = (event, inst) => {
        var year = event.firstDay.getFullYear(),
            month = event.firstDay.getMonth();

        mobiscroll.util.getJson('https://trial.mobiscroll.com/monthlyevents/?year=' + year + '&month=' + month, function (data) {
            var events = [];

            for (var i = 0; i < data.length; i++) {
                events.push({
                    start: data[i].start,
                    end: data[i].end,
                    d: data[i].d,
                    text: data[i].text,
                    color: data[i].color
                });
            }

            inst.setEvents(events);
        }, 'jsonp');
    }
    render() {
        return (
            <mobiscroll.Eventcalendar
                lang=""
                theme=""
                display="inline"
                view={{
                    calendar: { type: 'month' },
                    eventList: { type: 'month' }
                }}
                onPageLoading={this.onPageLoading}
            />
        );
    }    
}

<div id="content"></div>

Event Calendar - Custom data binding

Change demo
Custom data binding
React Event calendar demo for syncing google and facebook calendar data. Demonstrates flexible data source and API. For React.
class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        var now = new Date();
        this.state = {
            myEvents: [{
                d: new Date(now.getFullYear(), now.getMonth(), 8, 8, 0),
                text: 'Green box to post office',
                color: '#6e7f29'
            }]
        };
    }
    
    fbAuth = () => {
        FB.getLoginStatus(function (response) {
            if (response.status === 'connected') {
                createFBList();
            } else {
                FB.login(function (response) {
                    if (response.authResponse) {
                        createFBList();
                    }
                }, {
                    scope: 'user_events'
                });
            }
        });
        return false;
    }
    
    fbList = () => {
        if (ev.target.classList.contains('md-cal-sync')) {
            if (ev.target.innerHTML == "Show") {
                getFBEvents(ev.target.id, [], callBackAddevent, ev.target);
            } else {
                clearFBEvents(ev.target.id, ev.target);
                delete calId[ev.target.id];
            }
            return false;
        }
    }
    
    googleAuth = () => {
        if (googleCalList.childNodes.length == 0) {
            gapi.auth.authorize({
                client_id: clientId,
                scope: 'https://www.googleapis.com/auth/calendar',
                immediate: false
            }, function (authResult) {
                if (authResult) {
                    getGoogleCalendars();
                }
            });
        }
        return false;
    }
    
    googleList = () => {
        if (ev.target.classList.contains('md-cal-sync')) {
            if (ev.target.innerHTML == "Hide") {
                delete calId[ev.target.getAttribute('data-calendar-id')];
                clearGoogleEvents(ev.target.getAttribute('data-calendar-id'), ev.target);
            } else {
                getGoogleEvents(ev.target.getAttribute('data-calendar-id'), [], callBackAddevent, ev.target);
            }
            return false;
        }
    }
    
    render() {
        function getFirstAndLastDay(year, month) {
            firstDay = new Date(year, month, 1);
            lastDay = new Date(year, month + 1, 0);
        }

        function addEventsToList(list, name, id, color, startDate, endDate) {
            list.push({
                start: startDate,
                end: endDate,
                text: name,
                calendarId: id,
                color: color
            });
        }

        function callBackSetEvent(list) {
            if (requestCounter == 0) {
                calendar.setEvents(list);
            }
        }

        function callBackAddevent(list) {
            calendar.addEvent(list);
        }

        // Facebook functions
        function loadFacebookSDK() {
            window.fbAsyncInit = function () {
                // init the FB JS SDK
                FB.init({
                    appId: '306273539474640', // App ID from the app dashboard
                    status: true, // Check Facebook Login status
                    xfbml: false // Look for social plugins on the page
                });
            };
            // Load the SDK asynchronously
            (function (d, s, id) {
                var js, fjs = d.getElementsByTagName(s)[0];
                if (d.getElementById(id)) {
                    return;
                }
                js = d.createElement(s);
                js.id = id;
                js.src = "//connect.facebook.net/en_US/all.js";
                fjs.parentNode.insertBefore(js, fjs);
            }(document, 'script', 'facebook-jssdk'));
        }

        function getFBEvents(id, list, callBack, button) {
            var noreply = false;

            if (button) {
                button.innerHTML = 'Syncing...';
            }

            calId[id] = true;

            if (id == 'nfb') {
                noreply = true;
            }

            requestCounter++;

            FB.api('me/events/' + (noreply ? "not_replied" : "") + '?since=' + firstDay.getTime() / 1000 + '&until=' + lastDay.getTime() / 1000 + '', {
                fields: 'name,id,start_time,end_time'
            }, function (resp) {
                var i, v;



                if (resp.data) {
                    for (i = 0; i < resp.data.length; ++i) {
                        v = resp.data[i];
                        addEventsToList(list, v.name, id, noreply ? '#3EA9F8' : '#3B5998', new Date(v.start_time), (v.end_time) ? new Date(v.end_time) : '');
                    }

                    requestCounter--;
                }
                if (button) {
                    button.innerHTML = 'Hide';
                }
                callBack(list);
            });
        }

        function clearFBEvents(id, button) {
            var i,
                list = calendar.getEvents(),
                l = [];

            for (i = 0; i < list.length; i++) {
                if (list[i].calendarId == id) {
                    l.push(list[i]._id);
                }
            }

            calendar.removeEvent(l);

            if (button) {
                button.innerHTML = "Show";
            }
        }

        function createFBList() {
            if (fbCalList.childNodes.length == 0) {
                fbCalList.innerHTML = '<li><h3>Facebook</h3><p>Events Attending</p><a href="#" className="md-cal-sync" id="fb">Show</a><div style="background-color:#3B5998" className="md-cal-color"></div></li>' + '<li><h3>Facebook</h3><p>Events Not Attending</p><a href="#" className="md-cal-sync" id="nfb">Show</a><div style="background-color:#3EA9F8" className="md-cal-color"></div></li>';
            }
        }

        // Google calendars
        // Load the SDK asynchronously
        function loadGoogleSDK() {
            (function (d, s, id) {
                var js, fjs = d.getElementsByTagName(s)[0];
                if (d.getElementById(id)) {
                    return;
                }
                js = d.createElement(s);
                js.id = id;
                js.src = "//apis.google.com/js/client.js?onload=onGoogleLoad";
                fjs.parentNode.insertBefore(js, fjs);
            }(document, 'script', 'google-jssdk'));
        }

        function onGoogleLoad() {
            gapi.auth.init(function () {});
        }

        function getGoogleColors() {
            gapi.client.load('calendar', 'v3', function () {
                var i,
                    request = gapi.client.calendar.colors.get({
                        'fields': 'event'
                    });

                request.execute(function (resp) {
                    for (i = 0; i < resp.event.length; ++i) {
                        eventColor[i] = resp.event[i].background;
                    }
                });
            });
        }

        function getGoogleCalendars() {
            getGoogleColors();
            gapi.client.load('calendar', 'v3', function () {

                var i, v, html = '',
                    request = gapi.client.calendar.calendarList.list({
                        'fields': 'items(backgroundColor,colorId,description,id,summary)'
                    });

                request.execute(function (resp) {
                    for (i = 0; i < resp.items.length; ++i) {
                        v = resp.items[i];
                        calendarColors[v.id] = v.backgroundColor;
                        html += '<li><h3>' + v.summary + '</h3><p>' + (v.description || 'No description') + '</p><a href="#" data-calendar-id="' + v.id + '" className="md-cal-sync">Show</a><div style="background-color: ' + v.backgroundColor + '" className="md-cal-color"></div></li>';
                    }

                    googleCalList.innerHTML = html;
                });
            });
        }

        function getGoogleEvents(id, list, callBack, button) {

            if (button) {
                button.innerHTML = "Syncing...";
            }

            calId[id] = true;

            requestCounter++;

            gapi.client.load('calendar', 'v3', function () {
                var request = gapi.client.calendar.events.list({
                    'calendarId': id,
                    'timeMin': firstDay.toISOString(),
                    'timeMax': lastDay.toISOString()
                });

                request.execute(function (resp) {
                    var i, v;
                    if (resp.items) {
                        for (i = 0; i < resp.items.length; ++i) {
                            v = resp.items[i];
                            if (v.start.dateTime) { //events inside a day
                                addEventsToList(list, v.summary || 'No title', id, v.colorId ? eventColor[v.colorId] : calendarColors[id], new Date(v.start.dateTime), new Date(v.end.dateTime));
                            } else { // day or multi day event
                                addEventsToList(list, v.summary || 'No title', id, v.colorId ? eventColor[v.colorId] : calendarColors[id], new Date(v.start.date), ((new Date(v.end.date) - new Date(v.start.date)) / 86400000 == 1) ? '' : new Date(v.end.date));
                            }
                        }
                    }

                    requestCounter--;

                    if (button) {
                        button.innerHTML = "Hide";
                    }

                    callBack(list);
                });
            });
        }

        function clearGoogleEvents(id, button) {
            var i,
                list = calendar.getEvents(),
                l = [];

            for (i = 0; i < list.length; i++) {
                if (list[i].calendarId == id) {
                    l.push(list[i]._id);
                }
            }

            calendar.removeEvent(l);

            if (button) {
                button.innerHTML = "Show";
            }
        }

        var timer,
            requestCounter = 0,
            clientId = '249451342989-4npidi86thdlqv1ecmp4euncemcg3ocf.apps.googleusercontent.com',
            eventColor = {},
            calendarColors = {},
            calId = {},
            firstDay = new Date(),
            lastDay = new Date(),
            googleCalList = document.getElementById('googleList'),
            fbCalList = document.getElementById('fbList'),
            date = new Date();
        firstDay = new Date(date.getFullYear(), date.getMonth(), 1);
        lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0);

        loadGoogleSDK();
        loadFacebookSDK();
        return (
            <div className="md-sync">
                <div id="fb-root"></div>

                <mobiscroll.Eventcalendar
                    ref="eventcalendar"
                    theme=""
                    lang=""
                    display="inline"
                    layout="liquid"
                    outerMonthChange={false}
                    onPageChange={function (event) {
                        var list = [],
                            year = event.year,
                            month = event.month;
                        clearTimeout(timer);
                        timer = setTimeout(function () {
                            getFirstAndLastDay(year, month);

                            for (var cal in calId) {
                                if (cal == 'fb' || cal == 'nfb') {
                                    getFBEvents(cal, list, callBackSetEvent);
                                } else {
                                    getGoogleEvents(cal, list, callBackSetEvent);
                                }
                            }

                        }, 100);
                    }}
                />

                <ul onClick={this.googleList} className="md-cal-list"></ul>
                <ul onClick={this.fbList} className="md-cal-list"></ul>
                <mobiscroll.Form 
                    theme=""
                    renderForm="false">
                    <div className="mbsc-btn-group-block">
                        <button type="button" onClick={this.fbAuth} className="md-cal-auth">Add Facebook Events</button>
                        <button type="button" onClick={this.googleAuth} className="md-cal-auth">Add Google Calendars</button>
                    </div>
                </mobiscroll.Form>
            </div>
        );
    }    
}

<div id="content"></div>
div .md-sync {
    padding: 0;
}

div .md-sync #demo {
    display: block;
}

div .md-sync #show {
    position: static;
}

div .md-sync .icc {
    padding: 0;
}

div .md-sync .ic {
    text-align: left;
}

div .md-sync .ic p {
    padding: 0 5px;
    color: #000;
    text-shadow: none;
}

div .md-sync .md-cal-btn-c .md-cal-auth {
    display: block;
    margin-top: 5px;
    width: 100%;
}

.md-cal-list {
    list-style: none;
    margin: 0;
    padding: 0;
}

.md-cal-list li {
    position: relative;
    list-style: none;
    margin: 0;
    padding: 0;
    background: #f0f0f0;
    border-bottom: 1px solid #b1b1b1;
    border-top: 1px solid #fff;
    padding: 5px 40px 5px 10px;
    color: #333;
}

.md-cal-list h3 {
    margin: 5px 0;
    font-weight: normal;
}

.md-cal-list p {
    display: block;
    margin: 5px 0;
    color: #717171;
}

.md-cal-color {
    width: 5px;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
}

.md-cal-list .md-cal-sync {
    position: absolute;
    right: 0;
    top: 0;
    padding-top: 25px;
    padding-right: 15px;
    text-decoration: underline;
}

.md-cal-btn-c {
    padding: 0 5px;
}

.md-sync {
    padding: 0 !importnat;
}

.demo-preview .demo-note {
    margin: 5px;
}

Event Calendar - Add/delete event

Change demo
Add/delete event

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:

  • d or start & end - Defines the date and length of the event
  • text - Defines the lable for the event, which can be anythng 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...

After you have the data object ready with the event data you can pass it to the addEvent method. While the event calendar doesn't ship with a built-in form for adding events, you can use the popup component along with inputs & fields to build the form you need.

Deleting events can be done just as simply by calling the removeEvent method

mobiscroll.settings = {
    lang: '',
    theme: ''
};

class EventcalendarDemo extends React.Component {
    constructor(props) {
        var now = new Date(),
            btn = '<button type="button" class="mbsc-btn mbsc-btn-outline mbsc-btn-danger md-delete-btn">Delete</button>';
            
        super(props);
        this.state = {
            eventText: '',
            eventDesc: '',
            eventDate: [now, new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours() + 2)],
            btn: btn,
            id: 3,
            preventSet: false,
            myEvents: [{
                id: 1,
                start: new Date(now.getFullYear(), now.getMonth(), 8, 13, 0),
                end: new Date(now.getFullYear(), now.getMonth(), 8, 13, 30),
                text: 'Lunch @ Butcher\'s' + btn,
                color: '#26c57d'
            }, {
                id: 2,
                start: new Date(now.getFullYear(), now.getMonth(), now.getDate(), 15, 0),
                end: new Date(now.getFullYear(), now.getMonth(), now.getDate(), 16, 0),
                text: 'General orientation' + btn,
                color: '#fd966a'
            }],
            allDay: false,
            isFree: 'false'
        };
        
        this.textChange = this.textChange.bind(this);
        this.descChange = this.descChange.bind(this);
        this.allDayChange = this.allDayChange.bind(this);
        this.dateChange = this.dateChange.bind(this);
        this.isFreeChange = this.isFreeChange.bind(this);
        this.addEvent = this.addEvent.bind(this);
        this.onEventSelect = this.onEventSelect.bind(this);
    }
    
    textChange(event) {
        var state = this.state;
        state.eventText = event.target.value;
        this.setState(state);
    }
    
    descChange(event) {
        var state = this.state;
        state.eventDesc = event.target.value;
        this.setState(state);
    }
    
    allDayChange(event) {
        var state = this.state;
        state.allDay = event.target.checked;
        this.refs.range.instance.option({
            controls: state.allDay ? ['date'] : ['date', 'time'],
            dateWheels: state.allDay ? 'MM dd yy' : '|D M d|'
        });
        
        this.setState(state);
    }
    
    dateChange(event, inst) {
        var state = this.state;
        state.eventDate = inst.getVal();
        this.setState(state);
    }
    
    isFreeChange(event){
        var state = this.state;
        state.isFree = event.target.value;
        this.setState(state);
    }
    
    showAddEventPopup = () => {
        this.refs.popup.instance.show();
    }
    
    addEvent(event, inst) {
        var changedState = this.state;
        changedState.myEvents = changedState.myEvents.concat([{
            id: changedState.id,
            start: changedState.eventDate[0],
            end: changedState.eventDate[1],
            text: (changedState.eventText || 'New Event') + changedState.btn,
            title: changedState.eventText || 'New Event',
            description: changedState.eventDesc,
            allDay: changedState.allDay,
            free: changedState.isFree == 'true'
        }]);
        changedState.eventText = '';
        changedState.eventDesc = '';
        changedState.id += 1;
        this.setState(changedState);
        this.navigate(this.refs.monthCal.instance, changedState.eventDate[0]);
    }
    
    onPageChange = (event, inst) => {
        var state = this.state,
            day = event.firstDay;
            
        state.preventSet = true;
        state.eventDate = [day, new Date(day.getFullYear(), day.getMonth(), day.getDate(), day.getHours() + 2)];
        
        this.setState(state);
        this.navigate(this.refs.monthCal.instance, day);
    }
    
    onEventSelect = (event, inst) => {
        if (event.domEvent.target.classList.contains('md-delete-btn')) {
            mobiscroll.confirm({,
                title: 'Confirm Deletion',
                message: 'Are you sure you want to delete this item?',
                okText: 'Delete',
                callback: (res) => {
                    if (res) {
                        //remove element by id
                        var state = this.state,
                            index = state.myEvents.findIndex(item => item.id === event.event.id),
                            newState = React.addons.update(state, {
                                myEvents: {
                                    $splice: [ [index, 1] ]
                                }
                            });
                        
                        this.setState(newState);
                        
                        mobiscroll.toast({,
                            message: 'Deleted'
                        });
                    }
                }
            });
        }
    }
    
    onSetDate = (event, inst) => {
         if (!this.state.preventSet && this.refs.dayCal != undefined) {
             var state = this.state,
                day = event.date;
                
            state.eventDate = [day, new Date(day.getFullYear(), day.getMonth(), day.getDate(), day.getHours() + 2)];
            this.navigate(this.refs.dayCal.instance, day);
            this.setState(state);
         }
        this.state.preventSet = false;
    }
    
    navigate = (inst, val) => {
        if (inst) {
            inst.navigate(val);
        }
    }
    
    render () {
        return (
            <div>
                <mobiscroll.Form>
                    <div className="mbsc-grid md-add-event-demo">
                        <div className="mbsc-row mbsc-no-padding">
                            <div className="mbsc-col-md-4 mbsc-col-12">
                                <mobiscroll.Eventcalendar
                                    ref="monthCal"
                                    display="inline"
                                    view={{
                                        calendar: { type: 'month' }
                                    }}
                                    data={this.state.myEvents}
                                    onSetDate={this.onSetDate}
                                />
                                <div className="mbsc-btn-group-block">
                                    <button type="button" onClick={this.showAddEventPopup}>Add New Event</button>
                                </div>
                            </div>
                            <div className="mbsc-col-md-8 mbsc-col-12 md-col-right">
                                <mobiscroll.Eventcalendar
                                    ref="dayCal"
                                    display="inline"
                                    layout="liquid"
                                    view={{
                                        eventList: { type: 'day' }
                                    }}
                                    data={this.state.myEvents}
                                    onPageChange={this.onPageChange}
                                    onEventSelect={this.onEventSelect}
                                />
                            </div>
                        </div>
                    </div>
                </mobiscroll.Form>
                <mobiscroll.Popup
                    ref="popup"
                    display="center"
                    cssClass="mbsc-no-padding"
                    buttons={[{
                            text: 'Add event',
                            handler: 'set'
                        },
                        'cancel'
                    ]}
                    headerText="Add new event"
                    onSet={this.addEvent}
                >
                    <mobiscroll.Form>
                        <mobiscroll.FormGroup>
                            <mobiscroll.Form.Label>
                                Title
                                <input value={this.state.eventText} onChange={this.textChange} />
                            </mobiscroll.Form.Label>
                            <mobiscroll.Textarea value={this.state.eventDesc} onChange={this.descChange}>
                                Description
                            </mobiscroll.Textarea>
                        </mobiscroll.FormGroup>
                        <mobiscroll.FormGroup>  
                            <mobiscroll.Switch value={this.state.allDay} onChange={this.allDayChange}>
                                All-day
                            </mobiscroll.Switch>
                                <mobiscroll.Form.Label>
                                    Starts
                                    <input id="startDate" />
                                </mobiscroll.Form.Label>
                                <mobiscroll.Form.Label>
                                    Ends
                                    <input id="endDate" />
                                </mobiscroll.Form.Label>
                                <mobiscroll.Range
                                    ref="range"
                                    type="hidden"
                                    controls={['date', 'time']}
                                    dateWheels="|D M d|"
                                    startInput="#startDate"
                                    endInput="#endDate"
                                    tabs={false}
                                    responsive={{
                                        large: {
                                            touchUi: false
                                        }
                                    }}
                                    value={this.state.eventDate}
                                    onSet={this.dateChange}
                                    showSelector={false}
                                />
                            <mobiscroll.Segmented name="group" value="false" checked={this.state.isFree === 'false'} onChange={this.isFreeChange}>
                                Show as busy
                            </mobiscroll.Segmented>
                            <mobiscroll.Segmented name="group" value="true" checked={this.state.isFree === 'true'} onChange={this.isFreeChange}>
                                Show as free
                            </mobiscroll.Segmented>
                        </mobiscroll.FormGroup>
                    </mobiscroll.Form>
                </mobiscroll.Popup>
            </div>
        );
    }    
}

<div id="content"></div>
.md-add-event-demo {
    position: absolute;
    height: 100%;
}

.md-add-event-demo .mbsc-row {
    height: 100%;
}

.md-add-event-demo .md-col-right {
    overflow: auto;
    height: 100%;
    border-left: 1px solid #ccc;
}

.md-add-event-demo .md-delete-btn {
    margin: 0;
    position: absolute;
    right: 10px;
    z-index: 1;
    transition: background-color .3s ease-out;
}

.md-add-event-demo .md-delete-btn.mbsc-btn-outline.mbsc-btn:not(:disabled):not(.mbsc-active):hover:hover {
    background: #f5504e;
    color: #fff;
}

.mbsc-rtl .md-add-event-demo .md-delete-btn {
    right: auto;
    left: 10px;
}

.md-add-event-popup {
    max-width: 400px;
}

Event Calendar - View/update event

Change demo
View/update event
mobiscroll.settings = {
    lang: '',
    theme: ''
};

class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            preventSet: false,
            eventToEdit: {},
            events: [],
            eventText: '',
            eventDesc: '',
            allDay: false,
            eventDate: [],
            isFree: 'false',
            eventColor: ''
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events-update/', (arr) => {
            this.setState({ events: arr});
        }, 'jsonp');
        
        this.textChange = this.textChange.bind(this);
        this.descChange = this.descChange.bind(this);
        this.allDayChange = this.allDayChange.bind(this);
        this.dateChange = this.dateChange.bind(this);
        this.isFreeChange = this.isFreeChange.bind(this);
        this.saveChanges = this.saveChanges.bind(this);
        this.onEventSelect = this.onEventSelect.bind(this);
    }
    
    textChange(event) {
        var state = this.state;
        state.eventText = event.target.value;
        this.setState(state);
    }
    
    descChange(event) {
        var state = this.state;
        state.eventDesc = event.target.value;
        this.setState(state);
    }
    
    allDayChange(event) {
        var state = this.state;
        state.allDay = event.target.checked;
        this.refs.range.instance.option({
            controls: state.allDay ? ['date'] : ['date', 'time'],
            dateWheels: state.allDay ? 'MM dd yy' : '|D M d|'
        });
        
        this.setState(state);
    }
    
    dateChange(event, inst) {
        var state = this.state;
        state.eventDate = inst.getVal();
        this.setState(state);
    }
    
    isFreeChange(event){
        var state = this.state;
        state.isFree = event.target.value;
        this.setState(state);
    }
    
    setColor = (event, inst) => {
        var state = this.state;
        state.eventColor = inst.getVal();
        this.setState(state);
    }
    
    showAddEventPopup = () => {
        this.refs.popup.instance.show();
    }
    
    saveChanges(event, inst) {
        var state = this.state,
            eventToSave = {
                id: state.eventToEdit.id,
                text: state.eventText,
                desc: state.eventDesc,
                color: state.eventColor,
                allDay: state.allDay,
                start: state.eventDate[0],
                end: state.eventDate[1],
                free: state.isFree == 'true'
            },
            index = state.events.findIndex(x => x.id === state.eventToEdit.id);
        
        var newState = React.addons.update(state, {
            events: {
                $splice: [ [index, 1, eventToSave] ]
            }
        });
        
        this.setState(newState);
    }
    
    onPageChange = (event, inst) => {
        var state = this.state,
            day = event.firstDay;
            
        state.preventSet = true;
        
        this.setState(state);
        this.navigate(this.refs.cal.instance, day);
    }
    
    onEventSelect = (event, inst) => {
        var state = this.state;
        state.eventToEdit = event.event;
        this.setState(state);
        
        this.updatePopup();
        this.refs.popup.instance.show();
    }
    
    onSetDate = (event, inst) => {
         if (!this.state.preventSet && this.refs.list != undefined) {
             var state = this.state,
                day = event.date;
                
            this.navigate(this.refs.list.instance, day);
            this.setState(state);
         }
        this.state.preventSet = false;
    }
    
    updatePopup = () => {
        var state = this.state,
            event = state.eventToEdit,
            free = event.free ? 'true' : 'false',
            oneDay = 1000 * 60 * 60 * 24,
            diff = new Date(event.end).getTime() - new Date(event.start).getTime(),
            days = Math.round(Math.abs(diff) / oneDay),
            allDay = event.allDay || days > 0;
            
        state.eventText = event.text || '';
        state.eventDesc = event.desc || '';
        state.allDay = allDay;
        state.eventDate = [event.start, event.end];
        state.isFree = free;
        state.eventColor = event.color;
        
        this.refs.range.instance.option({
            controls: state.allDay ? ['date'] : ['date', 'time'],
            dateWheels: state.allDay ? 'MM dd yy' : '|D M d|'
        });
        
        this.setState(state);
    }
    
    navigate = (inst, val) => {
        if (inst) {
            inst.navigate(val);
        }
    }
    
    render () {
        return (
            <div>
                <mobiscroll.Form>
                    <div className="mbsc-grid md-view-update-demo">
                        <div className="mbsc-row mbsc-no-padding">
                            <div className="mbsc-col-md-4 mbsc-col-12">
                                <mobiscroll.Eventcalendar
                                    ref="cal"
                                    display="inline"
                                    view={{
                                        calendar: { type: 'month' }
                                    }}
                                    data={this.state.events}
                                    onSetDate={this.onSetDate}
                                />
                            </div>
                            <div className="mbsc-col-md-8 mbsc-col-12 md-col-right">
                                <mobiscroll.Eventcalendar
                                    ref="list"
                                    display="inline"
                                    view={{
                                        eventList: { type: 'day' }
                                    }}
                                    data={this.state.events}
                                    onPageChange={this.onPageChange}
                                    onEventSelect={this.onEventSelect}
                                />
                            </div>
                        </div>
                    </div>
                </mobiscroll.Form>
                <mobiscroll.Popup
                    ref="popup"
                    display="center"
                    buttons={[
                        'cancel',
                        {
                            text: 'Save',
                            handler: 'set'
                        }
                    ]}
                    headerText="Edit event"
                    onSet={this.saveChanges}
                >
                    <mobiscroll.Form>
                        <mobiscroll.FormGroup>
                            <mobiscroll.Form.Label>
                                Title
                                <input value={this.state.eventText} onChange={this.textChange} />
                            </mobiscroll.Form.Label>
                            <mobiscroll.Textarea value={this.state.eventDesc} onChange={this.descChange}>
                                Description
                            </mobiscroll.Textarea>
                        </mobiscroll.FormGroup>
                        <mobiscroll.FormGroup className="md-hidden">  
                            <mobiscroll.Switch value={this.state.allDay} onChange={this.allDayChange}>
                                All-day
                            </mobiscroll.Switch>
                            <mobiscroll.Form.Label>
                                Starts
                                <input id="startDate" />
                            </mobiscroll.Form.Label>
                            <mobiscroll.Form.Label>
                                Ends
                                <input id="endDate" />
                            </mobiscroll.Form.Label>
                            <mobiscroll.Range
                                ref="range"
                                type="hidden"
                                controls={['date', 'time']}
                                dateWheels="|D M d|"
                                startInput="#startDate"
                                endInput="#endDate"
                                tabs={false}
                                responsive={{
                                    large: {
                                        touchUi: false
                                    }
                                }}
                                value={this.state.eventDate}
                                onSet={this.dateChange}
                            />
                            <mobiscroll.Segmented name="group" value="false" checked={this.state.isFree === 'false'} onChange={this.isFreeChange}>
                                Show as busy
                            </mobiscroll.Segmented>
                            <mobiscroll.Segmented name="group" value="true" checked={this.state.isFree === 'true'} onChange={this.isFreeChange}>
                                Show as free
                            </mobiscroll.Segmented>
                            <mobiscroll.Color
                                type="hidden"
                                display="inline"
                                layout="liquid"
                                clear={false}
                                onSet={this.setColor}
                                data={["#fff568", "#ffc400", "#ff5252", "#f48fb1", "#ba68c8", "#8c9eff", "#90caf9", "#9ccc65", "#0db057", "#bcaaa4"]}
                            />
                        </mobiscroll.FormGroup>
                    </mobiscroll.Form>
                </mobiscroll.Popup>
            </div>
        );
    }    
}

<div id="content"></div>
.md-view-update-demo {
    position: absolute;
    height: 100%;
}

.md-view-update-demo .mbsc-row {
    height: 100%;
}

.md-view-update-demo .md-col-right {
    overflow: auto;
    height: 100%;
    border-left: 1px solid #ccc;
}

.md-view-update-popup {
    max-width: 400px;
}

.md-hidden .mbsc-color-input {
    display: none;
}

Event Calendar - Calendar systems

Change demo
Calendar systems
React Event calendar with Gregorian, Hijri and Jalali system supporting different language and culture settings. For React.
mobiscroll.settings = {
    lang: '',
    theme: ''
};

class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            myEvents: []
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events/', (events) => {
            this.setState({ myEvents: events});
        }, 'jsonp');
    }
    render() {
        return (
            <mobiscroll.Form>
                <div className="mbsc-grid">
                    <div className="mbsc-row">
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <div className="mbsc-form-group">
                                <div className="mbsc-form-group-title">Gregorian calendar</div>
                                <mobiscroll.Eventcalendar
                                    display="inline"
                                    data={this.state.myEvents}
                                    calendarSystem="gregorian"
                                />
                            </div>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <div className="mbsc-form-group">
                                <div className="mbsc-form-group-title">Jalali calendar</div>
                                <mobiscroll.Eventcalendar
                                    display="inline"
                                    data={this.state.myEvents}
                                    calendarSystem="jalali"
                                    lang="fa"
                                />
                            </div>
                        </div>
                        <div className="mbsc-col-sm-12 mbsc-col-md-4">
                            <div className="mbsc-form-group">
                                <div className="mbsc-form-group-title">Hijri calendar</div>
                                <mobiscroll.Eventcalendar
                                    display="inline"
                                    data={this.state.myEvents}
                                    calendarSystem="hijri"
                                    lang="ar"
                                />
                            </div>
                        </div>
                    </div>
                </div>
            </mobiscroll.Form>
        );
    }    
}

<div id="content"></div>

Event Calendar - Event handlers

Change demo
Event handlers
React Event calendar for mobile and desktop with hooks for custom integration and functionality. With source code. For React.
Clear event log
EVENTS FIRED: 
class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        var now = new Date();
        
        this.state = {
            myEvents: [{
                d: now,
                text: 'Green box to post office',
                color: '#6e7f29'
            }, {
                d: 'w3',
                text: 'Employment (Semi-weekly)',
                color: '#635045'
            }, {
                d: 'w5',
                text: 'Employment (Semi-weekly)',
                color: '#ff9966'
            }, {
                start: new Date(now.getFullYear(), 1, 7),
                end: new Date(now.getFullYear(), 1, 25),
                text: 'Dean OFF',
                color: '#99ff33'
            }, {
                start: new Date(now.getFullYear(), 2, 5),
                end: new Date(now.getFullYear(), 2, 14),
                text: 'Mike OFF',
                color: '#e7b300'
            }, {
                start: new Date(now.getFullYear(), 4, 7),
                end: new Date(now.getFullYear(), 4, 16),
                text: 'John OFF',
                color: '#669900'
            }, {
                start: new Date(now.getFullYear(), 5, 1),
                end: new Date(now.getFullYear(), 5, 11),
                text: 'Carol OFF',
                color: '#6699ff'
            }, {
                start: new Date(now.getFullYear(), 6, 2),
                end: new Date(now.getFullYear(), 6, 17),
                text: 'Jason OFF',
                color: '#cc9900'
            }, {
                start: new Date(now.getFullYear(), 7, 6),
                end: new Date(now.getFullYear(), 7, 14),
                text: 'Ashley OFF',
                color: '#339966'
            }, {
                start: new Date(now.getFullYear(), 8, 10),
                end: new Date(now.getFullYear(), 8, 20),
                text: 'Marisol OFF',
                color: '#8701a9'
            }, {
                start: new Date(now.getFullYear(), 9, 1),
                end: new Date(now.getFullYear(), 9, 12),
                text: 'Sharon OFF',
                color: '#cc6699'
            }, {
                d: '12/25',
                text: 'Christmas Day',
                color: '#ff0066'
            }, {
                d: '1/1',
                text: 'New Year\'s day',
                color: '#99ccff'
            }, {
                d: '4/1',
                text: 'April Fool\'s Day',
                color: '#ff6666'
            }]
        };
    }

    onInit = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onMarkupReady = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onBeforeShow = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onPosition = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onShow = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onDestroy = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onClose = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onBeforeClose = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onPageLoading = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onPageLoaded = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onPageChange = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onEventSelect = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onDayChange = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onLabelTap = (event, inst) => {
        // Your custom event handler goes here
    }
    
    onSetDate = (event, inst) => {
        // Your custom event handler goes here
    }
    
    render() {
        return (
            <mobiscroll.Eventcalendar
                lang=""
                theme=""
                display="inline"
                view={{
                    calendar: { type: 'month' },
                    eventList: { type: 'month' }
                }}
                data={this.state.myEvents}
                onInit={this.onInit}
                onMarkupReady={this.onMarkupReady}
                onBeforeShow={this.onBeforeShow}
                onPosition={this.onPosition}
                onShow={this.onShow}
                onDestroy={this.onDestroy}
                onClose={this.onClose}
                onBeforeClose={this.onBeforeClose}
                onPageLoading={this.onPageLoading}
                onPageLoaded={this.onPageLoaded}
                onPageChange={this.onPageChange}
                onEventSelect={this.onEventSelect}
                onDayChange={this.onDayChange}
                onLabelTap={this.onLabelTap}
                onSetDate={this.onSetDate}
            />
        );
    }    
}

<div id="content"></div>

Event Calendar - Localization

Change demo
Localization
React Event calendar localization example supporting 37 languages, date, time formats with full RTL capability. For React.
mobiscroll.settings = {
    lang: '',
    theme: ''
};

class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            myEvents: [],
            lang: 'en',
            flagClass: 'flag flag-en',
            languages: [{
                value: 'en',
                text: 'English'
            }, {
                value: 'ar',
                text: 'Arabic'
            }, {
                value: 'bg',
                text: 'Bulgarian'
            }, {
                value: 'ca',
                text: 'Català'
            }, {
                value: 'cs',
                text: 'Cestina'
            }, {
                value: 'zh',
                text: 'Chinese'
            }, {
                value: 'hr',
                text: 'Croatian'
            }, {
                value: 'da',
                text: 'Dansk'
            }, {
                value: 'de',
                text: 'Deutsch'
            }, {
                value: 'en-UK',
                text: 'English (UK)'
            }, {
                value: 'es',
                text: 'Español'
            }, {
                value: 'fr',
                text: 'Français'
            }, {
                value: 'el',
                text: 'Greek'
            }, {
                value: 'in',
                text: 'Hindi'
            }, {
                value: 'it',
                text: 'Italiano'
            }, {
                value: 'ja',
                text: 'Japanese'
            }, {
                value: 'ko',
                text: 'Korean'
            }, {
                value: 'lt',
                text: 'Lietuvių'
            }, {
                value: 'hu',
                text: 'Magyar'
            }, {
                value: 'nl',
                text: 'Nederlands'
            }, {
                value: 'no',
                text: 'Norsk'
            }, {
                value: 'pl',
                text: 'Polski'
            }, {
                value: 'pt-PT',
                text: 'Português Europeu'
            }, {
                value: 'pt-BR',
                text: 'Pt. Brasileiro'
            }, {
                value: 'ro',
                text: 'Româna'
            }, {
                value: 'sr',
                text: 'Serbian'
            }, {
                value: 'sk',
                text: 'Slovencina'
            }, {
                value: 'fi',
                text: 'Suomi'
            }, {
                value: 'sv',
                text: 'Svenska'
            }, {
                value: 'th',
                text: 'Thai'
            }, {
                value: 'tr',
                text: 'Türkçe'
            }, {
                value: 'ua',
                text: 'Ukrainian'
            }, {
                value: 'vi',
                text: 'Vietnamese'
            }, {
                value: 'ru',
                text: 'Русский'
            }, {
                value: 'ru-UA',
                text: 'Русский (UA)'
            }, {
                value: 'he',
                text: 'עברית'
            }, {
                value: 'fa',
                text: 'فارسی'
            }]
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events/', (events) => {
            this.setState({ myEvents: events});
        }, 'jsonp');
    }
    
    onSet = (event, inst) => {
        var la = inst.getVal(),
            state = this.state;
        
        this.refs.cal.instance.option({
            lang: la
        });
        
        state.value = la;
        state.flagClass = "flag flag-" + la;
        
        this.setState(state);
    }
        
    render() {
        return (
            <mobiscroll.Form className="md-localization" inputStyle="box" labelStyle="inline">
                <div className="mbsc-grid">
                    <div className="mbsc-row mbsc-justify-content-center">
                        <div className="mbsc-col-sm-7 mbsc-col-md-5 mbsc-col-lg-4">
                            <label>
        					    <span className={this.state.flagClass}></span>
                                <mobiscroll.Select
                                    value={this.state.lang}
                                    data={this.state.languages}
                                    display="bubble"
                                    touchUi={false}
                                    onSet={this.onSet}
                                >
                                </mobiscroll.Select>
                            </label>
                        </div>
                    </div>
                    <div className="mbsc-row mbsc-justify-content-center">
                        <div className="mbsc-col-sm-9 mbsc-col-md-7 mbsc-col-lg-6">
                            <mobiscroll.Eventcalendar
                                ref="cal"
                                display="inline"
                                data={this.state.myEvents}
                            />
                        </div>
                    </div>
                </div>
            </mobiscroll.Form>
        );
    }    
}

<div id="content"></div>
.md-localization span.flag {
    min-width: 22px;
    height: 15px;
    position: relative;
    left: 0;
    margin-right: 1em;
    z-index: 1;
    top: 10px;
}

.mbsc-rtl .md-localization span.flag {
    margin-right: 0;
    margin-left: 1em;
}

.mbsc-ios .md-localization span.flag {
    top: 15px;
    left: 1em;
}

.mbsc-rtl.mbsc-ios .md-localization span.flag {
    right: 1em;
}

.mbsc-windows .md-localization span.flag {
    top: 8px;
}

.md-localization img.flag {
    width: 30px;
}

.md-localization .flag {
    background: url(https://img.mobiscroll.com/demos/flags/flags_responsive.png) no-repeat;
    background-size: 100%;
}

.md-localization .flag-en {
    background-position: 0 93.38843%;
}

.md-localization .flag-ar {
    background-position: 0 76.033058%;
}

.md-localization .flag-bg {
    background-position: 0 9.090909%;
}

.md-localization .flag-ca {
    background-position: 0 14.876033%;
}

.md-localization .flag-cs {
    background-position: 0 21.900826%;
}

.md-localization .flag-zh {
    background-position: 0 19.008264%;
}

.md-localization .flag-hr {
    background-position: 0 38.429752%;
}

.md-localization .flag-da {
    background-position: 0 23.140496%;
}

.md-localization .flag-de {
    background-position: 0 22.31405%;
}

.md-localization .flag-en-UK {
    background-position: 0 92.561983%;
}

.md-localization .flag-es {
    background-position: 0 26.859504%;
}

.md-localization .flag-fr {
    background-position: 0 29.752066%;
}

.md-localization .flag-el {
    background-position: 0 34.710744%;
}

.md-localization .flag-in {
    background-position: 0 40.909091%;
}

.md-localization .flag-it {
    background-position: 0 42.975207%;
}

.md-localization .flag-ja {
    background-position: 0 44.214876%;
}

.md-localization .flag-ko {
    background-position: 0 47.520661%;
}

.md-localization .flag-lt {
    background-position: 0 52.066116%;
}

.md-localization .flag-hu {
    background-position: 0 39.256198%;
}

.md-localization .flag-nl {
    background-position: 0 65.289256%;
}

.md-localization .flag-no {
    background-position: 0 65.702479%;
}

.md-localization .flag-pl {
    background-position: 0 70.661157%;
}

.md-localization .flag-pt-PT {
    background-position: 0 72.31405%;
}

.md-localization .flag-pt-BR {
    background-position: 0 11.983471%;
}

.md-localization .flag-ro {
    background-position: 0 74.380165%;
}

.md-localization .flag-sr {
    background-position: 0 74.793388%;
}

.md-localization .flag-sk {
    background-position: 0 79.752066%;
}

.md-localization .flag-fi {
    background-position: 0 27.68595%;
}

.md-localization .flag-sv {
    background-position: 0 77.68595%;
}

.md-localization .flag-th {
    background-position: 0 85.950413%;
}

.md-localization .flag-tr {
    background-position: 0 89.256198%;
}

.md-localization .flag-ua {
    background-position: 0 91.735537%;
}

.md-localization .flag-vi {
    background-position: 0 96.694215%;
}

.md-localization .flag-ru {
    background-position: 0 75.206612%;
}

.md-localization .flag-ru-UA {
    background-position: 0 10.743802%;
}

.md-localization .flag-he {
    background-position: 0 40.495868%;
}

.md-localization .flag-fa {
    background-position: 0 42.14876%;
}

Event Calendar - Theming capabilities

Change demo
Theming capabilities
mobiscroll.settings = {
    lang: '',
    theme: ''
};

class EventCalendarDemo extends React.Component {
     constructor(props) {
        super(props);

        this.state = {
            ios: 'ios',
            material: 'material',
            windows: 'windows',
            mobiscroll: 'mobiscroll',
            events: [] 
        };
        
        mobiscroll.util.getJson('https://trial.mobiscroll.com/events/', (arr) => {
            this.setState({ events: arr});
        }, 'jsonp');
    }
    
    changeIos = (event) => {
        this.refs.iosCal.instance.option({ theme: event.target.value });
        this.setState({ ios: event.target.value });
    }
    
    changeMaterial = (event) => {
        this.refs.materialCal.instance.option({ theme: event.target.value });
        this.setState({ material: event.target.value });
    }
    
    changeWindows = (event) => {
        this.refs.windowsCal.instance.option({ theme: event.target.value });
        this.setState({ windows: event.target.value });
    }
    
    changeMobiscroll = (event) => {
        this.refs.mobiscrollCal.instance.option({ theme: event.target.value });
        this.setState({ mobiscroll: event.target.value });
    }
    
    render () {
        return (
            <div className="mbsc-grid mbsc-grid-fixed">
                <div className="mbsc-row">
                    <mobiscroll.FormGroup className="mbsc-col-sm-12 mbsc-col-md-6">
                        <mobiscroll.Form>
                            <mobiscroll.FormGroupTitle>iOS Theme</mobiscroll.FormGroupTitle>
                            <mobiscroll.Segmented value="ios" name="ios" checked={this.state.ios === 'ios'} onChange={this.changeIos}>
                                Light
                            </mobiscroll.Segmented>
                            <mobiscroll.Segmented value="ios-dark" name="ios" checked={this.state.ios === 'ios-dark'} onChange={this.changeIos}>
                                Dark
                            </mobiscroll.Segmented>
                            <mobiscroll.Segmented value="ios-gray" name="ios" checked={this.state.ios === 'ios-gray'} onChange={this.changeIos}>
                                Custom
                            </mobiscroll.Segmented>
                        </mobiscroll.Form>
                        <mobiscroll.Eventcalendar
                            ref="iosCal"
                            theme="ios"
                            display="inline"
                            view={{
                                calendar: {
                                    labels: true
                                }
                            }}
                            data={this.state.events}
                        />
                    </mobiscroll.FormGroup>
                    <mobiscroll.FormGroup className="mbsc-col-sm-12 mbsc-col-md-6">
                        <mobiscroll.Form>
                            <mobiscroll.FormGroupTitle>Material Theme</mobiscroll.FormGroupTitle>
                            <mobiscroll.Segmented value="material" name="material" checked={this.state.material === 'material'} onChange={this.changeMaterial}>
                                Light
                            </mobiscroll.Segmented>
                            <mobiscroll.Segmented value="material-dark" name="material" checked={this.state.material === 'material-dark'} onChange={this.changeMaterial}>
                                Dark
                            </mobiscroll.Segmented>
                            <mobiscroll.Segmented value="material-indigo" name="material" checked={this.state.material === 'material-indigo'} onChange={this.changeMaterial}>
                                Custom
                            </mobiscroll.Segmented>
                        </mobiscroll.Form>
                        <mobiscroll.Eventcalendar
                            ref="materialCal"
                            theme="material"
                            display="inline"
                            view={{
                                calendar: {
                                    labels: true
                                }
                            }}
                            data={this.state.events}
                        />
                    </mobiscroll.FormGroup>
                </div>
                <div className="mbsc-row">
                    <mobiscroll.FormGroup className="mbsc-col-sm-12 mbsc-col-md-6">
                       <mobiscroll.Form>
                            <mobiscroll.FormGroupTitle>Windows Theme</mobiscroll.FormGroupTitle>
                            <mobiscroll.Segmented value="windows" name="windows" checked={this.state.windows === 'windows'} onChange={this.changeWindows}>
                                Light
                            </mobiscroll.Segmented>
                            <mobiscroll.Segmented value="windows-dark" name="windows" checked={this.state.windows === 'windows-dark'} onChange={this.changeWindows}>
                                Dark
                            </mobiscroll.Segmented>
                            <mobiscroll.Segmented value="windows-yellow" name="windows" checked={this.state.windows === 'windows-yellow'} onChange={this.changeWindows}>
                                Custom
                            </mobiscroll.Segmented>
                        </mobiscroll.Form>
                        <mobiscroll.Eventcalendar
                            ref="windowsCal"
                            theme="windows"
                            display="inline"
                            view={{
                                calendar: {
                                    labels: true
                                }
                            }}
                            data={this.state.events}
                        />
                    </mobiscroll.FormGroup>
                    <mobiscroll.FormGroup className="mbsc-col-sm-12 mbsc-col-md-6">
                        <mobiscroll.Form>
                            <mobiscroll.FormGroupTitle>Mobiscroll Theme</mobiscroll.FormGroupTitle>
                            <mobiscroll.Segmented value="mobiscroll" name="mobiscroll" checked={this.state.mobiscroll === 'mobiscroll'} onChange={this.changeMobiscroll}>
                                Light
                            </mobiscroll.Segmented>
                            <mobiscroll.Segmented value="mobiscroll-dark" name="mobiscroll" checked={this.state.mobiscroll === 'mobiscroll-dark'} onChange={this.changeMobiscroll}>
                                Dark
                            </mobiscroll.Segmented>
                            <mobiscroll.Segmented value="mobiscroll-lime" name="mobiscroll" checked={this.state.mobiscroll === 'mobiscroll-lime'} onChange={this.changeMobiscroll}>
                                Custom
                            </mobiscroll.Segmented>
                        </mobiscroll.Form>
                        <mobiscroll.Eventcalendar
                            ref="mobiscrollCal"
                            theme="mobiscroll"
                            display="inline"
                            view={{
                                calendar: {
                                    labels: true
                                }
                            }}
                            data={this.state.events}
                        />
                    </mobiscroll.FormGroup>
                </div>
            </div>
        );
    }    
}

<div id="content"></div>

Event Calendar - Range view

Change demo
Range view
React Event calendar two week range demo. Use it with a week calendar and event list for the range. Supports days/weeks. For React.
class EventcalendarDemo extends React.Component {
    constructor(props) {
        super(props);

        var now = new Date();
        
        this.state = {
            myEvents: [{
                d: new Date(now.getFullYear(), now.getMonth(), 8, 8, 0),
                text: 'Green box to post office',
                color: '#6e7f29'
            }, {
                start: new Date(now.getFullYear(), now.getMonth(), 8, 8, 45),
                end: new Date(now.getFullYear(), now.getMonth(), 8, 9, 0),
                text: 'Quick mtg. with Martin',
                color: '#de3d83'
            }, {
                start: new Date(now.getFullYear(), now.getMonth(), 8, 9, 30),
                end: new Date(now.getFullYear(), now.getMonth(), 8, 10, 30),
                text: 'Product team mtg.',
                color: '#f67944'
            }, {
                start: new Date(now.getFullYear(), now.getMonth(), 8, 11, 0),
                end: new Date(now.getFullYear(), now.getMonth(), 8, 11, 30),
                text: 'Stakeholder mtg.',
                color: '#f67944'
            }, {
                start: new Date(now.getFullYear(), now.getMonth(), 8, 13, 0),
                end: new Date(now.getFullYear(), now.getMonth(), 8, 13, 30),
                text: 'Lunch @ Butcher\'s',
                color: '#00aabb'
            }, {
                start: new Date(now.getFullYear(), now.getMonth(), 8, 15, 0),
                end: new Date(now.getFullYear(), now.getMonth(), 8, 16, 0),
                text: 'General orientation',
                color: '#f67944'
            }, {
                d: (now.getMonth() + 1) + '/14',
                text: 'Dexter BD',
                color: '#37bbe4'
            }, {
                d: (now.getMonth() + 1) + '/5',
                text: 'Luke BD',
                color: '#37bbe4'
            }, {
                d: 'w3',
                text: 'Employment (Semi-weekly)',
                color: '#635045'
            }, {
                d: 'w5',
                text: 'Employment (Semi-weekly)',
                color: '#ff9966'
            }, {
                start: new Date(now.getFullYear(), 1, 7),
                end: new Date(now.getFullYear(), 1, 25),
                text: 'Dean OFF',
                color: '#99ff33'
            }, {
                start: new Date(now.getFullYear(), 2, 5),
                end: new Date(now.getFullYear(), 2, 14),
                text: 'Mike OFF',
                color: '#e7b300'
            }, {
                start: new Date(now.getFullYear(), 4, 7),
                end: new Date(now.getFullYear(), 4, 16),
                text: 'John OFF',
                color: '#669900'
            }, {
                start: new Date(now.getFullYear(), 5, 1),
                end: new Date(now.getFullYear(), 5, 11),
                text: 'Carol OFF',
                color: '#6699ff'
            }, {
                start: new Date(now.getFullYear(), 6, 2),
                end: new Date(now.getFullYear(), 6, 17),
                text: 'Jason OFF',
                color: '#cc9900'
            }, {
                start: new Date(now.getFullYear(), 7, 6),
                end: new Date(now.getFullYear(), 7, 14),
                text: 'Ashley OFF',
                color: '#339966'
            }, {
                start: new Date(now.getFullYear(), 8, 10),
                end: new Date(now.getFullYear(), 8, 20),
                text: 'Marisol OFF',
                color: '#8701a9'
            }, {
                start: new Date(now.getFullYear(), 9, 1),
                end: new Date(now.getFullYear(), 9, 12),
                text: 'Sharon OFF',
                color: '#cc6699'
            }, {
                d: '12/25',
                text: 'Christmas Day',
                color: '#ff0066'
            }, {
                d: '1/1',
                text: 'New Year\'s day',
                color: '#99ccff'
            }, {
                d: '4/1',
                text: 'April Fool\'s Day',
                color: '#ff6666'
            }, {
                d: '11/2',
                text: 'File Form 720 for the third quarter',
                color: '#a63e14'
            }, {
                d: '11/2',
                text: 'File Form 730 and pay tax on wagers accepted during September',
                color: '#a63e14'
            }, {
                d: '11/2',
                text: 'File Form 2290 and pay the tax for vehicles first used during September',
                color: '#a63e14'
            }, {
                d: '11/2',
                text: 'File Form 941 for the third quarter',
                color: '#a63e14'
            }, {
                d: '11/2',
                text: 'Deposit FUTA owed through Sep if more than $500',
                color: '#a63e14'
            }, {
                d: '11/30',
                text: 'Deposit payroll tax for payments on Nov 21-24 if the semiweekly deposit rule applies',
                color: '#a63e14'
            }, {
                d: '11/30',
                text: 'File Form 730 and pay tax on wagers accepted during October',
                color: '#a63e14'
            }, {
                d: '11/30',
                text: 'File Form 2290 and pay the tax for vehicles first used during October',
                color: '#a63e14'
            }]
        };
    }
    render() {
        return (
            <mobiscroll.Eventcalendar
                lang=""
                theme=""
                display="inline"
                data={this.state.myEvents}
                view={{
                    calendar: {
                        type: 'week',
                        size: 2
                    },
                    eventList: {
                        type: 'week',
                        size: 2
                    }
                }}
            />
        );
    }    
}

<div id="content"></div>

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

Component license


Purchase component licenses if you are looking for specific funcionality.

Total


All features will be included with the license.

Buy component license

Framework license


Get all 36 components, including with the Framework license.



Mobiscroll for React $595


Use Javascript when building with plain and simple JS. Use jQuery when you have jQuery already included or if you are building with jQuery Mobile. Use AngularJS when building with Angular 1.x or Ionic 1. Use Angular when building with Angular 2/4/5/6/7 or Ionic 2/3/4. Use it when you are building your app or website with React.


Buy framework license
See other licensing options

Framework license


Get all 36 components, including with the Framework license.



Mobiscroll for React $595


  • Use it when building with plain and simple JS
  • Compatible with vanilla JS app or frameworks like Vue
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it with jQuery and jQuery Mobile
  • Enjoy the familiar API if you already use jQuery
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it with Angular JS and Ionic 1
  • For web and mobile apps based on Angular 1.x
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it with Angular 2/4/5/6/7 and Ionic 2/3/4
  • Visual Studio and VS Code integration
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it when building with React JS
  • Collection of UI components for web and mobile
  • Royalty-free commercial usage
  • Technical support is included with the license
Buy framework license
See other licensing options

Framework license


Select the development framework you are using. Get all 36 components with the license.

Mobiscroll for Javascript
Mobiscroll for jQuery
Mobiscroll for React
Mobiscroll for Angular
Mobiscroll for Angular JS
  • Use it when building with plain and simple JS
  • Compatible with vanilla JS app or frameworks like Vue
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it with jQuery and jQuery Mobile
  • Enjoy the familiar API if you already use jQuery
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it with Angular JS and Ionic 1
  • For web and mobile apps based on Angular 1.x
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it with Angular 2/4/5/6/7 and Ionic 2/3/4
  • Visual Studio and VS Code integration
  • Royalty-free commercial usage
  • Technical support is included with the license
  • Use it when building with React JS
  • Collection of UI components for web and mobile
  • Royalty-free commercial usage
  • Technical support is included with the license
Buy framework license
See other licensing options

Select the framework you are interested in

Javascript
jQuery
Angular
Angular JS
React

Use Javascript when building with plain and simple JS.

Use jQuery when you have jQuery already included or if you are building with jQuery Mobile.

Use AngularJS when building with Angular 1.x or Ionic 1.

Use Angular when building with Angular 2/4/5/6/7 or Ionic 2/3/4.

Use it when you are building your app or website with React.

Do you need additional support seats?

The framework license comes with one support seat. ( +$50/seat )

Add the source code?

Price
Buy now
Customize & try demos locally
Sign in or start your free trial

What framework are you using?

Javascript
jQuery
AngularJS
Angular
Ionic
React
Other
Select a framework
Email address

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

Customize & try demos locally
You can download and use Mobiscroll for Free

What framework are you using?

Javascript
jQuery
AngularJS
Angular
Ionic
React
Other
Select a framework
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
$ mobiscroll config ionic --lite

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. HTML goes into the markup, TS into Typescript.

Copy TS
Copy HTML
Copy CSS

Run ionic serve in the root folder of your app 🎉

Copy command
$ ionic serve
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

You are setting a password for the account

New Password Required Enter at least 6 characters
Change your password
Need to update your password? Enter and hit the button below

Your password has been changed!

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
Alerts & notifications
Alert Notifications Note
Components
Alerts & notifications 3
Buttons 4
Calendar 27
Cards 14
Color 10
Date & Time 20
Event Calendar 25
Forms 9
Grid layout 7
Image 7
Inputs & fields 6
Listview 17
Measurement 10
Navigation 8
Number 8
Numpad 13
Option List 4
Popup 10
Range 19
Scroller 7
Scrollview 5
Select 16
Slider & progress 4
Styling 6
Timer 5
Timespan 6
Toggle & Radio 4
Treelist 7
Theme Select
Mobiscroll
Mobiscroll Dark
Material
Material Dark
iOS
iOS Dark
Bootstrap
Windows
Windows Dark
Display Mode
Language Locale
See other demos and change options
Theme
Display
Locale
See other demos