An object defining configuration properties for the UI component.
Specifies the shortcut key that sets focus on the UI component.
Selector: access-key
Default Value: undefined
The value of this property will be passed to the accesskey
attribute of the HTML element that underlies the UI component.
Specifies whether the UI component adapts to small screens.
Selector: adaptivity-enabled
Default Value: false
Specifies the name of the data source item field whose value defines whether or not the corresponding appointment is an all-day appointment.
Selector: all-day-expr
Default Value: 'allDay'
Specifies the display mode for the All day panel.
Selector: all-day-panel-mode
Default Value: 'all'
To hide the All day panel, set this property to hidden
.
If you set the allDayPanelMode
property to allDay
, the All day panel displays only the appointments whose allDay property is set to true
.
To also display appointments that have a duration equal to or more than 24 hours, assign all
to this property.
$(function() { $("#schedulerContainer").dxScheduler({ // ... allDayPanelMode: 'all', }); });Angular
<dx-scheduler ... allDayPanelMode="all"> </dx-scheduler>
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppComponent } from './app.component'; import { DxSchedulerModule } from 'devextreme-angular'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, DxSchedulerModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }Vue
<template> <DxScheduler ... all-day-panel-mode="all"> </DxScheduler> </template> <script> import 'devextreme/dist/css/dx.light.css'; import { DxScheduler } from 'devextreme-vue/scheduler'; export default { components: { DxScheduler }, data() { return { // ... } } } </script>React
import React from 'react'; import 'devextreme/dist/css/dx.light.css'; import { Scheduler } from 'devextreme-react/scheduler'; class App extends React.Component { render() { return ( <Scheduler ... allDayPanelMode="all" /> ); } } export default App;
Specifies a custom template for cell overflow indicators.
Selector: appointment-collector-template
Default Name: 'appointmentCollector'
jQuery$(function() { $("#schedulerContainer").dxScheduler({ // ... appointmentCollectorTemplate: function(data, $indicatorElement) { $indicatorElement.append( // Custom jQuery elements go here ) // ===== or ===== return /* your markup goes here */ } }); });Angular
<dx-scheduler ... appointmentCollectorTemplate="myTemplate"> <div *dxTemplate="let data of 'myTemplate'"> <!-- your markup goes here --> </div> </dx-scheduler>
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppComponent } from './app.component'; import { DxSchedulerModule } from 'devextreme-angular'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, DxSchedulerModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }Vue
<template> <DxScheduler ... appointment-collector-template="myTemplate"> <template #myTemplate="{ data }"> <!-- your markup goes here --> </template> </DxScheduler> </template> <script> import 'devextreme/dist/css/dx.light.css'; import { DxScheduler } from 'devextreme-vue/scheduler'; export default { components: { DxScheduler }, data() { return { // ... } } } </script>React
import React from 'react'; import 'devextreme/dist/css/dx.light.css'; import { Scheduler } from 'devextreme-react/scheduler'; const renderCellOverflowIndicator = (data) => { return ( {/* your markup goes here */} ); } class App extends React.Component { render() { return ( <Scheduler ... appointmentCollectorRender={renderCellOverflowIndicator} /> ); } } export default App;See Also
Configures appointment reordering using drag and drop gestures.
Selector: DxAppointmentDragging
Specifies a custom template for appointments.
Selector: appointment-template
Default Name: 'item'
Specifies a custom template for tooltips displayed when users click an appointment or cell overflow indicator.
Selector: appointment-tooltip-template
Template Data: Name Type Description appointmentDataThe appointment's data object.
targetedAppointmentDataThe clicked appointment's data object.
isButtonClickedSpecifies whether you click a button or an appointment element.
Default Name: 'appointmentTooltip'
Specifies cell duration in minutes. This property's value should divide the interval between startDayHour and endDayHour into even parts.
Selector: cell-duration
Default Value: 30
Specifies whether or not an end user can scroll the view in both directions at the same time.
Selector: cross-scrolling-enabled
Default Value: false
This property is useful when displaying Scheduler on narrow screens.
Specifies the current date.
Selector: current-date
Default Value: new Date()
Specifies the displayed view. Accepts name or type of a view available in the views array.
Selector: current-view
Default Value: 'day'
When more than one view matches the currentView value, the Scheduler displays the first matching view.
To subscribe to changes of the current view, use the onOptionChanged handler.
See AlsoCustomizes the date navigator's text.
Selector: customize-date-navigator-text
Function parameters:Information about the date navigator.
Object structure:
Name Type Description endDateThe view interval's end date.
startDateThe view interval's start date.
textThe text displayed in the date navigator.
The text that should be displayed.
Default Value: undefined
In the following code, the customizeDateNavigatorText function is used to show dates in the mm/dd/yyyy
format (mm/yyyy
for the "month" view):
$(function() { var scheduler; $("#schedulerContainer").dxScheduler({ // ... onInitialized: function(e) { scheduler = e.component; }, customizeDateNavigatorText: function(e) { var formatOptions = { year: 'numeric', month: 'numeric', day: 'numeric' }; var formattedStartDate = e.startDate.toLocaleString("en", formatOptions); var formattedEndDate = e.endDate.toLocaleString("en", formatOptions); var view = scheduler.option("currentView"); if(view === "day" | "timelineDay") return formattedStartDate; if(view === "month" ) return e.startDate.toLocaleString("en", { year: 'numeric', month: 'numeric' }); return formattedStartDate + " - " + formattedEndDate; } }); })Angular
import { DxSchedulerModule } from "devextreme-angular"; // ... export class AppComponent { currentView: string = "day"; customizeDateNavigatorText = (e) => { let formatOptions = { year: 'numeric', month: 'numeric', day: 'numeric' }; var formattedStartDate = e.startDate.toLocaleString("en", formatOptions); var formattedEndDate = e.endDate.toLocaleString("en", formatOptions); if(this.currentView === "day" | "timelineDay") return formattedStartDate; if(this.currentView === "month" ) return e.startDate.toLocaleString("en", { year: 'numeric', month: 'numeric' }); return formattedStartDate + " - " + formattedEndDate; } } @NgModule({ imports: [ // ... DxSchedulerModule ], // ... })
<dx-scheduler ... [(currentView)]="currentView" [customizeDateNavigatorText]="customizeDateNavigatorText"> </dx-scheduler>Vue
<template> <DxScheduler ... v-model:current-view="currentView" :customize-date-navigator-text="customizeDateNavigatorText"> </DxScheduler> </template> <script> import 'devextreme/dist/css/dx.light.css'; import { DxScheduler } from 'devextreme-vue/scheduler'; export default { components: { DxScheduler }, data() { return { currentView: 'day', // ... } }, methods: { customizeDateNavigatorText(e) { const formatOptions = { year: 'numeric', month: 'numeric', day: 'numeric' }; const formattedStartDate = e.startDate.toLocaleString('en', formatOptions); const formattedEndDate = e.endDate.toLocaleString('en', formatOptions); if(this.currentView === 'day' | 'timelineDay') return formattedStartDate; if(this.currentView === 'month' ) return e.startDate.toLocaleString('en', { year: 'numeric', month: 'numeric' }); return formattedStartDate + ' - ' + formattedEndDate; } } } </script>React
import React, { useCallback, useState } from 'react'; import 'devextreme/dist/css/dx.light.css'; import Scheduler from 'devextreme-react/scheduler'; const App = () => { const [currentView, setCurrentView] = useState('day'); const onOptionChanged = useCallback((e) => { if(e.name === 'currentView') { setCurrentView(e.value); } }, [setCurrentView]); const customizeDateNavigatorText = useCallback((e) => { const formatOptions = { year: 'numeric', month: 'numeric', day: 'numeric' }; const formattedStartDate = e.startDate.toLocaleString('en', formatOptions); const formattedEndDate = e.endDate.toLocaleString('en', formatOptions); if(currentView === 'day' | 'timelineDay') return formattedStartDate; if(currentView === 'month' ) return e.startDate.toLocaleString('en', { year: 'numeric', month: 'numeric' }); return formattedStartDate + ' - ' + formattedEndDate; }, [currentView]); return ( <Scheduler ... currentView={currentView} onOptionChanged={onOptionChanged} customizeDateNavigatorText={customizeDateNavigatorText} /> ); } export default App;
Specifies a custom template for table cells.
Selector: data-cell-template
Template Data:The current table cell's data.
Default Name: null
The following image shows the difference between Scheduler cell types:
Use this template for data cells only.
The data of this template consists of the following fields:
Field name DescriptionstartDate
Start date of the data cell. endDate
End date of the data cell. allDay
Specifies whether the appointment in cell lasts all day. groups
A group object to which data cell belongs. groupIndex
Index of a group to which data cell belongs. text
Text of data cell.
There is no
dataCellTemplatein the
agendaview.
See AlsoBinds the UI component to data.
Selector: data-source
Default Value: null
The Scheduler works with collections of objects.
Depending on your data source, bind Scheduler to data as follows. In each case, also specify the UI component's startDateExpr and endDateExpr properties. Optionally, set other properties with the Expr postfix.
Data Array
Assign the array to the dataSource option. View Demo
Read-Only Data in JSON Format
Set the dataSource property to the URL of a JSON file or service that returns JSON data.
OData
Implement an ODataStore.
Web API, PHP, MongoDB
Use one of the following extensions to enable the server to process data according to the protocol DevExtreme UI components use:
Then, use the createStore method to configure access to the server on the client as shown below. This method is part of DevExtreme.AspNet.Data.
jQuery$(function() { let serviceUrl = "https://url/to/my/service"; $("#schedulerContainer").dxScheduler({ // ... dataSource: DevExpress.data.AspNet.createStore({ key: "ID", loadUrl: serviceUrl + "/GetAction", insertUrl: serviceUrl + "/InsertAction", updateUrl: serviceUrl + "/UpdateAction", deleteUrl: serviceUrl + "/DeleteAction" }) }) });Angular
import { Component } from '@angular/core'; import CustomStore from 'devextreme/data/custom_store'; import { createStore } from 'devextreme-aspnet-data-nojquery'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { store: CustomStore; constructor() { let serviceUrl = "https://url/to/my/service"; this.store = createStore({ key: "ID", loadUrl: serviceUrl + "/GetAction", insertUrl: serviceUrl + "/InsertAction", updateUrl: serviceUrl + "/UpdateAction", deleteUrl: serviceUrl + "/DeleteAction" }) } }
<dx-scheduler ... [dataSource]="store"> </dx-scheduler>
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppComponent } from './app.component'; import { DxSchedulerModule } from 'devextreme-angular'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, DxSchedulerModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }Vue
<template> <DxScheduler ... :data-source="store" /> </template> <script> import 'devextreme/dist/css/dx.light.css'; import CustomStore from 'devextreme/data/custom_store'; import { createStore } from 'devextreme-aspnet-data-nojquery'; import { DxScheduler } from 'devextreme-vue/scheduler'; export default { components: { DxScheduler }, data() { const serviceUrl = "https://url/to/my/service"; const store = createStore({ key: "ID", loadUrl: serviceUrl + "/GetAction", insertUrl: serviceUrl + "/InsertAction", updateUrl: serviceUrl + "/UpdateAction", deleteUrl: serviceUrl + "/DeleteAction" }); return { store } } } </script>React
import React from 'react'; import 'devextreme/dist/css/dx.light.css'; import CustomStore from 'devextreme/data/custom_store'; import { createStore } from 'devextreme-aspnet-data-nojquery'; import Scheduler from 'devextreme-react/scheduler'; const serviceUrl = "https://url/to/my/service"; const store = createStore({ key: "ID", loadUrl: serviceUrl + "/GetAction", insertUrl: serviceUrl + "/InsertAction", updateUrl: serviceUrl + "/UpdateAction", deleteUrl: serviceUrl + "/DeleteAction" }); class App extends React.Component { render() { return ( <Scheduler ... dataSource={store} /> ); } } export default App;
Any other data source
Implement a CustomStore. View Demo
Regardless of the data source on the input, the Scheduler always wraps it in the DataSource object. This object allows you to sort, filter, group, and perform other data shaping operations. To get its instance, call the getDataSource() method.
Review the following notes about data binding:
If you wrap the store into the DataSource object explicitly, set the paginate property to false to prevent data from partitioning.
Field names cannot be equal to this
and should not contain the following characters: .
, :
, [
, and ]
.
Scheduler does not execute dataSource.sort functions. To implement custom sorting logic, implement columns[].calculateSortValue.
Specifies a custom template for day scale items.
Selector: date-cell-template
Template Data:The data of the current date scale item.
Default Name: null
The following image shows the difference between Scheduler cell types:
Use this template for date cells only.
The data of this template consists of the following fields:
Field name Descriptiondate
Date of the cell. groups
A group object to which date cell belongs. groupIndex
Index of a group to which date cell belongs. text
Text of date cell.
There is no dateCellTemplate in such views as "day" and "timelineDay".
See AlsoSpecifies the format in which date-time values should be sent to the server.
Selector: date-serialization-format
Default Value: undefined
Specify this property in the following cases:
The dataSource is empty or not set at design time. The dateSerializationFormat is needed, because the Scheduler cannot detect it automatically without a data source.
You use the createStore method from the DevExtreme.AspNet.Data extension and remote date-time values are specified in UTC. DevExtreme.AspNet.Data requires the dateSerializationFormat to correctly serialize these values.
Use one of the following values to specify the dateSerializationFormat property:
"yyyy-MM-dd"
- local date
"yyyy-MM-ddTHH:mm:ss"
- local date and time
"yyyy-MM-ddTHH:mm:ssZ"
- UTC date and time
"yyyy-MM-ddTHH:mm:ssx"
, "yyyy-MM-ddTHH:mm:ssxx"
, "yyyy-MM-ddTHH:mm:ssxxx"
- date and time with a timezone
This property applies only if the forceIsoDateParsing field is set to true in the global configuration object.
Web API Service Demo SignalR Service Demo
See AlsoSpecifies the name of the data source item field whose value holds the description of the corresponding appointment.
Selector: description-expr
Default Value: 'description'
Specifies whether the UI component responds to user interaction.
Specifies which editing operations a user can perform on appointments.
Selector: DxEditing
Default Value: true
Specifies the global attributes to be attached to the UI component's container element.
Selector: DxElementAttr
Default Value: {}
jQuery$(function(){ $("#schedulerContainer").dxScheduler({ // ... elementAttr: { id: "elementId", class: "class-name" } }); });Angular
<dx-scheduler ... [elementAttr]="{ id: 'elementId', class: 'class-name' }"> </dx-scheduler>
import { DxSchedulerModule } from "devextreme-angular"; // ... export class AppComponent { // ... } @NgModule({ imports: [ // ... DxSchedulerModule ], // ... })Vue
<template> <DxScheduler ... :element-attr="schedulerAttributes"> </DxScheduler> </template> <script> import DxScheduler from 'devextreme-vue/scheduler'; export default { components: { DxScheduler }, data() { return { schedulerAttributes: { id: 'elementId', class: 'class-name' } } } } </script>React
import React from 'react'; import Scheduler from 'devextreme-react/scheduler'; class App extends React.Component { schedulerAttributes = { id: 'elementId', class: 'class-name' } render() { return ( <Scheduler ... elementAttr={this.schedulerAttributes}> </Scheduler> ); } } export default App;
Specifies the name of the data source item field that defines the ending of an appointment.
Selector: end-date-expr
Default Value: 'endDate'
Specifies the name of the data source item field that defines the timezone of the appointment end date.
Selector: end-date-time-zone-expr
Default Value: 'endDateTimeZone'
Specifies the last hour on the time scale. Accepts integer values from 0 to 24.
Selector: end-day-hour
Default Value: 24
Specifies the first day of a week. Does not apply to the agenda view.
Selector: first-day-of-week
Default Value: undefined
This property can accept a value from 0 to 6:
The value provided by the culture settings is used by default.
Specifies whether the UI component can be focused using keyboard navigation.
Selector: focus-state-enabled
Default Value: true (desktop)
If true, appointments are grouped by date first and then by resource; opposite if false. Applies only if appointments are grouped and groupOrientation is "horizontal".
Selector: group-by-date
Default Value: false
Specifies the resource kinds by which the scheduler's appointments are grouped in a timetable.
This array should contain one or more values that correspond to the fieldExpr values of resource kinds:
jQueryvar resources = [ { fieldExpr: "room", dataSource: roomsDataSource }, { fieldExpr: "teacher", dataSource: teachersDataSource } ]; var schedulerOptions = { dataSource: appointments, resources: resources, groups: ["room", "teacher"] // ... }Angular
<dx-scheduler [dataSource]="appointments" [resources]="resources" [groups]="['room', 'teacher']"> </dx-scheduler>
import { DxSchedulerModule } from "devextreme-angular"; // ... export class AppComponent { // ... resources = [ { fieldExpr: "room", dataSource: this.roomsDataSource }, { fieldExpr: "teacher", dataSource: this.teachersDataSource } ]; } @NgModule({ imports: [ // ... DxSchedulerModule ], // ... })Vue
<template> <DxScheduler ... :data-source="appointments" :groups="groups"> <DxResource :data-source="roomsDataSource" field-expr="room" /> <DxResource :data-source="teachersDataSource" field-expr="teacher" /> </DxScheduler> </template> <script> import 'devextreme/dist/css/dx.light.css'; import { DxScheduler } from 'devextreme-vue/scheduler'; export default { components: { DxScheduler }, data() { return { dataSource: [ ... ], groups: ['room', 'teacher'], roomsDataSource: [ ... ], teachersDataSource: [ ... ] // ... } } } </script>React
import React from 'react'; import 'devextreme/dist/css/dx.light.css'; import Scheduler, { Resource } from 'devextreme-react/scheduler'; const App = () => { const appointments = [ ... ]; const roomsDataSource = [ ... ]; const teachersDataSource = [ ... ]; const groups = ['room', 'teacher']; return ( <Scheduler ... dataSource={appointments} groups={groups}> <Resource dataSource={roomsDataSource} fieldExpr="room" /> <Resource dataSource={teachersDataSource} fieldExpr="teacher" /> </Scheduler> ); } export default App;
To group appointments in the agenda view or by one type of resource, for instance, to group appointments that use a particular room in an office, assign an array with a single element to the groups property. To group appointments by several resource types, assign an array of elements. Each element represents a resource by which appointments are grouped. Each resource is nested in the resource represented by the previous element in the groups array.
Specifies the UI component's height.
This property accepts a value of one of the following types:
Number
The height in pixels.
String
A CSS-accepted measurement of height. For example, "55px"
, "20vh"
, "80%"
, "inherit"
.
Specifies text for a hint that appears when a user pauses on the UI component.
Specifies the time interval between when the date-time indicator changes its position, in milliseconds.
Selector: indicator-update-interval
Default Value: 300000
The latest date the UI component allows you to select.
Specifies the limit of full-sized appointments displayed per cell. Applies to all views except "agenda".
Selector: max-appointments-per-cell
Default Value: 'auto'
When you set this property to "auto", appointments shrink to a predefined size that depends on the view type. Appointments that do not fit into the cell are hidden, and the cell displays an overflow indicator. Users can click the indicator to display the hidden appointments in a tooltip. The "unlimited" value shrinks appointments without a limit to fit into a cell.
To specify the maximum number of appointments allowed in a single cell, set the property to Number. Appointments that exceed this number are hidden, and the cell displays an overflow indicator. Users can click the indicator to display the hidden appointments in a tooltip.
The earliest date the UI component allows you to select.
Specifies the text or HTML markup displayed by the UI component if the item collection is empty. Available for the Agenda view only.
Selector: no-data-text
Default Value: 'No data to display'
The Scheduler component evaluates the noDataText property's value. This evaluation, however, makes the Scheduler potentially vulnerable to XSS attacks. To guard against these attacks, encode the HTML markup before you assign it to the noDataText property. Refer to the following help topic for more information: Potentially Vulnerable API - noDataText.
Specifies the minute offset within Scheduler indicating the starting point of a day.
This property moves the interval between startDayHour and endDayHour. The offset is a multiple of 5 and can range from -1440 minutes (-24 hours) to 1440 minutes (24 hours). For instance, if the following is true:
The offset is set to 240.
startDayHour is 0 (default).
endDayHour is 24 (default).
Then, the day starts and ends at 04:00 AM instead of 00:00.
You can combine this property with different values of startDayHour, endDayHour, and cellDuration to get the desired result. For example, the following code snippet uses all these properties, and as a result, the day starts at 4:40 AM and ends at 12:00 PM.
jQuery$(() => { $('#scheduler').dxScheduler({ // ... offset: -20, startDayHour: 5, endDayHour: 12, cellDuration: 40, }); });Angular
<dx-scheduler ... [offset]="-20" [startDayHour]="5" [endDayHour]="12" [cellDuration]="40" > </dx-scheduler>Vue
<template> <DxScheduler ... offset="-20" start-day-hour="5" end-day-hour="12" cell-duration="40" /> </template> <script> // ... </script>React
// ... export default function App() { return ( <Scheduler ... offset="-20" startDayHour="5" endDayHour="12" cellDuration="40" /> ) }
This property has no effect on the agenda view.
A function that is executed after an appointment is added to the data source.
Selector: @appointment-added
Function parameters:Information about the event.
Object structure:
Default Value: null
A function that is executed before an appointment is added to the data source.
Selector: @appointment-adding
Function parameters:Information about the event.
Object structure:
Default Value: null
A function that is executed when an appointment is clicked or tapped.
Selector: @appointment-click
Function parameters:Information about the event.
Object structure:
Default Value: null
In case of recurring appointments or appointments with multiple resources, you may need the data object of the clicked appointment, not the initial appointment. For this purpose, use the targetedAppointmentData field of the function's parameter. Otherwise, use the appointmentData field.
For example, the data source contains the following data object:
var appointments = [{ startDate: new Date(2016, 6, 18, 8), endDate: new Date(2016, 6, 18, 9), ownerId: [1, 2], recurrenceRule: "FREQ=DAILY" }];
This object describes a series of appointments that belong to two owners and repeat every day. If a user clicks an appointment from this series (for example, the second appointment that belongs to the second owner), appointmentData and targetedAppointmentData will then contain the following data objects:
onAppointmentClick: function(e) { console.log(e.appointmentData); /* { startDate: new Date(2016, 6, 18, 8), endDate: new Date(2016, 6, 18, 9), ownerId: [1, 2], recurrenceRule: "FREQ=DAILY" } */ console.log(e.targetedAppointmentData); /* { startDate: new Date(2016, 6, 19, 8), endDate: new Date(2016, 6, 19, 9), ownerId: 2, recurrenceRule: "FREQ=DAILY" } */ }
Additionally, the targetedAppointmentData field has the displayStartDate and displayEndDate date objects. These objects contain time-zone adjusted dates if you specify the timeZone property. If the latter property is not specified, the date objects mentioned above have the same values as the startDate and endDate objects.
onAppointmentClick: function(e) { console.log(e.targetedAppointmentData); /* { startDate: new Date(2016, 6, 19, 8), endDate: new Date(2016, 6, 19, 9), displayStartDate: new Date(2016, 6, 19, 10), displayEndDate: new Date(2016, 6, 19, 11), ownerId: 2, recurrenceRule: "FREQ=DAILY" } */ }
A function that is executed when a user attempts to open the browser's context menu for an appointment. Allows you to replace this context menu with a custom context menu.
Selector: @appointment-context-menu
Function parameters:Information about the event.
Object structure:
Default Value: null
A function that is executed when an appointment is double-clicked or double-tapped.
Selector: @appointment-dbl-click
Function parameters:Information about the event.
Object structure:
Default Value: null
A function that is executed after an appointment is deleted from the data source.
Selector: @appointment-deleted
Function parameters:Information about the event.
Object structure:
Default Value: null
A function that is executed before an appointment is deleted from the data source.
Selector: @appointment-deleting
Function parameters:Information about the event.
Object structure:
Name Type Description appointmentDataThe data of the appointment to be deleted.
cancel |Promise<Boolean> (jQuery or native)
Allows you to prevent the appointment from being deleted.
If you pass a Promise to this field, appointment deleting is continued or canceled once the Promise has been resolved.
The UI component's instance.
elementThe UI component's container. It is an HTML Element or a jQuery Element when you use jQuery.
Default Value: null
A function that is executed before an appointment details form appears. Use this function to customize the form.
Selector: @appointment-form-opening
Function parameters:Information about the event.
Object structure:
Name Type Description appointmentDataThe data of the appointment for which a form is opened.
cancelIf true, prevents the user from opening the appointment details form.
componentThe UI component's instance.
elementThe UI component's container. It is an HTML Element or a jQuery Element when you use jQuery.
formThe form's instance; created only once - when the function is executed for the first time.
popupThe instance of the popup that contains the form.
Default Value: null
The Scheduler displays the appointment details form inside a popup. The elements inside the form are the Form and Popup UI components. Use the onAppointmentFormOpening function's form and popup fields and the Form and Popup API to access and customize the corresponding UI component.
The form organizes its items into two groups:
Group name Description mainGroup Contains form fields that define main appointment parameters (for example, subject, and description). recurrenceGroup Contains form fields that define appointment recurrence parameters.The table below lists 'mainGroup' editor names:
You can add a custom item to any group or create an ungrouped item and display it under the groups. If you use the [fieldName]Expr properties to map custom items to data fields, use these property values to access the items on the appointment form.
The code below adds a new form item (phone
) to the mainGroup
and creates an ungrouped item (location
). Check the array of form items to ensure that it does not contain an item with the same data field.
The mainGroup
consists of two columns. A custom item's colSpan property value is 2. This means that the custom item spans two columns.
$(function() { $("#schedulerContainer").dxScheduler({ dataSource: [{ text: "Attend the conference", startDate: new Date(2020, 4, 24, 9, 10), endDate: new Date(2020, 4, 24, 11, 20), }], currentDate: new Date(2020, 4, 24), onAppointmentFormOpening: function(e) { e.popup.option('showTitle', true); e.popup.option('title', e.appointmentData.text ? e.appointmentData.text : 'Create a new appointment'); const form = e.form; let mainGroupItems = form.itemOption('mainGroup').items; if (!mainGroupItems.find(function(i) { return i.dataField === "phone" })) { mainGroupItems.push({ colSpan: 2, label: { text: "Phone Number" }, editorType: "dxTextBox", dataField: "phone" }); form.itemOption('mainGroup', 'items', mainGroupItems); } let formItems = form.option("items"); if (!formItems.find(function(i) { return i.dataField === "location" })) { formItems.push({ colSpan: 2, label: { text: "Location" }, editorType: "dxTextBox", dataField: "location" }); form.option("items", formItems); } } }); });Angular
<dx-scheduler [dataSource]="schedulerData" [currentDate]="currentDate" (onAppointmentFormOpening)="onAppointmentFormOpening($event)"> </dx-scheduler>
import { DxSchedulerModule } from "devextreme-angular"; // ... export class AppComponent { schedulerData = [{ text: "Attend the conference", startDate: new Date(2020, 4, 24, 9, 10), endDate: new Date(2020, 4, 24, 11, 20), }]; currentDate = new Date(2020, 4, 24); onAppointmentFormOpening(e) { e.popup.option('showTitle', true); e.popup.option('title', e.appointmentData.text ? e.appointmentData.text : 'Create a new appointment'); const form = e.form; let mainGroupItems = form.itemOption('mainGroup').items; if (!mainGroupItems.find(function(i) { return i.dataField === "phone" })) { mainGroupItems.push({ colSpan: 2, label: { text: "Phone Number" }, editorType: "dxTextBox", dataField: "phone" }); form.itemOption('mainGroup', 'items', mainGroupItems); } let formItems = form.option("items"); if (!formItems.find(function(i) { return i.dataField === "location" })) { formItems.push({ colSpan: 2, label: { text: "Location" }, editorType: "dxTextBox", dataField: "location" }); form.option("items", formItems); } } } @NgModule({ imports: [ // ... DxSchedulerModule ], // ... })Vue
<template> <DxScheduler :data-source="schedulerData" :current-date="currentDate" @appointment-form-opening="onAppointmentFormOpening" /> </template> <script> import 'devextreme/dist/css/dx.light.css'; import DxScheduler from 'devextreme-vue/scheduler'; export default { components: { DxScheduler }, data() { return { schedulerData: [{ text: "Attend the conference", startDate: new Date(2020, 4, 24, 9, 10), endDate: new Date(2020, 4, 24, 11, 20), }], currentDate: new Date(2020, 4, 24) } }, methods: { onAppointmentFormOpening(e) { e.popup.option('showTitle', true); e.popup.option('title', e.appointmentData.text ? e.appointmentData.text : 'Create a new appointment'); const form = e.form; let mainGroupItems = form.itemOption('mainGroup').items; if (!mainGroupItems.find(function(i) { return i.dataField === "phone" })) { mainGroupItems.push({ colSpan: 2, label: { text: "Phone Number" }, editorType: "dxTextBox", dataField: "phone" }); form.itemOption('mainGroup', 'items', mainGroupItems); } let formItems = form.option("items"); if (!formItems.find(function(i) { return i.dataField === "location" })) { formItems.push({ colSpan: 2, label: { text: "Location" }, editorType: "dxTextBox", dataField: "location" }); form.option("items", formItems); } } } } </script>React
import React from 'react'; import 'devextreme/dist/css/dx.light.css'; import Scheduler from 'devextreme-react/scheduler'; const dataSource = [{ text: "Attend the conference", startDate: new Date(2020, 4, 24, 9, 10), endDate: new Date(2020, 4, 24, 11, 20), }]; class App extends React.Component { currentDate = new Date(2020, 4, 24); onAppointmentFormOpening(e) { e.popup.option('showTitle', true); e.popup.option('title', e.appointmentData.text ? e.appointmentData.text : 'Create a new appointment'); const form = e.form; let mainGroupItems = form.itemOption('mainGroup').items; if (!mainGroupItems.find(function(i) { return i.dataField === "phone" })) { mainGroupItems.push({ colSpan: 2, label: { text: "Phone Number" }, editorType: "dxTextBox", dataField: "phone" }); form.itemOption('mainGroup', 'items', mainGroupItems); } let formItems = form.option("items"); if (!formItems.find(function(i) { return i.dataField === "location" })) { formItems.push({ colSpan: 2, label: { text: "Location" }, editorType: "dxTextBox", dataField: "location" }); form.option("items", formItems); } } render() { return ( <Scheduler dataSource={dataSource} defaultCurrentDate={this.currentDate} onAppointmentFormOpening={this.onAppointmentFormOpening} /> ); } } export default App;See Also
A function that is executed when an appointment is rendered.
Selector: @appointment-rendered
Function parameters:Information about the event.
Object structure:
Default Value: null
Occurs before showing an appointment's tooltip.
Selector: @appointment-tooltip-showing
Function parameters:Information about the event.
Object structure:
Default Value: null
A function that is executed after an appointment is updated in the data source.
Selector: @appointment-updated
Function parameters:Information about the event.
Object structure:
Default Value: null
A function that is executed before an appointment is updated in the data source.
Selector: @appointment-updating
Function parameters:Information about the event.
Object structure:
Name Type Description cancel |Promise<Boolean> (jQuery or native)
Allows you to prevent an appointment update.
If you pass a Promise to this field, the appointment updating is continued or canceled once the Promise has been resolved.
The UI component's instance.
elementThe UI component's container. It is an HTML Element or a jQuery Element when you use jQuery.
newDataThe appointment with new data.
oldDataThe data of the appointment to be updated.
Default Value: null
A function that is executed when a view cell is clicked.
Selector: @cell-click
Function parameters:Information about the event.
Object structure:
Default Value: null
A function that is executed when a user attempts to open the browser's context menu for a cell. Allows you to replace this context menu with a custom context menu.
Selector: @cell-context-menu
Function parameters:Information about the event.
Object structure:
Default Value: null
A function that is executed when the UI component is rendered and each time the component is repainted.
Selector: @content-ready
Function parameters:Information about the event.
Object structure:
Default Value: null
A function that is executed before the UI component is disposed of.
Selector: @disposing
Function parameters:Information about the event.
Object structure:
Default Value: null
A function used in JavaScript frameworks to save the UI component instance.
Selector: @initialized
Function parameters:Information about the event.
Object structure:
Default Value: null
Angular<dx-scheduler ... (onInitialized)="saveInstance($event)"> </dx-scheduler>
import { Component } from "@angular/core"; import Scheduler from "devextreme/ui/data_grid"; // ... export class AppComponent { schedulerInstance: Scheduler; saveInstance (e) { this.schedulerInstance = e.component; } }Vue
App.vue (Composition API)
<template> <div> <DxScheduler ... @initialized="saveInstance"> </DxScheduler> </div> </template> <script> import DxScheduler from 'devextreme-vue/scheduler'; export default { components: { DxScheduler }, data: function() { return { schedulerInstance: null }; }, methods: { saveInstance: function(e) { this.schedulerInstance = e.component; } } }; </script>
<template> <div> <DxScheduler ... @initialized="saveInstance"> </DxScheduler> </div> </template> <script setup> import DxScheduler from 'devextreme-vue/scheduler'; let schedulerInstance = null; const saveInstance = (e) => { schedulerInstance = e.component; } </script>React
import Scheduler from 'devextreme-react/scheduler'; class App extends React.Component { constructor(props) { super(props); this.saveInstance = this.saveInstance.bind(this); } saveInstance(e) { this.schedulerInstance = e.component; } render() { return ( <div> <Scheduler onInitialized={this.saveInstance} /> </div> ); } }See Also jQuery
A function that is executed after a UI component property is changed.
Selector: @option-changed
Function parameters:Information about the event.
Object structure:
Name Type Description value anyThe modified property's new value.
previousValue anyThe UI component's previous value.
nameThe modified property if it belongs to the first level. Otherwise, the first-level property it is nested into.
fullNameThe path to the modified property that includes all parent properties.
elementThe UI component's container. It is an HTML Element or a jQuery Element when you use jQuery.
componentThe UI component's instance.
Default Value: null
The following example shows how to subscribe to component property changes:
jQuery$(function() { $("#schedulerContainer").dxScheduler({ // ... onOptionChanged: function(e) { if(e.name === "changedProperty") { // handle the property change here } } }); });Angular
<dx-scheduler ... (onOptionChanged)="handlePropertyChange($event)"> </dx-scheduler>
import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { // ... handlePropertyChange(e) { if(e.name === "changedProperty") { // handle the property change here } } }
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppComponent } from './app.component'; import { DxSchedulerModule } from 'devextreme-angular'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, DxSchedulerModule ], providers: [ ], bootstrap: [AppComponent] }) export class AppModule { }Vue
<template> <DxScheduler ... @option-changed="handlePropertyChange" /> </template> <script> import 'devextreme/dist/css/dx.light.css'; import DxScheduler from 'devextreme-vue/scheduler'; export default { components: { DxScheduler }, // ... methods: { handlePropertyChange: function(e) { if(e.name === "changedProperty") { // handle the property change here } } } } </script>React
import React from 'react'; import 'devextreme/dist/css/dx.light.css'; import Scheduler from 'devextreme-react/scheduler'; const handlePropertyChange = (e) => { if(e.name === "changedProperty") { // handle the property change here } } export default function App() { return ( <Scheduler ... onOptionChanged={handlePropertyChange} /> ); }
Specifies the edit mode for recurring appointments.
Selector: recurrence-edit-mode
Default Value: 'dialog'
This property accepts the following values:
"series"
Enables a user to edit only entire appointment series.
"occurrence"
Enables a user to edit only individual appointment instances.
"dialog"
Displays a dialog that suggests a user to choose between editing the entire series or only the individual instance.
The Scheduler handles changes made to an instance and a series differently. If a user edits a recurring appointment instance, two actions are performed on the data objects:
The series' data object is updated. The Scheduler updates the field specified by recurrenceExceptionExpr, thus adding the edited instance to exceptions. The onAppointmentUpdating and onAppointmentUpdated event handlers are executed.
A new data object is created. This object contains the edited instance's data. The onAppointmentAdding and onAppointmentAdded event handlers are executed.
When a user deletes an instance, the Scheduler adds it to series' exceptions by updating the field specified in recurrenceExceptionExpr. Because this is an update, the onAppointmentUpdating and onAppointmentUpdated event handlers are executed instead of onAppointmentDeleting and onAppointmentDeleted.
If a user edits a whole series, only the series data object is updated. When a whole series is deleted, its object is removed.
Specifies the name of the data source item field that defines exceptions for the current recurring appointment.
Selector: recurrence-exception-expr
Default Value: 'recurrenceException'
Specifies the name of the data source item field that defines a recurrence rule for generating recurring appointments.
Selector: recurrence-rule-expr
Default Value: 'recurrenceRule'
Specifies whether filtering is performed on the server or client side.
Selector: remote-filtering
Default Value: false
Specifies a custom template for resource headers.
Selector: resource-cell-template
Template Data:The current resource header's data.
Default Name: null
Specifies an array of resources available in the scheduler.
Selector: DxResource
Default Value: []
Each element of this array is an object that defines a resource kind - a room, a car or any other resource kind. A resource kind object must have at least the following fields.
dataSource
Specify the available resources of this kind (room1, room2, etc.).
fieldExpr
The name of the appointment object field that specifies a resource of this kind (e.g., "room").
There are more fields that can be specified within a resource kind object. They are listed below. For details on how to define a resource and assign it to scheduler appointments, refer to the Resources article. The Scheduler does not support grouping resources by multiple data fields in the agenda view.
Resources Demo Grouping by Resources Demo
Switches the UI component to a right-to-left representation.
Selector: rtl-enabled
Default Value: false
When this property is set to true, the UI component text flows from right to left, and the layout of elements is reversed. To switch the entire application/site to the right-to-left representation, assign true to the rtlEnabled field of the object passed to the DevExpress.config(config) method.
DevExpress.config({ rtlEnabled: true });
DataGrid Demo Navigation UI Demo Editors Demo
Configures scrolling.
Selector: DxScrolling
Type: dxSchedulerScrolling
The data of the currently selected cells.
Selector: selected-cell-data
Read-only
Default Value: []
This array contains objects with the following structure:
{ startDate: Date, endDate: Date, allDay: Boolean, groups: { // present if grouping is enabled resourceKind: "resourceValue" // for example, room: "101" } }
You can implement the onOptionChanged function to track all user actions that change selection. The following code logs the selectedCellData value in the browser console.
const onOptionChanged = ({ name, value }) => { if (name === "selectedCellData") { console.log(value); } };See Also
Specifies whether to apply shading to cover the timetable up to the current time.
Selector: shade-until-current-time
Default Value: false
Specifies the "All-day" panel's visibility. Setting this property to false hides the panel along with the all-day appointments.
Selector: show-all-day-panel
Default Value: true
Specifies the current date-time indicator's visibility.
Selector: show-current-time-indicator
Default Value: true
Specifies the name of the data source item field that defines the start of an appointment.
Selector: start-date-expr
Default Value: 'startDate'
Specifies the name of the data source item field that defines the timezone of the appointment start date.
Selector: start-date-time-zone-expr
Default Value: 'startDateTimeZone'
Specifies the first hour on the time scale. Accepts integer values from 0 to 24.
Selector: start-day-hour
Default Value: 0
Specifies the number of the element when the Tab key is used for navigating.
Selector: tab-index
Default Value: 0
The value of this property will be passed to the tabindex
attribute of the HTML element that underlies the UI component.
Specifies the name of the data source item field that holds the subject of an appointment.
Selector: text-expr
Default Value: 'text'
Specifies a custom template for time scale items.
Selector: time-cell-template
Template Data:The data of the current time scale item.
Default Name: null
The following image shows the difference between Scheduler cell types:
Use this template for time cells only.
Field name Descriptiondate
Date of the cell. groups
A group object to which time cell belongs. groupIndex
Index of a group to which time cell belongs. text
Text of time cell.
There is no timeCellTemplate in such views as "month", "timelineMonth" and "agenda".
See AlsoSpecifies the time zone for the Scheduler's grid. Accepts values from the IANA time zone database.
Selector: time-zone
Default Value: ''
Configures the toolbar.
Selector: DxToolbar
Default Value: undefined
Specifies whether a user can switch views using tabs or a drop-down menu.
Selector: use-drop-down-view-switcher
Default Value: false, true (Android, iOS, Fluent, Material)
Using a drop-down menu makes the view switcher more compact.
Specifies and configures the views to be available in the view switcher.
Selector: DxView
Default Value: ['day', 'week']
Accepted Values: 'day' | 'week' | 'workWeek' | 'month' | 'timelineDay' | 'timelineWeek' | 'timelineWorkWeek' | 'timelineMonth' | 'agenda'
This property accepts an array of strings and objects:
String
A view name. Use a string if the view does not need customization, but should be available in the view switcher.
Object
An individual view's configuration. Set the type property to specify the view to customize. Properties set for an individual view override their corresponding component configuration properties.
views: [{ type: 'workWeek', name: 'Vertical Grouping', groupOrientation: 'vertical', cellDuration: 60, intervalCount: 2, }, { type: 'workWeek', name: 'Horizontal Grouping', groupOrientation: 'horizontal', cellDuration: 30, intervalCount: 2, }, 'agenda' ]
For more information about how to customize an individual view, refer to the following topic: Customize Individual Views.
To specify the default view, use the currentView property.
Specifies whether the UI component is visible.
Specifies the UI component's width.
This property accepts a value of one of the following types:
Number
The width in pixels.
String
A CSS-accepted measurement of width. For example, "55px"
, "20vw"
, "80%"
, "auto"
, "inherit"
.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4