Implementing Syncfusion TypeScript Scheduler
A comprehensive skill for implementing the Syncfusion EJ2 TypeScript Schedule (Scheduler) component — a full-featured calendar and appointment management UI supporting multiple views, recurring events, resource grouping, drag-and-drop, inline editing, and data export.
When to Use This Skill
- Setting up and initializing the Scheduler in a TypeScript project
- Configuring calendar views (Day, Week, WorkWeek, Month, Year, Agenda, Timeline variants)
- Binding local or remote appointment data to the Scheduler
- Implementing CRUD (create, read, update, delete) for events
- Working with recurring events and the RecurrenceEditor
- Configuring multiple resources and grouped views
- Customizing the event editor popup or quick info templates
- Exporting Scheduler data to Excel, CSV, or iCalendar (.ics)
- Handling timezones for global user bases
- Styling, theming, and accessibility compliance
Documentation and Navigation Guide
Getting Started & Module Injection
📄 Read: references/getting-started.md
- Package dependencies and npm installation
- CSS imports and theme configuration
- Module injection with
Schedule.Inject()
- Initializing the Scheduler and appending to DOM
- Populating appointments with
eventSettings.dataSource
- Setting
selectedDate and currentView
- Individual per-view configuration with
views array
Views Configuration
📄 Read: references/views.md
- All 12 view types and their module requirements
- Per-view options (startHour, endHour, timeScale, showWeekend, etc.)
- Extended views using
interval and displayName
- Timeline view orientations and Agenda view options
Appointments & Recurring Events
📄 Read: references/appointments.md
- Normal, spanned, all-day, and recurring event types
- iCal
RecurrenceRule string syntax (FREQ, BYDAY, COUNT, UNTIL, etc.)
- Recurrence exceptions and editing individual/following occurrences
- Built-in event fields reference table
- Custom field mapping via
eventSettings.fields
- Preventing overlaps with
allowOverlap, custom ordering with sortComparer
Data Binding
📄 Read: references/data-binding.md
- Local JSON array binding via
eventSettings.dataSource
- Remote binding with
DataManager and ODataV4Adaptor
- AJAX loading pattern using
ej2-base Ajax
- Server-side date range filtering with
includeFiltersInQuery
- Passing query parameters with
eventSettings.query
- Google Calendar API integration via
dataBinding event
CRUD Actions
📄 Read: references/crud-actions.md
- Creating events via editor, quick popup, or
addEvent() method
- Updating and deleting with
saveEvent() and deleteEvent()
- Server-side CRUD using
UrlAdaptor + crudUrl
- Field validation with
validation property (required, regex)
actionBegin / actionComplete lifecycle events
- Enabling read-only mode
Editor Template & Quick Info
📄 Read: references/editor-template.md
- Customizing default editor fields via
popupOpen
- Full editor replacement with
editorTemplate
editorHeaderTemplate and editorFooterTemplate
- Custom quick info popups with
quickInfoTemplates
showQuickInfo toggle and closeEditor() method
- Custom timezone dropdown via
timezoneDataSource
Resources & Grouping
📄 Read: references/resources.md
- Defining resources with
resources property and field mappings
- Single and multi-level grouping via
group.resources
- Date-based grouping with
group.byDate
allowMultiple for multi-resource event assignment
- Resource-specific working hours, colors, and CSS classes
- Expandable resource rows in Timeline views
Working Days, Hours & Timescale
📄 Read: references/working-days-timescale.md
workDays, showWeekend, showWeekNumber, firstDayOfWeek
workHours highlight, start, and end configuration
startHour / endHour for visible time range
timeScale with interval and slotCount
- Major/minor slot templates
scrollTo() for programmatic time scroll
Cell, Header & View Customization
📄 Read: references/cell-header-customization.md
cellTemplate with elementType conditions
renderCell event for targeted cell modifications
cellHeaderTemplate for Month view date headers
- Header bar:
showHeaderBar, toolbarItems, dateHeaderTemplate
- Timeline
headerRows property for Year/Month/Week/Date/Hour rows
minDate / maxDate for date range restrictions
Exporting & Printing
📄 Read: references/exporting.md
exportToExcel() with ExportOptions (fileName, fields, customData, etc.)
- CSV export via
exportType: 'csv'
excelExport event for pre-export customization
exportToICalendar() to .ics format
importICalendar() from a file Blob
print() method with beforePrint event
Timezone Handling
📄 Read: references/timezone.md
timezone property (IANA timezone string)
- Per-event
StartTimezone / EndTimezone fields
Timezone utility class: offset(), convert(), add(), remove()
- Customizing the timezone dropdown with
timezoneData
- UTC mode for global/multi-region teams
Recurrence Editor
📄 Read: references/recurrence-editor.md
- Standalone
RecurrenceEditor component setup
frequencies and endTypes property configuration
change event for getting generated rule string
setRecurrenceRule() and getRecurrenceDates() methods
Styling & Theming
📄 Read: references/scheduler-styling.md
- CSS class selector reference for all Scheduler elements
- View-scoped selectors (
.e-vertical-view, .e-month-view, etc.)
- State classes: selected cells, selected appointments
- Resource row selectors for Timeline views
- Block and read-only appointment styles
Advanced Features
📄 Read: references/advanced-features.md
- Context menu integration with
ContextMenu
- Clipboard:
allowClipboard, cut(), copy(), paste(), beforePaste event
- Virtual scrolling with
allowVirtualScrolling and enableLazyLoading
rowAutoHeight for Timeline and Month views
- State persistence with
enablePersistence
- Islamic/Hijri calendar via
calendarMode: 'Islamic'
- Scheduler dimensions:
height and width
- Accessibility, WCAG 2.2, keyboard shortcuts
Quick Start
import { Schedule, Day, Week, WorkWeek, Month, Agenda } from '@syncfusion/ej2-schedule';
// Inject required view modules
Schedule.Inject(Day, Week, WorkWeek, Month, Agenda);
let scheduleObj: Schedule = new Schedule({
height: '550px',
selectedDate: new Date(2018, 1, 15),
currentView: 'Week',
eventSettings: {
dataSource: [
{
Id: 1,
Subject: 'Team Meeting',
StartTime: new Date(2018, 1, 15, 10, 0),
EndTime: new Date(2018, 1, 15, 12, 0)
}
]
}
});
scheduleObj.appendTo('#Schedule');
/* In styles.css */
@import '../../node_modules/@syncfusion/ej2-base/styles/fluent2.css';
@import '../../node_modules/@syncfusion/ej2-buttons/styles/fluent2.css';
@import '../../node_modules/@syncfusion/ej2-calendars/styles/fluent2.css';
@import '../../node_modules/@syncfusion/ej2-dropdowns/styles/fluent2.css';
@import '../../node_modules/@syncfusion/ej2-inputs/styles/fluent2.css';
@import '../../node_modules/@syncfusion/ej2-navigations/styles/fluent2.css';
@import '../../node_modules/@syncfusion/ej2-popups/styles/fluent2.css';
@import '../../node_modules/@syncfusion/ej2-schedule/styles/fluent2.css';
Common Patterns
Pattern 1: Switch to Month View with Weekend Hidden
import { Schedule, Month } from '@syncfusion/ej2-schedule';
Schedule.Inject(Month);
let scheduleObj: Schedule = new Schedule({
height: '550px',
currentView: 'Month',
showWeekend: false,
eventSettings: { dataSource: [...] }
});
scheduleObj.appendTo('#Schedule');
Pattern 2: Custom Field Names
let scheduleObj: Schedule = new Schedule({
height: '550px',
eventSettings: {
dataSource: myData,
fields: {
id: 'EventId',
subject: { name: 'Title' },
startTime: { name: 'From' },
endTime: { name: 'To' },
isAllDay: { name: 'AllDay' }
}
}
});
scheduleObj.appendTo('#Schedule');
Pattern 3: Programmatic Event Creation
let eventData: Object = {
Id: 10,
Subject: 'New Event',
StartTime: new Date(2018, 1, 15, 14, 0),
EndTime: new Date(2018, 1, 15, 16, 0)
};
scheduleObj.addEvent(eventData);
Pattern 4: Resource-Grouped Timeline
import { Schedule, TimelineViews } from '@syncfusion/ej2-schedule';
Schedule.Inject(TimelineViews);
let scheduleObj: Schedule = new Schedule({
height: '550px',
currentView: 'TimelineWeek',
group: { resources: ['Rooms'] },
resources: [{
field: 'RoomId',
title: 'Room',
name: 'Rooms',
dataSource: [
{ RoomText: 'Room 1', Id: 1, RoomColor: '#cb6bb2' },
{ RoomText: 'Room 2', Id: 2, RoomColor: '#56ca85' }
],
textField: 'RoomText',
idField: 'Id',
colorField: 'RoomColor'
}],
eventSettings: { dataSource: [...] }
});
scheduleObj.appendTo('#Schedule');
Key Properties Reference
| Property |
Type |
Description |
height |
string |
Scheduler height ('550px', '100%', 'auto') |
width |
string |
Scheduler width |
selectedDate |
Date |
Currently displayed date |
currentView |
string |
Active view name |
views |
ViewsModel[] |
Per-view configuration array |
eventSettings |
EventSettingsModel |
Data source and field mappings |
group |
GroupModel |
Resource grouping configuration |
resources |
ResourcesModel[] |
Resource definitions |
workDays |
number[] |
Days of week to show (0=Sun–6=Sat) |
workHours |
WorkHoursModel |
Work hour highlight and range |
showWeekend |
boolean |
Show/hide Saturday and Sunday |
timezone |
string |
IANA timezone string for display |
enablePersistence |
boolean |
Persist state in localStorage |
readonly |
boolean |
Disable all CRUD interactions |
allowClipboard |
boolean |
Enable cut/copy/paste for events |
1---2name: syncfusion-javascript-scheduler3description: Implement the Syncfusion Essential JS 2 TypeScript Scheduler (Schedule) component for event and appointment management. Use this when working with scheduling interfaces, calendar views, appointment CRUD operations, or resource management. This skill covers scheduler setup, views configuration, appointments handling, recurring events, resource scheduling, timeline views, editor templates, exporting functionality, timezone support, styling, and accessibility features.4---56# Implementing Syncfusion TypeScript Scheduler78A comprehensive skill for implementing the Syncfusion EJ2 TypeScript **Schedule** (Scheduler) component — a full-featured calendar and appointment management UI supporting multiple views, recurring events, resource grouping, drag-and-drop, inline editing, and data export.910## When to Use This Skill1112- Setting up and initializing the Scheduler in a TypeScript project13- Configuring calendar views (Day, Week, WorkWeek, Month, Year, Agenda, Timeline variants)14- Binding local or remote appointment data to the Scheduler15- Implementing CRUD (create, read, update, delete) for events16- Working with recurring events and the RecurrenceEditor17- Configuring multiple resources and grouped views18- Customizing the event editor popup or quick info templates19- Exporting Scheduler data to Excel, CSV, or iCalendar (.ics)20- Handling timezones for global user bases21- Styling, theming, and accessibility compliance2223---2425## Documentation and Navigation Guide2627### Getting Started & Module Injection28📄 **Read:** [references/getting-started.md](references/getting-started.md)29- Package dependencies and npm installation30- CSS imports and theme configuration31- Module injection with `Schedule.Inject()`32- Initializing the Scheduler and appending to DOM33- Populating appointments with `eventSettings.dataSource`34- Setting `selectedDate` and `currentView`35- Individual per-view configuration with `views` array3637### Views Configuration38📄 **Read:** [references/views.md](references/views.md)39- All 12 view types and their module requirements40- Per-view options (startHour, endHour, timeScale, showWeekend, etc.)41- Extended views using `interval` and `displayName`42- Timeline view orientations and Agenda view options4344### Appointments & Recurring Events45📄 **Read:** [references/appointments.md](references/appointments.md)46- Normal, spanned, all-day, and recurring event types47- iCal `RecurrenceRule` string syntax (FREQ, BYDAY, COUNT, UNTIL, etc.)48- Recurrence exceptions and editing individual/following occurrences49- Built-in event fields reference table50- Custom field mapping via `eventSettings.fields`51- Preventing overlaps with `allowOverlap`, custom ordering with `sortComparer`5253### Data Binding54📄 **Read:** [references/data-binding.md](references/data-binding.md)55- Local JSON array binding via `eventSettings.dataSource`56- Remote binding with `DataManager` and `ODataV4Adaptor`57- AJAX loading pattern using `ej2-base Ajax`58- Server-side date range filtering with `includeFiltersInQuery`59- Passing query parameters with `eventSettings.query`60- Google Calendar API integration via `dataBinding` event6162### CRUD Actions63📄 **Read:** [references/crud-actions.md](references/crud-actions.md)64- Creating events via editor, quick popup, or `addEvent()` method65- Updating and deleting with `saveEvent()` and `deleteEvent()`66- Server-side CRUD using `UrlAdaptor` + `crudUrl`67- Field validation with `validation` property (required, regex)68- `actionBegin` / `actionComplete` lifecycle events69- Enabling read-only mode7071### Editor Template & Quick Info72📄 **Read:** [references/editor-template.md](references/editor-template.md)73- Customizing default editor fields via `popupOpen`74- Full editor replacement with `editorTemplate`75- `editorHeaderTemplate` and `editorFooterTemplate`76- Custom quick info popups with `quickInfoTemplates`77- `showQuickInfo` toggle and `closeEditor()` method78- Custom timezone dropdown via `timezoneDataSource`7980### Resources & Grouping81📄 **Read:** [references/resources.md](references/resources.md)82- Defining resources with `resources` property and field mappings83- Single and multi-level grouping via `group.resources`84- Date-based grouping with `group.byDate`85- `allowMultiple` for multi-resource event assignment86- Resource-specific working hours, colors, and CSS classes87- Expandable resource rows in Timeline views8889### Working Days, Hours & Timescale90📄 **Read:** [references/working-days-timescale.md](references/working-days-timescale.md)91- `workDays`, `showWeekend`, `showWeekNumber`, `firstDayOfWeek`92- `workHours` highlight, start, and end configuration93- `startHour` / `endHour` for visible time range94- `timeScale` with `interval` and `slotCount`95- Major/minor slot templates96- `scrollTo()` for programmatic time scroll9798### Cell, Header & View Customization99📄 **Read:** [references/cell-header-customization.md](references/cell-header-customization.md)100- `cellTemplate` with `elementType` conditions101- `renderCell` event for targeted cell modifications102- `cellHeaderTemplate` for Month view date headers103- Header bar: `showHeaderBar`, `toolbarItems`, `dateHeaderTemplate`104- Timeline `headerRows` property for Year/Month/Week/Date/Hour rows105- `minDate` / `maxDate` for date range restrictions106107### Exporting & Printing108📄 **Read:** [references/exporting.md](references/exporting.md)109- `exportToExcel()` with `ExportOptions` (fileName, fields, customData, etc.)110- CSV export via `exportType: 'csv'`111- `excelExport` event for pre-export customization112- `exportToICalendar()` to `.ics` format113- `importICalendar()` from a file Blob114- `print()` method with `beforePrint` event115116### Timezone Handling117📄 **Read:** [references/timezone.md](references/timezone.md)118- `timezone` property (IANA timezone string)119- Per-event `StartTimezone` / `EndTimezone` fields120- `Timezone` utility class: `offset()`, `convert()`, `add()`, `remove()`121- Customizing the timezone dropdown with `timezoneData`122- UTC mode for global/multi-region teams123124### Recurrence Editor125📄 **Read:** [references/recurrence-editor.md](references/recurrence-editor.md)126- Standalone `RecurrenceEditor` component setup127- `frequencies` and `endTypes` property configuration128- `change` event for getting generated rule string129- `setRecurrenceRule()` and `getRecurrenceDates()` methods130131### Styling & Theming132📄 **Read:** [references/scheduler-styling.md](references/scheduler-styling.md)133- CSS class selector reference for all Scheduler elements134- View-scoped selectors (`.e-vertical-view`, `.e-month-view`, etc.)135- State classes: selected cells, selected appointments136- Resource row selectors for Timeline views137- Block and read-only appointment styles138139### Advanced Features140📄 **Read:** [references/advanced-features.md](references/advanced-features.md)141- Context menu integration with `ContextMenu`142- Clipboard: `allowClipboard`, `cut()`, `copy()`, `paste()`, `beforePaste` event143- Virtual scrolling with `allowVirtualScrolling` and `enableLazyLoading`144- `rowAutoHeight` for Timeline and Month views145- State persistence with `enablePersistence`146- Islamic/Hijri calendar via `calendarMode: 'Islamic'`147- Scheduler dimensions: `height` and `width`148- Accessibility, WCAG 2.2, keyboard shortcuts149150---151152## Quick Start153154```typescript155import { Schedule, Day, Week, WorkWeek, Month, Agenda } from '@syncfusion/ej2-schedule';156157// Inject required view modules158Schedule.Inject(Day, Week, WorkWeek, Month, Agenda);159160let scheduleObj: Schedule = new Schedule({161 height: '550px',162 selectedDate: new Date(2018, 1, 15),163 currentView: 'Week',164 eventSettings: {165 dataSource: [166 {167 Id: 1,168 Subject: 'Team Meeting',169 StartTime: new Date(2018, 1, 15, 10, 0),170 EndTime: new Date(2018, 1, 15, 12, 0)171 }172 ]173 }174});175scheduleObj.appendTo('#Schedule');176```177178```css179/* In styles.css */180@import '../../node_modules/@syncfusion/ej2-base/styles/fluent2.css';181@import '../../node_modules/@syncfusion/ej2-buttons/styles/fluent2.css';182@import '../../node_modules/@syncfusion/ej2-calendars/styles/fluent2.css';183@import '../../node_modules/@syncfusion/ej2-dropdowns/styles/fluent2.css';184@import '../../node_modules/@syncfusion/ej2-inputs/styles/fluent2.css';185@import '../../node_modules/@syncfusion/ej2-navigations/styles/fluent2.css';186@import '../../node_modules/@syncfusion/ej2-popups/styles/fluent2.css';187@import '../../node_modules/@syncfusion/ej2-schedule/styles/fluent2.css';188```189190---191192## Common Patterns193194### Pattern 1: Switch to Month View with Weekend Hidden195```typescript196import { Schedule, Month } from '@syncfusion/ej2-schedule';197198Schedule.Inject(Month);199let scheduleObj: Schedule = new Schedule({200 height: '550px',201 currentView: 'Month',202 showWeekend: false,203 eventSettings: { dataSource: [...] }204});205scheduleObj.appendTo('#Schedule');206```207208### Pattern 2: Custom Field Names209```typescript210let scheduleObj: Schedule = new Schedule({211 height: '550px',212 eventSettings: {213 dataSource: myData,214 fields: {215 id: 'EventId',216 subject: { name: 'Title' },217 startTime: { name: 'From' },218 endTime: { name: 'To' },219 isAllDay: { name: 'AllDay' }220 }221 }222});223scheduleObj.appendTo('#Schedule');224```225226### Pattern 3: Programmatic Event Creation227```typescript228let eventData: Object = {229 Id: 10,230 Subject: 'New Event',231 StartTime: new Date(2018, 1, 15, 14, 0),232 EndTime: new Date(2018, 1, 15, 16, 0)233};234scheduleObj.addEvent(eventData);235```236237### Pattern 4: Resource-Grouped Timeline238```typescript239import { Schedule, TimelineViews } from '@syncfusion/ej2-schedule';240241Schedule.Inject(TimelineViews);242let scheduleObj: Schedule = new Schedule({243 height: '550px',244 currentView: 'TimelineWeek',245 group: { resources: ['Rooms'] },246 resources: [{247 field: 'RoomId',248 title: 'Room',249 name: 'Rooms',250 dataSource: [251 { RoomText: 'Room 1', Id: 1, RoomColor: '#cb6bb2' },252 { RoomText: 'Room 2', Id: 2, RoomColor: '#56ca85' }253 ],254 textField: 'RoomText',255 idField: 'Id',256 colorField: 'RoomColor'257 }],258 eventSettings: { dataSource: [...] }259});260scheduleObj.appendTo('#Schedule');261```262263---264265## Key Properties Reference266267| Property | Type | Description |268|----------|------|-------------|269| `height` | string | Scheduler height (`'550px'`, `'100%'`, `'auto'`) |270| `width` | string | Scheduler width |271| `selectedDate` | Date | Currently displayed date |272| `currentView` | string | Active view name |273| `views` | ViewsModel[] | Per-view configuration array |274| `eventSettings` | EventSettingsModel | Data source and field mappings |275| `group` | GroupModel | Resource grouping configuration |276| `resources` | ResourcesModel[] | Resource definitions |277| `workDays` | number[] | Days of week to show (0=Sun–6=Sat) |278| `workHours` | WorkHoursModel | Work hour highlight and range |279| `showWeekend` | boolean | Show/hide Saturday and Sunday |280| `timezone` | string | IANA timezone string for display |281| `enablePersistence` | boolean | Persist state in localStorage |282| `readonly` | boolean | Disable all CRUD interactions |283| `allowClipboard` | boolean | Enable cut/copy/paste for events |