Your search did not match any results.
Calendar

Calendar

When you add a Calendar to an application, you need to specify its value in one of the following formats:

  • Date objects

  • The number of milliseconds since 00:00:00 on January 1, 1970

  • Strings that match the following patterns:

    • 'yyyy-MM-dd'
    • 'yyyy-MM-ddTHH:mm:ss'
    • 'yyyy-MM-ddTHH:mm:ssZ'
    • 'yyyy-MM-ddTHH:mm:ssx'

This demo shows how to use additional properties to customize your Calendar. You can toggle the checkboxes on the right to change the Calendar in real time.

Disable Dates

Use the min and max properties to specify the range of available dates. In this demo, these properties limit the range to three days before and after the current date. Enable the "Specified min value" and "Specified max value" checkboxes to apply the properties.

If you need to disable specific dates, use the disabledDates property. Toggle the "Disable weekend" checkbox to see how this setting affects the component's behavior. You can specify either an array of predefined dates or a function that determines whether a date is available.

Set the Beginning of the Week

To specify the first day of the week, pass its index (0 - for Sunday, 1 - for Monday, and so on) to the firstDayOfWeek property.

Handle Value Change

Set the onValueChanged property to handle the value change. In this demo, the DateBox and the Calendar both use this property to pass values between each other. You can use one of these components to change the date. See how it affects the other.

Customize Cell Appearance

Use the cellTemplate property to customize cell appearance. In this demo, when you toggle the "Use the Custom Cell Template" checkbox, all the weekends on the Calendar become blue, and all the holidays become red. You can set your own function that changes the class of the span element that contains cell text.

Other Customizations

Set the disabled property to disable the Calendar.

To specify the initial calendar view (month, year, decade, or century), set the zoomLevel property.

