Header and Footer Template

The headers hold key information like the date, day of the week and in some cases it also holds the full date. Whenever you need to show extra information, or if you would like to change the styling or date format, time format you can use the various header templates, depending on the view configuration. You can also show a footer element, for displaying more information.

Add summaries, statistics or simply color the background depending on the number events that occur on that specific day, like in this example.

Check out how you can customize the date header for the scheduler  Let's go →
Get started with this example

Demo

Hourly header/footer template

With an hourly (or sub-hourly) resolution the hourTemplate and hourFooterTemplate options can be used for customizing the header and footer.

htmlhtml<mbsc-eventcalendar
    [view]="hourView"
    [hourTemplate]="hourTemp"
    [hourFooterTemplate]="hourFooterTemp">
    <ng-template #hourTemp let-day>
        <div [ngClass]="'md-date-header-hour md-date-header-events-' + getEventOccurrence(day)">
            {{formatDate('h:mm A', day.date)}}
        </div>
    </ng-template>
    <ng-template #hourFooterTemp let-day>
        <div class="md-date-footer">{{getOccuppancy(day.events)}} %</div>
    </ng-template>
</mbsc-eventcalendar>
tshourView: MbscEventcalendarView = {
    timeline: {
        type: 'day'
    }
};
                            
getOccuppancy(events: any) {
    let occuppancy = 0;
    if (events) {
        var resourceIds = [];
        var nr = 0;
        for (const event of events) {
            if (resourceIds.indexOf(event.resource) < 0) {
                nr++;
                resourceIds = [...resourceIds, event.resource];
            }
        }
        occuppancy = (nr * 100 / this.myResources.length).toFixed(0);
    }
    return occuppancy;
}

getEventOccurrence(args: any): any {
    let eventOccurrence = 'none';

    if (args.events) {
        var eventNr = args.events.length;
        if (eventNr === 0) {
            eventOccurrence = 'none';
        } else if (eventNr === 1) {
            eventOccurrence = 'one';
        } else if (eventNr < 4) {
            eventOccurrence = 'few';
        } else {
            eventOccurrence = 'more';
        }
    }
    return eventOccurrence;
}
css.md-date-header-hour {
    font-size: 12px;
    font-weight: 600;
    text-align: center;
    line-height: 20px;
    border-radius: 8px;
    margin: 3px;
    color: #000;
}

.md-date-header-events-one {
	background: #e9f5e4;
}

.md-date-header-events-few {
	background: #d0e3c6;
}

.md-date-header-events-more {
	background: #8ca77e;
}

.md-date-footer {
	font-size: 14px;
	font-weight: 600;
	text-align: center;
	line-height: 26px;
}
Daily header/footer template

With a daily resolution, the timelineDayTemplate and dayFooterTemplate options can come in handy for customizing the header and footer.

htmlhtml<mbsc-eventcalendar
    [view]="dayView"
    [timelineDayTemplate]="dayTemp"
    [dayFooterTemplate]="dayFooterTemp">
    <ng-template #dayTemp let-day>
        <div [ngClass]="'md-date-header-day md-date-header-events-' + getEventOccurrence(day)">
            <div class="md-date-header-day-name">
                {{formatDate('DDD', day.date)}}
            </div>
            <div class="md-date-header-day-nr">
                {{formatDate('DD', day.date)}}
            </div>
        </div>
    </ng-template>
    <ng-template #dayFooterTemp let-day>
        <div class="md-date-footer">{{getOccuppancy(day.events)}} %</div>
    </ng-template>
</mbsc-eventcalendar>
tsdayView: MbscEventcalendarView = {
    timeline: {
        type: 'month'
    }
};
                            
getOccuppancy(events: any) {
    let occuppancy = 0;
    if (events) {
        var resourceIds = [];
        var nr = 0;
        for (const event of events) {
            if (resourceIds.indexOf(event.resource) < 0) {
                nr++;
                resourceIds = [...resourceIds, event.resource];
            }
        }
        occuppancy = (nr * 100 / this.myResources.length).toFixed(0);
    }
    return occuppancy;
}

getEventOccurrence(args: any): any {
    let eventOccurrence = 'none';

    if (args.events) {
        var eventNr = args.events.length;
        if (eventNr === 0) {
            eventOccurrence = 'none';
        } else if (eventNr === 1) {
            eventOccurrence = 'one';
        } else if (eventNr < 4) {
            eventOccurrence = 'few';
        } else {
            eventOccurrence = 'more';
        }
    }
    return eventOccurrence;
}
css.md-date-header-day {
    text-align: center;
    line-height: 20px;
    border-radius: 8px;
    margin: 4px;
}

.md-date-header-day-name {
    font-size: 13px;
    font-weight: 600;
}

.md-date-header-day-nr {
    font-size: 14px;
}

.md-date-header-events-one {
	background: #e9f5e4;
}

.md-date-header-events-few {
	background: #d0e3c6;
}

