Angular Scheduler Multi-Resource Shared Events
Get started with this exampleUsage
theme: 'ios' You can turn auto theming on and let it decide based on the platform.
Usage
themeVariant: 'light' You can turn auto dark mode on based on system settings.
Usage
clickToCreate: true,
// click to create is on dragToCreate: true,
// drag to create is on dragToMove: true,
// reordering is on dragToResize: true,
// resizing is on eventDelete: true
// deleting is on Fine-tune drag & drop with these options, which are false by default.
Usage
locale: localeEn Selecting the locale loads the localized settings and the translated UI text.
Multi-Resource Shared Events
Events can be shared among resources. This can easily be the same resource type, like people in a shared work calendar scenario or different resource types, like aircraft and instructor in a flight training scenario where you'll have to schedule an instructor and an aircraft for a class which is the event.
Shared events will render correctly in the appropriate resource columns with drag & drop, validation across invalid dates and times will work out of the box. All you need to do is to add both resourceIDs to the event.
Demo

Code
import { CommonModule } from '@angular/common';
import { Component, ViewChild } from '@angular/core';
import { FormsModule } from '@angular/forms';
import {
MbscCalendarEvent,
MbscEventcalendarView,
MbscEventClickEvent,
MbscEventCreatedEvent,
MbscModule,
MbscPopup,
MbscPopupButton,
MbscPopupOptions,
MbscPopupPredefinedButton,
setOptions ,
} from '@mobiscroll/angular';
setOptions({
locale: ,
theme: ' ',
themeVariant: ' '
});
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
standalone: true,
imports: [CommonModule, FormsModule, MbscModule],
})
export class AppComponent {
@ViewChild('popup', { static: false })
popup!: MbscPopup;
tempEvent!: MbscCalendarEvent;
title = '';
participants = [];
anchor: HTMLElement | undefined;
isNewEvent = false;
view: MbscEventcalendarView = {
scheduler: {
type: 'week',
allDay: false,
startDay: 1,
endDay: 5,
startTime: '05:00',
endTime: '22:00',
},
};
myEvents: MbscCalendarEvent[] = [
{
start: '2026-11-06T10:00',
end: '2026-11-06T15:00',
title: 'Impact Training',
resource: [2, 3],
color: '#35bb5a',
},
{
start: '2026-11-07T10:00',
end: '2026-11-07T15:00',
title: 'Impact Training',
resource: [2, 3],
color: '#35bb5a',
},
{
start: '2026-11-09T08:30',
end: '2026-11-09T10:00',
title: 'Quick mtg. with Martin',
resource: 3,
color: '#913aa7',
},
{
start: '2026-11-09T12:00',
end: '2026-11-09T13:00',
title: 'General orientation',
resource: [1, 2, 3],
color: '#a71111',
},
{
start: '2026-11-10T10:00',
end: '2026-11-10T11:00',
title: 'Product team mtg.',
resource: [2, 3],
color: '#6e7f29',
},
{
start: '2026-11-11T14:00',
end: '2026-11-11T16:00',
title: 'Stakeholder mtg.',
resource: 1,
color: '#dcd234',
},
{
start: '2026-11-12T10:00',
end: '2026-11-12T14:00',
title: 'Innovation mtg.',
resource: [1, 2],
color: '#de3d83',
},
];
myResources = [
{
id: 1,
name: 'Ryan',
color: '#f7c4b4',
},
{
id: 2,
name: 'Kate',
color: '#c6f1c9',
},
{
id: 3,
name: 'John',
color: '#e8d0ef',
},
];
popupOptions: MbscPopupOptions = {
display: 'anchored',
contentPadding: false,
touchUi: false,
width: 350,
};
buttons: (MbscPopupButton | MbscPopupPredefinedButton)[] = [
'cancel',
{
text: 'OK',
keyCode: 'enter',
handler: () => {
this.tempEvent.resource = this.participants;
this.tempEvent.title = this.title;
if (this.isNewEvent) {
this.myEvents = [...this.myEvents, this.tempEvent];
} else {
this.myEvents = [...this.myEvents];
}
this.isNewEvent = false;
this.popup.close();
},
cssClass: 'mbsc-popup-button-primary',
},
];
showPopup(args: any): void {
setTimeout(() => {
const event = args.event;
const resources = Array.isArray(event.resource) ? event.resource : [event.resource];
// Store temporary event
this.tempEvent = event;
// Fill popup with the current event data
this.title = event.title;
this.participants = resources;
// Set anchor for the popup
this.anchor = args.target ? args.target : args.domEvent.target;
this.popup.open();
});
}
onEventCreated(args: MbscEventCreatedEvent): void {
this.isNewEvent = true;
this.showPopup(args);
}
onEventDoubleClick(args: MbscEventClickEvent): void {
this.isNewEvent = false;
this.showPopup(args);
}
extendDefaultEvent(): MbscCalendarEvent {
return { color: '#4a9e42' };
}
onClose(): void {
if (this.isNewEvent) {
this.myEvents = this.myEvents.filter((item) => item.id !== this.tempEvent.id);
}
}
}
<mbsc-eventcalendar
[view]="view"
[data]="myEvents"
[resources]="myResources"
[clickToCreate]="true"
[dragToCreate]="true"
[dragToMove]="true"
[dragToResize]="true"
(onEventDoubleClick)="onEventDoubleClick($event)"
(onEventCreated)="onEventCreated($event)"
[extendDefaultEvent]="extendDefaultEvent"
>
</mbsc-eventcalendar>
<mbsc-popup [options]="popupOptions" [anchor]="anchor" [buttons]="buttons" #popup (onClose)="onClose()">
<div class="mbsc-form-group">
<mbsc-input [(ngModel)]="title" label="Title" input-style="box" label-style="stacked"></mbsc-input>
<div class="mbsc-padding">
<span class="mbsc-txt-muted">Select event participants</span>
</div>
<mbsc-segmented-group select="multiple" [(ngModel)]="participants">
<mbsc-segmented [value]="1">Ryan</mbsc-segmented>
<mbsc-segmented [value]="2">Kate</mbsc-segmented>
<mbsc-segmented [value]="3">John</mbsc-segmented>
</mbsc-segmented-group>
</div>
</mbsc-popup>