Backend API
Copy to CodeSandBox
Apply
Reset
import React from 'react'; import CheckBox from 'devextreme-react/check-box'; import SelectBox from 'devextreme-react/select-box'; import DateBox from 'devextreme-react/date-box'; import Calendar from 'devextreme-react/calendar'; const zoomLevels = ['month', 'year', 'decade', 'century']; class App extends React.Component { constructor() { super(); this.state = { minDateValue: null, maxDateValue: null, disabledDates: null, firstDay: 0, currentValue: new Date(), cellTemplate: null, disabled: false, zoomLevel: 'month', }; this.onCurrentValueChanged = this.onCurrentValueChanged.bind(this); this.onDisabledChanged = this.onDisabledChanged.bind(this); this.onZoomLevelValueChanged = this.onZoomLevelValueChanged.bind(this); this.onZoomLevelChanged = this.onZoomLevelChanged.bind(this); this.setMinDate = this.setMinDate.bind(this); this.setMaxDate = this.setMaxDate.bind(this); this.disableWeekend = this.disableWeekend.bind(this); this.setFirstDay = this.setFirstDay.bind(this); this.useCellTemplate = this.useCellTemplate.bind(this); } render() { const { currentValue, minDateValue, maxDateValue, disabledDates, firstDay, disabled, zoomLevel, cellTemplate, } = this.state; return ( <div id="calendar-demo"> <div className="widget-container"> <Calendar id="calendar-container" value={currentValue} onValueChanged={this.onCurrentValueChanged} onOptionChanged={this.onZoomLevelChanged} min={minDateValue} max={maxDateValue} disabledDates={disabledDates} firstDayOfWeek={firstDay} disabled={disabled} zoomLevel={zoomLevel} cellRender={cellTemplate} /> </div> <div className="options"> <div className="caption">Options</div> <div className="option"> <CheckBox defaultValue={false} text="Specified min value" onValueChanged={this.setMinDate} /> </div> <div className="option"> <CheckBox defaultValue={false} text="Specified max value" onValueChanged={this.setMaxDate} /> </div> <div className="option"> <CheckBox defaultValue={false} text="Disable weekend" onValueChanged={this.disableWeekend} /> </div> <div className="option"> <CheckBox defaultValue={false} text="Monday as the first day of a week" onValueChanged={this.setFirstDay} /> </div> <div className="option"> <CheckBox defaultValue={false} text="Use the Custom Cell Template" onValueChanged={this.useCellTemplate} /> </div> <div className="option"> <CheckBox value={disabled} text="Disabled" onValueChanged={this.onDisabledChanged} /> </div> <div className="option"> <span>Zoom level</span> <SelectBox id="zoom-level" dataSource={zoomLevels} value={zoomLevel} onValueChanged={this.onZoomLevelValueChanged} /> </div> <div className="option"> <span>Selected date</span> <DateBox id="selected-date" value={currentValue} width="100%" onValueChanged={this.onCurrentValueChanged} /> </div> </div> </div> ); } onCurrentValueChanged(e) { this.setState({ currentValue: e.value, }); } onDisabledChanged(e) { this.setState({ disabled: e.value, }); } onZoomLevelValueChanged(e) { this.setState({ zoomLevel: e.value, }); } onZoomLevelChanged(e) { if (e.name === 'zoomLevel') { this.setState({ zoomLevel: e.value, }); } } setMinDate(e) { this.setState({ minDateValue: e.value ? new Date((new Date()).getTime() - 1000 * 60 * 60 * 24 * 3) : null, }); } setMaxDate(e) { this.setState({ maxDateValue: e.value ? new Date((new Date()).getTime() + 1000 * 60 * 60 * 24 * 3) : null, }); } disableWeekend(e) { this.setState({ disabledDates: e.value ? (data) => data.view === 'month' && isWeekend(data.date) : null, }); } setFirstDay(e) { this.setState({ firstDay: e.value ? 1 : 0, }); } useCellTemplate(e) { this.setState({ cellTemplate: e.value ? CustomCell : null, }); } } function CustomCell(cell) { return ( <span className={getCellCssClass(cell.date)}> { cell.text } </span> ); } function getCellCssClass(date) { let cssClass = ''; const holydays = [[1, 0], [4, 6], [25, 11]]; if (isWeekend(date)) { cssClass = 'weekend'; } holydays.forEach((item) => { if (date.getDate() === item[0] && date.getMonth() === item[1]) { cssClass = 'holyday'; } }); return cssClass; } function isWeekend(date) { const day = date.getDay(); return day === 0 || day === 6; } export default App;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render( <App />, document.getElementById('app'), );
<!DOCTYPE html> <html> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/21.2.5/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/21.2.5/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" /> <link rel="stylesheet" type="text/css" href="styles.css" /> <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script type="text/javascript" src="config.js"></script> <script type="text/javascript"> System.import("./index.js"); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> </body> </html>
.widget-container { margin-right: 320px; } #calendar-container { margin: auto; } .dx-calendar-cell:not(.dx-calendar-other-month) .weekend, .dx-calendar-cell:not(.dx-calendar-other-month) .holyday { text-shadow: none; font-weight: bold; } .dx-calendar-cell:not(.dx-calendar-other-month) .weekend { color: #3030ff; } .dx-state-disabled.dx-calendar .dx-calendar-cell:not(.dx-calendar-other-month) .weekend { color: #8080ff; } .dx-calendar-cell:not(.dx-calendar-other-month) .holyday { color: #ff3030; } .dx-state-disabled.dx-calendar .dx-calendar-cell:not(.dx-calendar-other-month) .holyday { color: #ff8080; } .options { padding: 20px; background-color: rgba(191, 191, 191, 0.15); position: absolute; right: 0; top: 0; bottom: 0; width: 260px; } .caption { font-weight: 500; font-size: 18px; } .option { margin-top: 10px; }
window.config = { transpiler: 'plugin-babel', meta: { 'devextreme/localization.js': { 'esModule': true, }, }, paths: { 'npm:': 'https://unpkg.com/', }, defaultExtension: 'js', map: { 'react': 'npm:react@17.0.2/umd/react.development.js', 'react-dom': 'npm:react-dom@17.0.2/umd/react-dom.development.js', 'prop-types': 'npm:prop-types@15.8.1/prop-types.js', 'rrule': 'npm:rrule@2.6.6/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.28.0/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@21.2.5/cjs', 'devextreme-react': 'npm:devextreme-react@21.2.5', 'jszip': 'npm:jszip@3.7.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.5.11/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.1.45/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.0.3/dist/dx-gantt.js', '@devextreme/runtime': 'npm:@devextreme/runtime@2.3.14', 'inferno': 'npm:inferno@7.4.11/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat@7.4.11/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@7.4.11/dist/inferno-create-element.min.js', 'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js', 'inferno-hydrate': 'npm:inferno-hydrate@7.4.11/dist/inferno-hydrate.min.js', 'inferno-clone-vnode': 'npm:inferno-clone-vnode@7.4.11/dist/inferno-clone-vnode.min.js', 'inferno-create-class': 'npm:inferno-create-class@7.4.11/dist/inferno-create-class.min.js', 'inferno-extras': 'npm:inferno-extras@7.4.11/dist/inferno-extras.min.js', // SystemJS plugins 'plugin-babel': 'npm:systemjs-plugin-babel@0.0.25/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0.0.25/systemjs-babel-browser.js', }, packages: { 'devextreme': { defaultExtension: 'js', }, 'devextreme-react': { main: 'index.js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@2.3.14/inferno/package.json', ], babelOptions: { sourceMaps: false, stage0: true, react: true, }, }; System.config(window.config);