Compare Resources Fixed at Top

With the combination of the timeline view along with fixed resources and renderResource you can create a UI for comparison.

In this example resources are people with tasks. There is a button in the resource template which on click dynamically moves the resource to/from a comparison section, located at the top of the view. Compare up to 3 resources at a time, but adjust this as you like in your own implementation.

Download and try example

Demo

Loading the live demo

Preview in full screen

Use the Timeline to pin up to 3 resources to a fixed comparison section at the top — compare schedules side by side while the rest scroll below.

Code

mobiscroll.setOptions({
  locale:  ,
  theme: ' ',
  themeVariant: ' '
});

$(function () {
  var myResources = [
    {
      id: 1,
      name: 'Emma Smith',
      color: '#c8cdcf',
    },
    {
      id: 2,
      name: 'James Brown',
      color: '#76e083',
    },
    {
      id: 3,
      name: 'Olivia Miller',
      color: '#4981d6',
    },
    {
      id: 4,
      name: 'David Johnson',
      color: '#d6d145',
    },
    {
      id: 5,
      name: 'Sarah Jones',
      color: '#e25dd2',
    },
    {
      id: 6,
      name: 'Joseph Davis',
      color: '#62ab50',
    },
    {
      id: 7,
      name: 'Sophia Williams',
      color: '#eb5b34',
    },
    {
      id: 8,
      name: 'Daniel Wilson',
      color: '#7134eb',
    },
    {
      id: 9,
      name: 'Alice Clark',
      color: '#a1eb34',
    },
    {
      id: 10,
      name: 'Robert Taylor',
      color: '#9b77d9',
    },
    {
      id: 11,
      name: 'Anthony Lopez',
      color: '#6bede7',
    },
    {
      id: 12,
      name: 'Grace Moore',
      color: '#262f80',
    },
    {
      id: 13,
      name: 'Peter Jackson',
      color: '#788026',
    },
  ];

  var fixedResourceMap = {};
  var fixedNr = 0;
  var fixedResources = [];
  var resourceMap = {};
  myResources.forEach(function (r) {
    resourceMap[r.id] = r;
  });
  var inst = $('#demo-compare-resources')
    .mobiscroll()
    .eventcalendar({
      view: {
        timeline: {
          type: 'week',
          resolutionHorizontal: 'hour',
          startTime: '09:00',
          endTime: '17:00',
          startDay: 1,
          endDay: 5,
        },
      },
      dragToMove: true,
      data: [
        {
          start: '2026-10-22T09:00',
          end: '2026-10-22T12:00',
          title: 'Task 1',
          resource: 1,
        },
        {
          start: '2026-10-22T15:00',
          end: '2026-10-22T17:00',
          title: 'Task 2',
          resource: 1,
        },
        {
          start: '2026-10-21T11:00',
          end: '2026-10-21T16:00',
          title: 'Task 3',
          resource: 1,
        },
        {
          start: '2026-10-23T14:00',
          end: '2026-10-23T17:00',
          title: 'Task 4',
          resource: 1,
        },
        {
          start: '2026-10-24T09:00',
          end: '2026-10-24T14:00',
          title: 'Task 5',
          resource: 1,
        },
        {
          start: '2026-10-22T12:00',
          end: '2026-10-22T17:00',
          title: 'Task 6',
          resource: 2,
        },
        {
          start: '2026-10-23T09:00',
          end: '2026-10-23T14:00',
          title: 'Task 7',
          resource: 2,
        },
        {
          start: '2026-10-21T09:00',
          end: '2026-10-21T16:00',
          title: 'Task 8',
          resource: 2,
        },
        {
          start: '2026-10-24T09:00',
          end: '2026-10-24T11:00',
          title: 'Task 9',
          resource: 2,
        },
        {
          start: '2026-10-24T13:00',
          end: '2026-10-24T17:00',
          title: 'Task 10',
          resource: 2,
        },
        {
          start: '2026-10-22T10:00',
          end: '2026-10-22T14:00',
          title: 'Task 11',
          resource: 3,
        },
        {
          start: '2026-10-22T15:00',
          end: '2026-10-22T17:00',
          title: 'Task 12',
          resource: 3,
        },
        {
          start: '2026-10-23T09:00',
          end: '2026-10-23T13:00',
          title: 'Task 13',
          resource: 3,
        },
        {
          start: '2026-10-24T09:00',
          end: '2026-10-24T10:00',
          title: 'Task 14',
          resource: 3,
        },
        {
          start: '2026-10-24T14:00',
          end: '2026-10-24T16:00',
          title: 'Task 15',
          resource: 3,
        },
        {
          start: '2026-10-22T14:00',
          end: '2026-10-22T17:00',
          title: 'Task 16',
          resource: 4,
        },
        {
          start: '2026-10-21T09:00',
          end: '2026-10-21T14:00',
          title: 'Task 17',
          resource: 4,
        },
        {
          start: '2026-10-23T10:00',
          end: '2026-10-23T12:00',
          title: 'Task 18',
          resource: 4,
        },
        {
          start: '2026-10-23T14:00',
          end: '2026-10-23T17:00',
          title: 'Task 19',
          resource: 4,
        },
        {
          start: '2026-10-24T10:09',
          end: '2026-10-24T11:17',
          title: 'Task 20',
          resource: 4,
        },
        {
          start: '2026-10-22T12:00',
          end: '2026-10-22T15:00',
          title: 'Task 21',
          resource: 5,
        },
        {
          start: '2026-10-22T16:00',
          end: '2026-10-22T17:00',
          title: 'Task 22',
          resource: 5,
        },
        {
          start: '2026-10-21T11:00',
          end: '2026-10-21T15:00',
          title: 'Task 23',
          resource: 5,
        },
        {
          start: '2026-10-23T09:00',
          end: '2026-10-23T12:00',
          title: 'Task 24',
          resource: 5,
        },
        {
          start: '2026-10-24T11:00',
          end: '2026-10-24T16:00',
          title: 'Task 25',
          resource: 5,
        },
        {
          start: '2026-10-22T12:00',
          end: '2026-10-22T17:00',
          title: 'Task 26',
          resource: 6,
        },
        {
          start: '2026-10-21T10:00',
          end: '2026-10-21T14:00',
          title: 'Task 27',
          resource: 6,
        },
        {
          start: '2026-10-23T09:00',
          end: '2026-10-23T11:00',
          title: 'Task 28',
          resource: 6,
        },
        {
          start: '2026-10-23T14:00',
          end: '2026-10-23T15:00',
          title: 'Task 29',
          resource: 6,
        },
        {
          start: '2026-10-24T16:00',
          end: '2026-10-24T17:00',
          title: 'Task 30',
          resource: 6,
        },
        {
          start: '2026-10-21T15:00',
          end: '2026-10-21T17:00',
          title: 'Task 31',
          resource: 7,
        },
        {
          start: '2026-10-23T09:00',
          end: '2026-10-23T12:00',
          title: 'Task 32',
          resource: 7,
        },
        {
          start: '2026-10-23T13:00',
          end: '2026-10-23T17:00',
          title: 'Task 33',
          resource: 7,
        },
        {
          start: '2026-10-24T14:00',
          end: '2026-10-24T17:00',
          title: 'Task 34',
          resource: 7,
        },
        {
          start: '2026-10-22T10:00',
          end: '2026-10-22T12:00',
          title: 'Task 35',
          resource: 8,
        },
        {
          start: '2026-10-22T14:00',
          end: '2026-10-22T17:00',
          title: 'Task 36',
          resource: 8,
        },
        {
          start: '2026-10-23T10:00',
          end: '2026-10-23T14:00',
          title: 'Task 37',
          resource: 8,
        },
        {
          start: '2026-10-24T09:00',
          end: '2026-10-24T16:00',
          title: 'Task 38',
          resource: 8,
        },
        {
          start: '2026-10-22T09:00',
          end: '2026-10-22T17:00',
          title: 'Task 39',
          resource: 9,
        },
        {
          start: '2026-10-23T09:00',
          end: '2026-10-23T13:00',
          title: 'Task 40',
          resource: 9,
        },
        {
          start: '2026-10-23T14:00',
          end: '2026-10-23T17:00',
          title: 'Task 41',
          resource: 9,
        },
        {
          start: '2026-10-21T10:00',
          end: '2026-10-21T14:00',
          title: 'Task 42',
          resource: 9,
        },
        {
          start: '2026-10-22T10:00',
          end: '2026-10-22T15:00',
          title: 'Task 43',
          resource: 10,
        },
        {
          start: '2026-10-21T09:00',
          end: '2026-10-21T13:00',
          title: 'Work order #41989',
          resource: 10,
        },
        {
          start: '2026-10-23T09:00',
          end: '2026-10-23T17:00',
          title: 'Task 44',
          resource: 10,
        },
        {
          start: '2026-10-24T09:00',
          end: '2026-10-24T13:00',
          title: 'Task 45',
          resource: 10,
        },
        {
          start: '2026-10-24T14:00',
          end: '2026-10-24T17:00',
          title: 'Task 46',
          resource: 10,
        },
        {
          start: '2026-10-24T09:00',
          end: '2026-10-24T17:00',
          title: 'Task 47',
          resource: 11,
        },
        {
          start: '2026-10-21T12:00',
          end: '2026-10-21T17:00',
          title: 'Task 48',
          resource: 11,
        },
        {
          start: '2026-10-22T09:00',
          end: '2026-10-22T15:00',
          title: 'Task 49',
          resource: 12,
        },
        {
          start: '2026-10-24T11:00',
          end: '2026-10-24T17:00',
          title: 'Task 50',
          resource: 12,
        },
        {
          start: '2026-10-22T11:00',
          end: '2026-10-22T15:00',
          title: 'Task 51',
          resource: 13,
        },
        {
          start: '2026-10-23T09:00',
          end: '2026-10-23T17:00',
          title: 'Task 52',
          resource: 13,
        },
      ],
      resources: myResources,
      renderResource: function (r) {
        return (
          '<div class="md-compare-resource mbsc-flex mbsc-align-items-center mbsc-justify-content-between"><div>' +
          r.name +
          '</div>' +
          (r.fixed || (!r.fixed && fixedNr <= 2)
            ? '<button mbsc-button class="md-compare-button" data-color=' +
              (r.fixed ? 'danger' : 'success') +
              ' data-variant="outline" data-id=' +
              r.id +
              '>' +
              (r.fixed ? 'Remove' : 'Compare') +
              '</button>'
            : '') +
          '</div>'
        );
      },
    })
    .mobiscroll('getInst');

  $('#demo-compare-resources').on('click', '.md-compare-button', function () {
    var id = +$(this).data('id');
    var isFixed = fixedResourceMap[id];
    var resource = resourceMap[id];
    if (!isFixed) {
      fixedNr++;
      fixedResourceMap[id] = true;
      resource.fixed = true;
      fixedResources.push(resource);
      if (fixedNr > 2) {
        mobiscroll.toast({
          message: 'Comparing up to 3 schedules',
        });
      }
    } else {
      fixedNr--;
      fixedResourceMap[id] = false;
      resource.fixed = false;
      fixedResources = fixedResources.filter(function (r) {
        return r.id !== id;
      });
    }
    var result = fixedResources.slice(0);
    myResources.forEach(function (r) {
      if (!fixedResourceMap[r.id]) {
        result.push(r);
      }
    });
    inst.setOptions({ resources: result });
  });
});
  

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.