Your search did not match any results.
Scheduler

Overview

DevExtreme HTML5 JavaScript Scheduler is a React component for scheduling. It implements all the features necessary for its purpose: flexible data binding, easy appointment editing, multiple calendar views, time zones support, and more. Advanced UI customization is carried out using template components and render props. Declared PropTypes for typechecking are also included. Learn more about DevExtreme React components.

Copy to CodeSandBox
Apply
Reset
import React from 'react'; import Scheduler, { Resource } from 'devextreme-react/scheduler'; import { employees, data } from './data.js'; import DataCell from './DataCell.js'; import ResourceCell from './ResourceCell.js'; const currentDate = new Date(2016, 7, 2, 11, 30); const groups = ['employeeID']; const views = ['month']; class App extends React.Component { render() { return ( <Scheduler dataSource={data} dataCellComponent={DataCell} resourceCellComponent={ResourceCell} groups={groups} views={views} defaultCurrentView={'month'} defaultCurrentDate={currentDate} height={600} showAllDayPanel={true} firstDayOfWeek={1} startDayHour={8} endDayHour={18} > <Resource label={'Employee'} fieldExpr={'employeeID'} dataSource={employees} allowMultiple={false} /> </Scheduler> ); } } export default App;
import React from 'react'; function isWeekEnd(date) { const day = date.getDay(); return day === 0 || day === 6; } function getCurrentTraining(date, employeeID) { const result = (date + employeeID) % 3; const currentTraining = `training-background-${result}`; return currentTraining; } class DataCell extends React.PureComponent { render() { const { data: { startDate, groups: { employeeID }, text } } = this.props; const dayClasses = [ 'day-cell', getCurrentTraining(startDate.getDate(), employeeID) ]; const employeeClasses = [ `employee-${employeeID}`, 'dx-template-wrapper' ]; if (isWeekEnd(startDate)) { employeeClasses.push(`employee-weekend-${employeeID}`); } return ( <div className={employeeClasses.join(' ')}> <div className={dayClasses.join(' ')}> {text} </div> </div> ); } } export default DataCell;
import React from 'react'; class ResourceCell extends React.PureComponent { render() { const { data: { color, text, data: { avatar, age, discipline } } } = this.props; return ( <div className={'dx-template-wrapper'}> <div className={'name'} style={{ background: color }}> <h2>{text}</h2> </div> <div className={'avatar'}> <img src={avatar} /> </div> <div className={'info'} style={{ color: color }}> Age: {age} <br /> <b>{discipline}</b> </div> </div> ); } } export default ResourceCell;
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/19.1.7/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.1.7/css/dx.light.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>
.dx-scheduler-date-table-other-month.dx-scheduler-date-table-cell { opacity: 1; color: rgba(0, 0, 0, 0.3); } .dx-template-wrapper, .dx-scheduler-date-table-cell { position: relative; } .dx-scheduler-date-table-cell .dx-template-wrapper { position: absolute; height: 100%; width: 100%; } .avatar { width: 155px; float: left; overflow: hidden; position: relative; height: 125px; } .name { position: absolute; bottom: 0; left: 0; width: 100%; } .name h2 { color: #fff; text-align: left; padding: 0 0 5px 175px; margin: 0; } .dx-theme-material .name h2 { font-size: 28px; } .info { width: auto; text-align: left; height: 100%; font-size: 11pt; font-weight: normal; padding: 25px 20px; color: #707070; } .dx-color-scheme-contrast .info { color: #FFF; } .userInfo div { margin: 20px; } .day-cell { height: 100%; background-position: center center; background-repeat: no-repeat; } .employee-1 { background-color: rgba(86, 202, 133, 0.1); } .employee-2 { background-color: rgba(255, 151, 71, 0.1); } .employee-weekend-1 { background-color: rgba(86, 202, 133, 0.2); } .employee-weekend-2 { background-color: rgba(255, 151, 71, 0.2); } .training-background-0 { background-image: url("../../../../images/gym/icon-abs.png"); } .training-background-1 { background-image: url("../../../../images/gym/icon-step.png"); } .training-background-2 { background-image: url("../../../../images/gym/icon-fitball.png"); }
export const employees = [{ text : 'John Heart', id: 1, color: '#56ca85', avatar: '../../../../images/gym/coach-man.png', age: 27, discipline: 'ABS, Fitball, StepFit' }, { text : 'Sandra Johnson', id: 2, color: '#ff9747', avatar: '../../../../images/gym/coach-woman.png', age: 25, discipline: 'ABS, Fitball, StepFit' }]; export const data = [{ text: 'Helen', employeeID: 2, startDate: new Date(2016, 7, 2, 9, 30), endDate: new Date(2016, 7, 2, 11, 30) }, { text: 'Helen', employeeID: 2, startDate: new Date(2016, 7, 11, 9, 30), endDate: new Date(2016, 7, 12, 11, 30) }, { text: 'Alex', employeeID: 1, startDate: new Date(2016, 7, 3, 9, 30), endDate: new Date(2016, 7, 3, 11, 30) }, { text: 'Alex', employeeID: 1, startDate: new Date(2016, 7, 12, 12, 0), endDate: new Date(2016, 7, 12, 13, 0) }, { text: 'Alex', employeeID: 2, startDate: new Date(2016, 7, 17, 9, 30), endDate: new Date(2016, 7, 17, 11, 30) }, { text: 'Stan', employeeID: 1, startDate: new Date(2016, 7, 8, 9, 30), endDate: new Date(2016, 7, 8, 11, 30) }, { text: 'Stan', employeeID: 1, startDate: new Date(2016, 7, 29, 9, 30), endDate: new Date(2016, 7, 29, 11, 30) }, { text: 'Stan', employeeID: 1, startDate: new Date(2016, 7, 31, 9, 30), endDate: new Date(2016, 7, 31, 11, 30) }, { text: 'Rachel', employeeID: 2, startDate: new Date(2016, 7, 5, 9, 30), endDate: new Date(2016, 7, 5, 11, 30) }, { text: 'Rachel', employeeID: 2, startDate: new Date(2016, 7, 8, 9, 30), endDate: new Date(2016, 7, 8, 11, 30) }, { text: 'Rachel', employeeID: 1, startDate: new Date(2016, 7, 22, 9, 30), endDate: new Date(2016, 7, 22, 11, 30) }, { text: 'Kelly', employeeID: 2, startDate: new Date(2016, 7, 16, 9, 30), endDate: new Date(2016, 7, 16, 11, 30) }, { text: 'Kelly', employeeID: 2, startDate: new Date(2016, 7, 30, 9, 30), endDate: new Date(2016, 7, 30, 11, 30) }];
System.config({ transpiler: 'plugin-babel', paths: { 'npm:': 'https://unpkg.com/' }, defaultExtension: 'js', map: { 'react': 'npm:react@16/umd/react.development.js', 'react-dom': 'npm:react-dom@16/umd/react-dom.development.js', 'prop-types': 'npm:prop-types/prop-types.js', 'devextreme': 'npm:devextreme@19.1', 'devextreme-react': 'npm:devextreme-react@19.1', 'jszip': 'npm:jszip@3.1.3/dist/jszip.min.js', 'quill': 'npm:quill@1.3.7/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram', // SystemJS plugins 'plugin-babel': 'npm:systemjs-plugin-babel@0/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0/systemjs-babel-browser.js' }, packages: { 'devextreme': { defaultExtension: 'js' }, 'devextreme-react': { main: 'index.js' } }, babelOptions: { sourceMaps: false, stage0: true, react: true } });