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 hour and hourFooter options can be used for customizing the header and footer.

<script setup>
const hourView = {
  timeline: {
    type: 'day'
  }
}

function getOccuppancy(events) {
  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
}

function getEventOccurrence(args) {
  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
}
</script>

<template>
  <MbscEventcalendar :view="hourView">
  <template #hour="day">
    <div :class="'md-date-header-hour md-date-header-events-' + getEventOccurrence(day)">
      {{ formatDate('h:mm A', day.date) }}
    </div>
  </template>
  <template #hourFooter="day">
    <div class="md-date-footer">{{ getOccuppancy(day.events) }}</div>
  </template>
  </MbscEventcalendar>
</template>
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 timelineDay and dayFooter options can come in handy for customizing the header and footer.

<script setup>
const dayView = {
  timeline: {
    type: 'month'
  }
}

function getOccuppancy(events) {
  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
}

function getEventOccurrence(args) {
  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
}
</script>

<template>
  <MbscEventcalendar :view="dayView">
    <template #timelineDay="day">
      <div :class="'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>
    </template>
    <template #dayFooter="day">
      <div class="md-date-footer">{{ getOccuppancy(day.events) }}</div>
    </template>
  </MbscEventcalendar>
</template>
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 week and weekFooter options can be used.

<script setup>
const weekView = {
  timeline: {
    type: 'week',
    resolutionHorizontal: 'week',
    size: 6
  }
}

function getOccuppancy(events) {
  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
}

function getEventOccurrence(args) {
  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
}
</script>

<template>
  <MbscEventcalendar :view="weekView">
    <template #week="day">
      <div :class="'md-date-header-week md-date-header-events-' + getEventOccurrence(day)">
        {{ formatDate('MMM DD', day.date) }}
      </div>
    </template>
    <template #weekFooter="day">
      <div class="md-date-footer">{{ getOccuppancy(day.events) }}</div>
    </template>
  </MbscEventcalendar>
</template>
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 month and monthFooter options can be used for customizing the header and footer per month.

<script setup>
const monthView = {
  timeline: {
    type: 'month',
    resolutionHorizontal: 'month',
    size: 6
  }
}

function getOccuppancy(events) {
  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
}

function getEventOccurrence(args) {
  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
}
</script>

<template>
  <MbscEventcalendar :view="monthView">
    <template #month="day">
      <div :class=" 'md-date-header-month md-date-header-events-' + getEventOccurrence(day)">
        {{ formatDate('MMM', day.startDate) + ' - ' + formatDate('MMM', day.endDate) }}
      </div>
    </template>
    <template #monthFooter="day">
      <div class="md-date-footer">{{ getOccuppancy(day.events) }}</div>
    </template>
  </MbscEventcalendar>
</template>
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 quarter and quarterFooter options can be used for customizing the header and footer per quarter.

<script setup>
const quarterView = {
  timeline: {
    type: 'year',
    resolutionHorizontal: 'quarter',
    size: 1
  }
}

function getOccuppancy(events) {
  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
}

function getEventOccurrence(args) {
  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
}
</script>

<template>
  <MbscEventcalendar :view="quarterView">
    <template #quarter="day">
      <div :class=" 'md-date-header-quarter md-date-header-events-' + getEventOccurrence(day)">
        Quarter {{ (day.date.getMonth() / 3 + 1) }}
      </div>
    </template>
    <template #quarterFooter="day">
      <div class="md-date-footer">{{ getOccuppancy(day.events) }}</div>
    </template>
  </MbscEventcalendar>
</template>
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 year and yearFooter options can be used for customizing the header and footer.

<script setup>
const yearView = {
  timeline: {
    type: 'year',
    resolutionHorizontal: 'year',
    size: 6
  }
}

function getOccuppancy(events) {
  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
}

function getEventOccurrence(args) {
  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
}
</script>

<template>
  <MbscEventcalendar :view="yearView">
    <template #year="day">
      <div :class="'md-date-header-year md-date-header-events-' + getEventOccurrence(day)">
        {{ formatDate('YYYY', day.date) }}
      </div>
    </template>
    <template #yearFooter="day">
      <div class="md-date-footer">{{ getOccuppancy(day.events) }}</div>
    </template>
  </MbscEventcalendar>
</template>
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.