DevExtreme v24.2 is now available.

Explore our newest features/capabilities and share your thoughts with us.

Your search did not match any results.

JavaScript/jQuery Scheduler - Overview

DevExtreme JavaScript JavaScript Scheduler is a client-side scheduling component available as a jQuery plugin. This control can be bound to local or remote data including online services like Google Calendar. In this demo, JavaScript Scheduler is highly customized using templates. Appointments on the view are grouped by employee. View other demos in this section to explore more JavaScript Scheduler features, like multiple calendar views, appointment editing, time zones support, etc.

To get started with the DevExtreme JavaScript Scheduler component, refer to the following tutorial for step-by-step instructions: Getting Started with JavaScript Scheduler.

DevExtreme Accessibility Compliance
DevExtreme component libraries meet a variety of WCAG and Section 508 compliance standards. To assess this demo’s accessibility level, click the Run AXE® Validation button to launch the AXE® web accessibility evaluation tool.
All trademarks or registered trademarks are property of their respective owners. AXE® Terms of Use
The overall accessibility level of your application depends on the Scheduler features used.
Backend API
$(() => { $('.scheduler').dxScheduler({ timeZone: 'America/Los_Angeles', dataSource: data, views: ['month'], currentView: 'month', currentDate: new Date(2021, 5, 2, 11, 30), firstDayOfWeek: 1, startDayHour: 8, endDayHour: 18, showAllDayPanel: false, height: 710, groups: ['employeeID'], resources: [ { fieldExpr: 'employeeID', allowMultiple: false, dataSource: employees, label: 'Employee', }, ], dataCellTemplate(cellData, index, container) { const { employeeID } = cellData.groups; const currentTraining = getCurrentTraining(cellData.startDate.getDate(), employeeID); const wrapper = $('<div>') .toggleClass(`employee-weekend-${employeeID}`, isWeekEnd(cellData.startDate)).appendTo(container) .addClass(`employee-${employeeID}`) .addClass('dx-template-wrapper'); wrapper.append($('<div>') .text(cellData.text) .addClass(currentTraining) .addClass('day-cell')); }, resourceCellTemplate(cellData) { const name = $('<div>') .addClass('name') .css({ backgroundColor: cellData.color }) .append($('<h2>') .text(cellData.text)); const avatar = $('<div>') .addClass('avatar') .html(`<img src=${cellData.data.avatar} alt="${cellData.text} photo">`) .attr('title', cellData.text); const info = $('<div>') .addClass('info') .css({ color: cellData.color }) .html(`Age: ${cellData.data.age}<br/><b>${cellData.data.discipline}</b>`); return $('<div>').append([name, avatar, info]); }, }); 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; } });
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <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=5.0" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script>window.jQuery || document.write(decodeURIComponent('%3Cscript src="js/jquery.min.js"%3E%3C/script%3E'))</script> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/24.2.3/css/dx.light.css" /> <script src="js/dx.all.js"></script> <script src="data.js"></script> <link rel="stylesheet" type="text/css" href="styles.css" /> <script src="index.js"></script> </head> <body class="dx-viewport"> <div class="demo-container"> <div class="scheduler"></div> </div> </body> </html>
.dx-scheduler-group-header, .dx-scheduler-date-table-cell { position: relative; } .dx-scheduler-group-header-content { padding-left: 8px; } .dx-color-scheme-light, .dx-color-scheme-carmine, .dx-color-scheme-softblue, .dx-color-scheme-blue-light, .dx-color-scheme-saas-light, .dx-color-scheme-lime-light, .dx-color-scheme-orange-light, .dx-color-scheme-purple-light, .dx-color-scheme-teal-light { --text-color-1: rgba(0, 0, 0, .6); --text-color-2: rgba(255, 255, 255, 1); --disabled-color: rgba(0, 0, 0, 0.38); --background-color-1: rgba(50, 134, 56, 1); --background-color-2: rgba(194, 81, 0, 1); } .dx-color-scheme-dark, .dx-color-scheme-darkviolet, .dx-color-scheme-darkmoon, .dx-color-scheme-blue-dark, .dx-color-scheme-saas-dark, .dx-color-scheme-lime-dark, .dx-color-scheme-orange-dark, .dx-color-scheme-purple-dark, .dx-color-scheme-teal-dark { --text-color-1: rgba(255, 255, 255, 1); --text-color-2: rgba(54, 54, 64, 1); --disabled-color: rgba(255, 255, 255, 0.38); --background-color-1: rgba(159, 213, 161, 1); --background-color-2: rgba(255, 181, 127, 1); } .dx-scheduler-header .dx-toolbar .dx-button, .dx-scheduler-header .dx-toolbar .dx-button .dx-icon { color: var(--text-color-1); } .dx-scheduler-date-table-other-month.dx-scheduler-date-table-cell { opacity: 1; color: var(--disabled-color) !important; } .dx-scheduler-work-space-month .dx-scheduler-date-table-cell { color: var(--text-color-1); } .dx-scheduler-work-space-month .dx-scheduler-appointment, .dx-scheduler-work-space-month .dx-scheduler-appointment.dx-state-focused { color: var(--text-color-2); line-height: 22px; } .dx-scheduler-work-space-month .dx-scheduler-appointment .dx-scheduler-appointment-content { padding-top: 0; } .dx-scheduler-date-table-cell .dx-template-wrapper { position: absolute; height: 100%; width: 100%; padding-right: 6px; } .avatar { width: 124px; float: left; overflow: hidden; position: relative; height: 124px; border: 1px solid rgba(0, 0, 0, 0.24); border-radius: 50%; background-color: rgba(255, 255, 255, 1); } .avatar img { position: relative; width: 126px; height: 130px; object-fit: contain; } .avatar[title="John Heart"] img { top: 5px; left: 3px; } .avatar[title="Greta Sims"] img { top: 5px; left: -7px; } .name { position: absolute; bottom: 0; left: 0; width: 100%; } .name h2 { color: var(--text-color-2); font-size: 28px; text-align: left; padding: 0 0 0 170px; margin: 0; height: 40px; line-height: 40px; } .info { width: auto; text-align: left; height: 100%; font-size: 14px; line-height: 20px; font-weight: normal; padding: 25px 20px 25px 40px; color: #707070; } .dx-color-scheme-contrast .info { color: #fff; } .day-cell { width: 100%; height: 100%; background-position: center center; background-repeat: no-repeat; } .dx-scheduler-appointment { color: rgba(255, 255, 255, 1); } .employee-1 { background-color: rgba(55, 126, 58, 0.08); } .employee-2 { background-color: rgba(194, 81, 0, 0.08); } .employee-weekend-1 { background-color: rgba(55, 126, 58, 0.12); } .employee-weekend-2 { background-color: rgba(194, 81, 0, 0.12); } .training-background-0 { background-image: url("../../../../images/Scheduler/Overview/icon-abs.png"); } .training-background-1 { background-image: url("../../../../images/Scheduler/Overview/icon-step.png"); } .training-background-2 { background-image: url("../../../../images/Scheduler/Overview/icon-fitball.png"); }
const employees = [{ text: 'John Heart', id: 1, color: 'var(--background-color-1)', avatar: '../../../../images/employees/19.png', age: 27, discipline: 'ABS, Fitball, StepFit', }, { text: 'Greta Sims', id: 2, color: 'var(--background-color-2)', avatar: '../../../../images/employees/31.png', age: 25, discipline: 'ABS, Fitball, StepFit', }]; const data = [ { text: 'Helen', employeeID: 2, startDate: new Date('2021-06-01T16:30:00.000Z'), endDate: new Date('2021-06-01T18:30:00.000Z'), }, { text: 'Helen', employeeID: 2, startDate: new Date('2021-06-10T16:30:00.000Z'), endDate: new Date('2021-06-11T18:30:00.000Z'), }, { text: 'Alex', employeeID: 1, startDate: new Date('2021-06-02T16:30:00.000Z'), endDate: new Date('2021-06-02T18:30:00.000Z'), }, { text: 'Alex', employeeID: 1, startDate: new Date('2021-06-11T19:00:00.000Z'), endDate: new Date('2021-06-11T20:00:00.000Z'), }, { text: 'Alex', employeeID: 2, startDate: new Date('2021-06-16T16:30:00.000Z'), endDate: new Date('2021-06-16T18:30:00.000Z'), }, { text: 'Stan', employeeID: 1, startDate: new Date('2021-06-07T16:30:00.000Z'), endDate: new Date('2021-06-07T18:30:00.000Z'), }, { text: 'Stan', employeeID: 1, startDate: new Date('2021-06-28T16:30:00.000Z'), endDate: new Date('2021-06-28T18:30:00.000Z'), }, { text: 'Stan', employeeID: 1, startDate: new Date('2021-06-30T16:30:00.000Z'), endDate: new Date('2021-06-30T18:30:00.000Z'), }, { text: 'Rachel', employeeID: 2, startDate: new Date('2021-06-04T16:30:00.000Z'), endDate: new Date('2021-06-04T18:30:00.000Z'), }, { text: 'Rachel', employeeID: 2, startDate: new Date('2021-06-07T16:30:00.000Z'), endDate: new Date('2021-06-07T18:30:00.000Z'), }, { text: 'Rachel', employeeID: 1, startDate: new Date('2021-06-21T16:30:00.000Z'), endDate: new Date('2021-06-21T18:30:00.000Z'), }, { text: 'Kelly', employeeID: 2, startDate: new Date('2021-06-15T16:30:00.000Z'), endDate: new Date('2021-06-15T18:30:00.000Z'), }, { text: 'Kelly', employeeID: 2, startDate: new Date('2021-06-29T16:30:00.000Z'), endDate: new Date('2021-06-29T18:30:00.000Z'), }, ];