.md-date-header-events-more {
	background: #8ca77e;
}

.md-date-footer {
	font-size: 14px;
	font-weight: 600;
	text-align: center;
	line-height: 26px;
}
Weekly header/footer template

When the resolution is weekly, the weekTemplate and weekFooterTemplate options can be used.

htmlhtml<mbsc-eventcalendar
    [view]="weekView"
    [weekTemplate]="weekTemp"
    [weekFooterTemplate]="weekFooterTemp">
    <ng-template #weekTemp let-day>
        <div [ngClass]="'md-date-header-week md-date-header-events-' + getEventOccurrence(day)">
            {{formatDate('MMM DD', day.startDate)}} - {{formatDate('MMM DD', args.endDate)}}
        </div>
    </ng-template>
    <ng-template #weekFooterTemp let-day>
        <div class="md-date-footer">{{getOccuppancy(day.events)}} %</div>
    </ng-template>
</mbsc-eventcalendar>
tsweekView: MbscEventcalendarView = {
    timeline: {
        type: 'week',
        resolutionHorizontal: 'week',
        size: 6
    }
};
                            
getOccuppancy(events: any) {
    let occuppancy = 0;
    if (events) {
        var resourceIds = [];
        var nr = 0;
        for (const event of events) {
            if (resourceIds.indexOf(event.resource) < 0) {
                nr++;
                resourceIds = [...resourceIds, event.resource];
            }
        }
        occuppancy = (nr * 100 / this.myResources.length).toFixed(0);
    }
    return occuppancy;
}

getEventOccurrence(args: any): any {
    let eventOccurrence = 'none';

    if (args.events) {
        var eventNr = args.events.length;
        if (eventNr === 0) {
            eventOccurrence = 'none';
        } else if (eventNr === 1) {
            eventOccurrence = 'one';
        } else if (eventNr < 4) {
            eventOccurrence = 'few';
        } else {
            eventOccurrence = 'more';
        }
    }
    return eventOccurrence;
}
css.md-date-header-template .mbsc-timeline-header-week-text {
    display: block;
}

.md-date-header-template .mbsc-timeline-footer-week {
    text-align: center;
}

.md-date-header-week {
	text-align: center;
	font-weight: 600;
	color: initial;
	line-height: 20px;
	border-radius: 8px;
	margin: 3px;
}

.md-date-header-events-one {
	background: #e9f5e4;
}

.md-date-header-events-few {
	background: #d0e3c6;
}

.md-date-header-events-more {
	background: #8ca77e;
}

.md-date-footer {
	font-size: 14px;
	font-weight: 600;
	text-align: center;
	line-height: 26px;
}
Monthly header/footer template

When displaying multiple months, the monthTemplate and monthFooterTemplate options can be used for customizing the header and footer per month.

htmlhtml<mbsc-eventcalendar
    [view]="monthView"
    [monthTemplate]="monthTemp"
    [monthFooterTemplate]="monthFooterTemp">
    <ng-template #monthTemp let-day>
        <div [ngClass]="'md-date-header-month md-date-header-events-' + getEventOccurrence(day)">
            {{formatDate('MMM', day.date)}}
        </div>
    </ng-template>
    <ng-template #monthFooterTemp let-day>
        <div class="md-date-footer">{{getOccuppancy(day.events)}} %</div>
    </ng-template>
</mbsc-eventcalendar>
tsmonthView: MbscEventcalendarView = {
    timeline: {
        type: 'month',
        resolutionHorizontal: 'month',
        size: 6
    }
};
                            
getOccuppancy(events: any) {
    let occuppancy = 0;
    if (events) {
        var resourceIds = [];
        var nr = 0;
        for (const event of events) {
            if (resourceIds.indexOf(event.resource) < 0) {
                nr++;
                resourceIds = [...resourceIds, event.resource];
            }
        }
        occuppancy = (nr * 100 / this.myResources.length).toFixed(0);
    }
    return occuppancy;
}

getEventOccurrence(args: any): any {
    let eventOccurrence = 'none';

    if (args.events) {
        var eventNr = args.events.length;
        if (eventNr === 0) {
            eventOccurrence = 'none';
        } else if (eventNr === 1) {
            eventOccurrence = 'one';
        } else if (eventNr < 4) {
            eventOccurrence = 'few';
        } else {
            eventOccurrence = 'more';
        }
    }
    return eventOccurrence;
}
css.md-date-header-month {
	text-align: center;
	font-weight: 600;
	color: initial;
	line-height: 20px;
	border-radius: 8px;
	margin: 3px;
}

.md-date-header-events-one {
	background: #e9f5e4;
}

.md-date-header-events-few {
	background: #d0e3c6;
}

.md-date-header-events-more {
	background: #8ca77e;
}

.md-date-footer {
	font-size: 14px;
	font-weight: 600;
	text-align: center;
	line-height: 26px;
}
Quarter header/footer template

