Web Components Calendar Overview

    The Ignite UI for Web Components Calendar component provides an easy and intuitive way to display date information.

    Web Components Calendar Example

    This sample demonstrates how to create IgcCalendarComponent with option to select a single date.

    Usage

    First, you need to install the Ignite UI for Web Components by running the following command:

    npm install igniteui-webcomponents
    
    import { defineComponents, IgcCalendarComponent } from 'igniteui-webcomponents';
    
    defineComponents(IgcCalendarComponent);
    

    The simplest way to start using the IgcCalendarComponent is as follows:

    <igc-calendar></igc-calendar>
    

    Selection Modes

    Users can choose from three different selection modes - single selection, multiple selection or range selection. By default, the IgcCalendarComponent is using single selection mode but you can change it by setting the selection property as shown in this example.

    <igc-calendar selection="multiple"></igc-calendar>
    

    Range Selection

    Following the same approach, we can switch selection to range mode:

    <!-- Range selection mode -->
    <igc-calendar selection="range"></igc-calendar>
    

    Active View and Date

    The Calendar component allows you to switch between three different views: days, months and years. The activeView property of the component reflects the current view. By default, the Calendar displays the current date when loaded initially. You could modify this by setting the activeDate property. The activeDate property also reflects the changes of the currently visible date made by the end user.

    Header Options

    By default, the Calendar component renders a header area which contains information about the selected dates. You could hide the header by setting the HasHeader property to false. You could also configure vertical or horizontal orientation of the header using the headerOrientation property.

    Note

    Please note that the Calendar header is not rendered when the selection is set to multiple.

    Note

    Please note that the Calendar DOM properties use camelCase naming while their corresponding HTML attributes are using kebab-case. For example the headerOrientation property corresponds to the header-orientation attribute.

    The Ignite UI for Web Components Calendar component exposes a title slot which allows you to customize the title of the header.

    <igc-calendar selection="range" header-orientation="vertical">
        <span slot="title">Trip dates</span>
    </igc-calendar>
    

    The following sample demonstrates the above configuration:

    Localization and Formatting

    Due to their very nature, localization and formatting are essential to any calendar. In the IgcCalendarComponent those are controlled and customized through the following properties - locale, formatOptions, weekStart.

    Let's go ahead and try those along with other customizations. First thing we need to set is the weekStart, which controls the starting day of the week. It defaults to Sunday, so we will set it to Monday. We will also customize the formatOptions property which specifies the options used to format the months and the weekdays in the Calendar views. Finally, we will set the locale property to a value, based on the user's location choice:

    <igc-radio-group alignment="horizontal">
        <igc-radio name="locale" value="en" checked>EN</igc-radio>
        <igc-radio name="locale" value="de">DE</igc-radio>
        <igc-radio name="locale" value="fr">FR</igc-radio>
        <igc-radio name="locale" value="ar">AR</igc-radio>
        <igc-radio name="locale" value="ja">JA</igc-radio>
    </igc-radio-group>
    
    <igc-calendar
        id="calendar1"
        week-start="monday"
    >
    </igc-calendar>
    
    this.calendar = document.getElementById('calendar1') as IgcCalendarComponent;
    this.calendar.formatOptions = {
        month: 'short',
        weekday: 'short'
    };
    
    this.radios = document.querySelectorAll('igc-radio') as NodeListOf<IgcRadioComponent>;
    this.radios.forEach(radio => {
        radio.addEventListener('igcChange', () => {
            if (radio.checked) {
                this.calendar.locale = radio.value;
            }
        });
    })
    

    If everything went well, we should now have a Calendar with customized display, that also changes the locale representation, based on the user selection. Let's have a look at it:

    Disabled dates

    In some cases you would want to have disabled dates in the Calendar which can't be selected by the end user. This functionality is achieved by using the disabledDates property. The disabledDates property is an array of DateRangeDescriptor objects. Each descriptor has a Type and optionally a dateRange which is an array of Date objects.

    These are the available options for the Type property:

    • After - disables the dates after the first date in the dateRange
    • Before - disables the dates before the first date in the dateRange
    • Between - disables the dates between the first and the second date in the dateRange
    • Specific - disables the dates specified in the dateRange array
    • Weekdays - disables all weekdays
    • Weekends - disables all weekends

    Let's create a sample that is disabling the dates between the 3rd and the 8th of the current month:

    const today = new Date(Date.now());
    const range = [
        new Date(today.getFullYear(), today.getMonth(), 3),
        new Date(today.getFullYear(), today.getMonth(), 8)
    ];
    
    this.calendar.disabledDates = [{ type: DateRangeType.Between, dateRange: range }];
    

    These configurations should have the following result:

    Special dates

    The specialDates property is using almost the same configuration principles as the disabledDates. The special dates have a highlighted look and feel and unlike the disabled ones can be selected.

    Let's add some special dates to our Calendar. In order to do this, we will create a DateRangeDescriptor and pass the dates between the 3rd and the 8th of the current month:

    const today = new Date();
    const range = [
        new Date(today.getFullYear(), today.getMonth(), 3),
        new Date(today.getFullYear(), today.getMonth(), 8)
    ];
    
    this.calendar.specialDates = [{ type: DateRangeType.Between, dateRange: range }];
    

    The following demo illustrates a Calendar with a vacation request option:

    Week numbers

    You can use the showWeekNumbers property to show the week numbers of the Calendar component. You can do this by using its corresponding boolean attribute show-week-numbers like this:

    <igc-calendar show-week-numbers></igc-calendar>
    

    The following demo illustrates a Calendar with enabled week numbers:

    Multiple Months

    Using the visibleMonths property, you can display more than one month when the Calendar is in days view. When multiple months are displayed, you can configure whether you want to stack them vertically or horizontally by using the orientation property. By default, the orientation property is set to horizontal.

    The Calendar displays leading and trailing dates from the previous and the next months. You could hide these dates by setting the hideOutsideDays property to true or using its corresponding boolean attribute hideOutsideDays.

    <igc-calendar visible-months="2" hide-outside-days></igc-calendar>
    

    The following sample demonstrates the multiple months configuration:

    Size

    You could control the size and spacing of the Calendar inner elements by changing its size property. The default size value is large.

    Events

    The Calendar component emits the Change event when the selected dates are changed by the end user. You can subscribe to the event like this:

    this.calendar.addEventListener('igcChange', ev => console.log(ev.detail));
    

    Keyboard navigation

    If you traverse the page using the Tab key you should keep in mind that based on W3 accessability recommendations the IgcCalendarComponent introduces the following tab stops:

    • Month selection button
    • Year selection button
    • Previous button
    • Next button
    • Active date element

    When a day/month/year in the IgcCalendarComponent component is focused, use:

    • PageUp key to move to the previous month/year/years page.
    • PageDown key to move to the next month/year/years page.
    • Home key to focus the first day of the current month/first month in view/first year in view.
    • End key to focus the last day of the current month/last month in view/last year in view.
    • Arrow keys to navigate through the days/months/years. Navigating before the first item and after the last item will switch the view to the next/previous month/year/years page.

    When a day inside the days view is focused, use:

    • Shift + PageUp keys to move to the previous year.
    • Shift + PageDown keys to move to the next year.
    • Space or Enter key to select the currently focused day.

    When a month inside the months view is focused, use:

    • Space or Enter key to change the activeDate to the currently focused month and switch to days view.

    When an year inside the years view is focused, use:

    • Space or Enter key to change the activeDate to the currently focused year and switch to months view.

    When the previous or the next buttons (in the subheader) are focused, use:

    • Space or Enter key to switch to the previous/next month/year/years page.

    When the month button (in the subheader) is focused, use:

    • Space or Enter key to switch to months view.

    When the year button (in the subheader) is focused, use:

    • Space or Enter key to switch to years view.

    Styling

    The Calendar component exposes CSS parts for almost all of its inner elements. The following table lists all CSS parts exposed by the Calendar:

    Name Description
    header The header element.
    header-title The header title element.
    header-date The header date element.
    content The content element which contains the views and navigation elements.
    navigation The navigation container element.
    months-navigation The months navigation button element.
    years-navigation The years navigation button element.
    years-range The years range element.
    navigation-buttons The navigation buttons container.
    navigation-button Previous/next navigation button.
    days-view-container The days view container element.
    days-view Days view element.
    months-view The months view element.
    years-view The years view element.
    days-row Days row element.
    label Week header label element.
    week-number Week number element.
    week-number-inner Week number inner element.
    date Date element.
    date-inner Date inner element.
    first The first selected date element.
    last The last selected date element.
    inactive Inactive date element.
    hidden Hidden date element.
    weekend Weekend date element.
    range Range selected element.
    special Special date element.
    disabled Disabled date element.
    single Single selected date element.
    preview Range selection preview date element.
    month Month element.
    month-inner Month inner element.
    year Year element.
    year-inner Year inner element.
    selected Indicates selected state. Applies to date, month and year elements.
    current Indicates current state. Applies to date, month and year elements.

    Using these CSS parts we can customize thе appearance of the Calendar component like this:

    igc-calendar::part(header) {
        background: #345779;
    }
    
    igc-calendar::part(date-inner selected),
    igc-calendar::part(month-inner selected),
    igc-calendar::part(year-inner selected) {
        background: #345779;
        border-color: #345779;
    }
    
    igc-calendar::part(date-inner current),
    igc-calendar::part(navigation-button):hover,
    igc-calendar::part(navigation-button):focus,
    igc-calendar::part(months-navigation):hover,
    igc-calendar::part(months-navigation):focus,
    igc-calendar::part(years-navigation):hover,
    igc-calendar::part(years-navigation):focus {
        color: #2dabe8;
    }
    
    igc-calendar::part(date-inner current selected),
    igc-calendar::part(month-inner current selected),
    igc-calendar::part(year-inner current selected) {
        box-shadow: inset 0 0 0 0.0625rem white, 0 0 0 0.0625rem #345779;
        color: white;
    }
    

    The following sample demonstrates the above CSS configuration:

    API References

    Additional Resources

    API Members