DevExtreme v25.1 is now available.

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

Your search did not match any results.

JavaScript/jQuery Scheduler - Toolbar

The DevExtreme JavaScript Scheduler ships with a customizable toolbar UI element. You can populate the toolbar with predefined and custom items—in any display order. This demo adds the "today" predefined control and two DevExtreme components to the toolbar.

Backend API
$(() => { const MS_IN_HOUR = 60 * 1000; const scheduler = $('#scheduler').dxScheduler({ timeZone: 'America/Los_Angeles', dataSource: schedulerDataSource, views: ['day', 'week', 'workWeek', 'month'], currentView: 'workWeek', currentDate, startDayHour: 9, endDayHour: 19, resources: [{ fieldExpr: 'assigneeId', allowMultiple: true, dataSource: assignees, label: 'Assignee', }], toolbar: { items: [ 'today', 'dateNavigator', { location: 'before', locateInMenu: 'auto', widget: 'dxButton', options: { icon: 'plus', text: 'New Appointment', stylingMode: 'outlined', type: 'normal', onClick() { const selected = scheduler.option('selectedCellData'); if (selected.length) { const firstSelected = selected[0]; const lastSelected = selected.at(-1); scheduler.showAppointmentPopup({ ...firstSelected.groups, allDay: firstSelected.allDay, startDate: new Date(firstSelected.startDateUTC), endDate: new Date(lastSelected.endDateUTC), }, true); return; } const currentDate = scheduler.option('currentDate'); const cellDuration = scheduler.option('cellDuration') * MS_IN_HOUR; const currentTime = currentDate.getTime(); const roundTime = Math.round(currentTime / cellDuration) * cellDuration; scheduler.showAppointmentPopup({ startDate: new Date(roundTime), endDate: new Date(roundTime + cellDuration), }, true); }, }, }, { location: 'before', locateInMenu: 'auto', widget: 'dxSelectBox', options: { placeholder: 'Select Employee', items: assignees, showClearButton: true, displayExpr: 'text', valueExpr: 'id', inputAttr: { 'aria-label': 'Select Employee', }, width: 200, onValueChanged({ value }) { const dataSource = scheduler.option('dataSource'); const filter = value ? ['assigneeId', 'contains', value] : null; dataSource.filter(filter); scheduler.option('dataSource', dataSource); }, }, }, { location: 'after', locateInMenu: 'auto', name: 'viewSwitcher', }, ], }, height: 600, }).dxScheduler('instance'); });
<!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/25.1.3/css/dx.light.css" /> <script src="js/dx.all.js"></script> <script src="data.js"></script> <script src="index.js"></script> <link rel="stylesheet" type="text/css" href="styles.css" /> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="scheduler"></div> </div> </body> </html>
const ONE_MONTH_DAYS = 30; const addDays = (date, days) => new Date(new Date(date).setUTCDate(date.getUTCDate() + days)); const now = new Date(new Date().setUTCHours(0, 0, 0, 0)); const startOfTheWeek = addDays(now, -now.getUTCDay()); const currentDate = addDays(now, ONE_MONTH_DAYS); const currentStartOfTheWeek = addDays(currentDate, -currentDate.getUTCDay()); const data = [ { text: 'Website Re-Design Plan', assigneeId: [4], startDate: addDays(startOfTheWeek, 1).setUTCHours(16, 30), endDate: addDays(startOfTheWeek, 1).setUTCHours(18, 30), }, { text: 'Book Flights to San Fran for Sales Trip', assigneeId: [2], startDate: addDays(startOfTheWeek, 2).setUTCHours(19), endDate: addDays(startOfTheWeek, 2).setUTCHours(20), allDay: true, }, { text: 'Install New Router in Dev Room', assigneeId: [1], startDate: addDays(startOfTheWeek, 2).setUTCHours(21, 30), endDate: addDays(startOfTheWeek, 2).setUTCHours(22, 30), }, { text: 'Approve Personal Computer Upgrade Plan', assigneeId: [3], startDate: addDays(startOfTheWeek, 3).setUTCHours(17), endDate: addDays(startOfTheWeek, 3).setUTCHours(18), }, { text: 'Final Budget Review', assigneeId: [1], startDate: addDays(startOfTheWeek, 3).setUTCHours(19), endDate: addDays(startOfTheWeek, 3).setUTCHours(20, 35), }, { text: 'New Brochures', assigneeId: [4], startDate: addDays(startOfTheWeek, 3).setUTCHours(21, 30), endDate: addDays(startOfTheWeek, 3).setUTCHours(22, 45), }, { text: 'Install New Database', assigneeId: [2], startDate: addDays(startOfTheWeek, 4).setUTCHours(16, 45), endDate: addDays(startOfTheWeek, 4).setUTCHours(18, 15), }, { text: 'Approve New Online Marketing Strategy', assigneeId: [4], startDate: addDays(currentStartOfTheWeek, 1).setUTCHours(19), endDate: addDays(currentStartOfTheWeek, 1).setUTCHours(21), }, { text: 'Upgrade Personal Computers', assigneeId: [2], startDate: addDays(currentStartOfTheWeek, 1).setUTCHours(22, 15), endDate: addDays(currentStartOfTheWeek, 1).setUTCHours(23, 30), }, { text: 'Customer Workshop', assigneeId: [3], startDate: addDays(startOfTheWeek, 5).setUTCHours(18), endDate: addDays(startOfTheWeek, 5).setUTCHours(19), recurrenceRule: 'FREQ=WEEKLY;INTERVAL=1', }, { text: 'Prepare 2021 Marketing Plan', assigneeId: [1], startDate: addDays(currentStartOfTheWeek, 2).setUTCHours(18), endDate: addDays(currentStartOfTheWeek, 2).setUTCHours(20, 30), }, { text: 'Brochure Design Review', assigneeId: [4], startDate: addDays(startOfTheWeek, 5).setUTCHours(21), endDate: addDays(startOfTheWeek, 5).setUTCHours(22, 30), }, { text: 'Create Icons for Website', assigneeId: [3], startDate: addDays(currentStartOfTheWeek, 3).setUTCHours(17), endDate: addDays(currentStartOfTheWeek, 3).setUTCHours(18, 30), }, { text: 'Upgrade Server Hardware', assigneeId: [4], startDate: addDays(currentStartOfTheWeek, 2).setUTCHours(16), endDate: addDays(currentStartOfTheWeek, 2).setUTCHours(17, 30), }, { text: 'Submit New Website Design', assigneeId: [1], startDate: addDays(currentStartOfTheWeek, 5).setUTCHours(23, 30), endDate: addDays(currentStartOfTheWeek, 6).setUTCHours(1), }, { text: 'Launch New Website', assigneeId: [2], startDate: addDays(currentStartOfTheWeek, 4).setUTCHours(19), endDate: addDays(currentStartOfTheWeek, 4).setUTCHours(21), }, ]; const schedulerDataSource = new DevExpress.data.DataSource(data); const assignees = [ { text: 'Samantha Bright', id: 1, }, { text: 'John Heart', id: 2, }, { text: 'Todd Hoffman', id: 3, }, { text: 'Sandra Johnson', id: 4, }, ];

To customize the JavaScript Scheduler toolbar in your DevExtreme-powered app, add items to the toolbar.items[] array. DevExtreme JavaScript Scheduler supports the following toolbar item types:

  • Predefined Controls

    • "dateNavigator"
      Displays a ButtonGroup component with next/previous buttons and a date interval button that invokes a dropdown calendar. Define options.items to customize the control. You can add new buttons, and specify button availability/order.
    • "viewSwitcher"
      Switches between view types (day, week, month, and others).
    • "today"
      A "Today" button (navigates to the current date).
  • DevExtreme Components
    You can configure a DevExtreme component within a toolbar item element. In this demo, we extended the toolbar with a Button and SelectBox.

  • Custom Controls
    Specify items[].template to implement custom controls.

The default JavaScript Scheduler toolbar displays "dateNavigator" and "viewSwitcher" predefined controls.