When displaying multiple quarters, the quarterTemplate and quarterFooterTemplate options can be used for customizing the header and footer per quarter.

htmlhtml<mbsc-eventcalendar
    [view]="quarterView"
    [quarterTemplate]="quarterTemp"
    [quarterFooterTemplate]="quarterFooterTemp">
    <ng-template #quarterTemp let-day>
        <div [ngClass]="'md-date-header-quarter md-date-header-events-' + getEventOccurrence(day)">
            Quarter {{ (day.date.getMonth() / 3 + 1) }}
        </div>
    </ng-template>
    <ng-template #quarterFooterTemp let-day>
        <div class="md-date-footer">{{getOccuppancy(day.events)}} %</div>
    </ng-template>
</mbsc-eventcalendar>
tsquarterView: MbscEventcalendarView = {
    timeline: {
        type: 'year',
        resolutionHorizontal: 'quarter',
        size: 1
    }
};
                            
getOccuppancy(events: any) {
    let occuppancy = 0;
    if (events) {
        var resourceIds = [];
        var nr = 0;
        for (const event of events) {
            if (resourceIds.indexOf(event.resource) < 0) {
                nr++;
                resourceIds = [...resourceIds, event.resource];
            }
        }
        occuppancy = (nr * 100 / this.myResources.length).toFixed(0);
    }
    return occuppancy;
}

getEventOccurrence(args: any): any {
    let eventOccurrence = 'none';

    if (args.events) {
        var eventNr = args.events.length;
        if (eventNr === 0) {
            eventOccurrence = 'none';
        } else if (eventNr === 1) {
            eventOccurrence = 'one';
        } else if (eventNr < 4) {
            eventOccurrence = 'few';
        } else {
            eventOccurrence = 'more';
        }
    }
    return eventOccurrence;
}
css.md-date-header-quarter {
	text-align: center;
	font-weight: 600;
	color: initial;
	line-height: 20px;
	border-radius: 8px;
	margin: 3px;
}

.md-date-header-events-one {
	background: #e9f5e4;
}

.md-date-header-events-few {
	background: #d0e3c6;
}

.md-date-header-events-more {
	background: #8ca77e;
}

.md-date-footer {
	font-size: 14px;
	font-weight: 600;
	text-align: center;
	line-height: 26px;
}
Yearly header/footer template

With a yearly resolution, the yearTemplate and yearFooterTemplate options can be used for customizing the header and footer.

htmlhtml<mbsc-eventcalendar
    [view]="yearView"
    [yearTemplate]="yearTemp"
    [yearFooterTemplate]="yearFooterTemp">
    <ng-template #yearTemp let-day>
        <div [ngClass]="'md-date-header-year md-date-header-events-' + getEventOccurrence(day)">
            {{formatDate('YYYY', day.date)}}
        </div>
    </ng-template>
    <ng-template #yearFooterTemp let-day>
        <div class="md-date-footer">{{getOccuppancy(day.events)}} %</div>
    </ng-template>
</mbsc-eventcalendar>
tsyearView: MbscEventcalendarView = {
    timeline: {
        type: 'year',
        resolutionHorizontal: 'year',
        size: 6
    }
};
                            
getOccuppancy(events: any) {
    let occuppancy = 0;
    if (events) {
        var resourceIds = [];
        var nr = 0;
        for (const event of events) {
            if (resourceIds.indexOf(event.resource) < 0) {
                nr++;
                resourceIds = [...resourceIds, event.resource];
            }
        }
        occuppancy = (nr * 100 / this.myResources.length).toFixed(0);
    }
    return occuppancy;
}

getEventOccurrence(args: any): any {
    let eventOccurrence = 'none';

    if (args.events) {
        var eventNr = args.events.length;
        if (eventNr === 0) {
            eventOccurrence = 'none';
        } else if (eventNr === 1) {
            eventOccurrence = 'one';
        } else if (eventNr < 4) {
            eventOccurrence = 'few';
        } else {
            eventOccurrence = 'more';
        }
    }
    return eventOccurrence;
}
css.md-date-header-year {
	text-align: center;
	font-weight: 600;
	color: initial;
	line-height: 20px;
	border-radius: 8px;
	margin: 3px;
}

.md-date-header-events-one {
	background: #e9f5e4;
}

.md-date-header-events-few {
	background: #d0e3c6;
}

.md-date-header-events-more {
	background: #8ca77e;
}

.md-date-footer {
	font-size: 14px;
	font-weight: 600;
	text-align: center;
	line-height: 26px;
}
Customize time-scale headers and add occupancy footers to a Timeline — format cells from hour to year and display per-slot utilization.

Duplicate Session

You have signed in on a different machine. To keep everything in sync, you have been signed out of this session.

If you need to invite team members, manage seats and accounts you can do it from the licenses page.

Duplicate Session

We noticed you are logged in on a different machine and have closed your old session.

If you need to invite team members, manage seats and accounts you can do it from the licenses page.