DevExtreme v26.1 is now available.

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

Your search did not match any results.

React Scheduler - Work Shifts

This demo uses the Scheduler component’s offset property to indicate the starting point of a day. The Scheduler’s offset can be set in multiples of 5 and can range from -1440 minutes (-24 hours) to 1440 minutes (24 hours).

For instance, if you set the offset to -120, like the First shift in this demo, the day begins at 10:00 PM on the previous day instead of 00:00. If you set the offset to 360, like the Second shift, the day begins at 6:00 AM.

You can also combine this property with startDayHour, endDayHour, and cellDuration to obtain desired display results.

Backend API
import React, { useState } from 'react'; import Scheduler from 'devextreme-react/scheduler'; import type { SchedulerTypes } from 'devextreme-react/scheduler'; import RadioGroup from 'devextreme-react/radio-group'; import { data, shifts } from './data.ts'; const currentDate = new Date(2021, 2, 30); const views: SchedulerTypes.ViewType[] = ['day', 'workWeek']; const App = () => { const [currentShift, setCurrentShift] = useState(shifts[0]); return <> <div className="options"> <div className="option"> <div className="label">Work Hours:</div> <div className="value"> <RadioGroup defaultValue={shifts[0]} items={shifts} layout= 'horizontal' onValueChange={setCurrentShift} /> </div> </div> </div> <br /> <Scheduler timeZone= 'America/Los_Angeles' dataSource={data} views={views} defaultCurrentView='workWeek' currentDate={currentDate} startDayHour= {0} endDayHour= {8} offset={currentShift.offset} cellDuration={60} showAllDayPanel={false} /> </>; }; export default App;
import React, { useState } from 'react'; import Scheduler from 'devextreme-react/scheduler'; import RadioGroup from 'devextreme-react/radio-group'; import { data, shifts } from './data.js'; const currentDate = new Date(2021, 2, 30); const views = ['day', 'workWeek']; const App = () => { const [currentShift, setCurrentShift] = useState(shifts[0]); return ( <> <div className="options"> <div className="option"> <div className="label">Work Hours:</div> <div className="value"> <RadioGroup defaultValue={shifts[0]} items={shifts} layout="horizontal" onValueChange={setCurrentShift} /> </div> </div> </div> <br /> <Scheduler timeZone="America/Los_Angeles" dataSource={data} views={views} defaultCurrentView="workWeek" currentDate={currentDate} startDayHour={0} endDayHour={8} offset={currentShift.offset} cellDuration={60} showAllDayPanel={false} /> </> ); }; export default App;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.tsx'; ReactDOM.render( <App />, document.getElementById('app'), );
import type { SchedulerTypes } from 'devextreme-react/scheduler'; type Shift = { text: string; offset: number; }; export const shifts: Shift[] = [{ text: 'First shift', offset: -120, }, { text: 'Second shift', offset: 360, }, { text: 'Third shift', offset: 840, }]; export const data: SchedulerTypes.Appointment[] = [{ text: 'Website Re-Design Plan', startDate: '2021-03-29T16:00:00.000Z', endDate: '2021-03-29T18:00:00.000Z', }, { text: 'Approve Personal Computer Upgrade Plan', startDate: '2021-03-31T01:30:00.000Z', endDate: '2021-03-31T03:00:00.000Z', }, { text: 'Final Budget Review', startDate: '2021-03-30T16:30:00.000Z', endDate: '2021-03-30T18:05:00.000Z', }, { text: 'New Brochures', startDate: '2021-04-01T23:30:00.000Z', endDate: '2021-04-02T02:30:00.000Z', }, { text: 'Approve New Online Marketing Strategy', startDate: '2021-03-31T16:30:00.000Z', endDate: '2021-03-31T18:30:00.000Z', }, { text: 'Prepare 2021 Marketing Plan', startDate: '2021-04-01T16:30:00.000Z', endDate: '2021-04-01T18:00:00.000Z', }, { text: 'Brochure Design Review', startDate: '2021-04-02T17:30:00.000Z', endDate: '2021-04-02T19:00:00.000Z', }, { text: 'Create Icons for Website', startDate: '2021-04-01T18:00:00.000Z', endDate: '2021-04-01T19:30:00.000Z', }, { text: 'Submit New Website Design', startDate: '2021-04-02T09:30:00.000Z', endDate: '2021-04-02T11:00:00.000Z', }, { text: 'Launch New Website', startDate: '2021-04-01T01:30:00.000Z', endDate: '2021-04-01T03:00:00.000Z', recurrenceRule: 'FREQ=WEEKLY;BYDAY=WE;INTERVAL=2', }, { text: 'Install New Router in Dev Room', startDate: '2021-03-29T08:00:00.000Z', endDate: '2021-03-29T09:00:00.000Z', }, { text: 'Upgrade Personal Computers', startDate: '2021-03-30T01:00:00.000Z', endDate: '2021-03-30T03:00:00.000Z', }, { text: 'Install New Database', startDate: '2021-03-31T08:30:00.000Z', endDate: '2021-03-31T10:00:00.000Z', }, { text: 'Update Customer Shipping Profiles', startDate: '2021-04-01T09:30:00.000Z', endDate: '2021-04-01T11:00:00.000Z', recurrenceRule: 'FREQ=WEEKLY;BYDAY=TH', }, { text: 'Upgrade Server Hardware', startDate: '2021-03-30T08:30:00.000Z', endDate: '2021-03-30T11:00:00.000Z', recurrenceRule: 'FREQ=MONTHLY;BYMONTHDAY=30', }];
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render(<App />, document.getElementById('app'));
export const shifts = [ { text: 'First shift', offset: -120, }, { text: 'Second shift', offset: 360, }, { text: 'Third shift', offset: 840, }, ]; export const data = [ { text: 'Website Re-Design Plan', startDate: '2021-03-29T16:00:00.000Z', endDate: '2021-03-29T18:00:00.000Z', }, { text: 'Approve Personal Computer Upgrade Plan', startDate: '2021-03-31T01:30:00.000Z', endDate: '2021-03-31T03:00:00.000Z', }, { text: 'Final Budget Review', startDate: '2021-03-30T16:30:00.000Z', endDate: '2021-03-30T18:05:00.000Z', }, { text: 'New Brochures', startDate: '2021-04-01T23:30:00.000Z', endDate: '2021-04-02T02:30:00.000Z', }, { text: 'Approve New Online Marketing Strategy', startDate: '2021-03-31T16:30:00.000Z', endDate: '2021-03-31T18:30:00.000Z', }, { text: 'Prepare 2021 Marketing Plan', startDate: '2021-04-01T16:30:00.000Z', endDate: '2021-04-01T18:00:00.000Z', }, { text: 'Brochure Design Review', startDate: '2021-04-02T17:30:00.000Z', endDate: '2021-04-02T19:00:00.000Z', }, { text: 'Create Icons for Website', startDate: '2021-04-01T18:00:00.000Z', endDate: '2021-04-01T19:30:00.000Z', }, { text: 'Submit New Website Design', startDate: '2021-04-02T09:30:00.000Z', endDate: '2021-04-02T11:00:00.000Z', }, { text: 'Launch New Website', startDate: '2021-04-01T01:30:00.000Z', endDate: '2021-04-01T03:00:00.000Z', recurrenceRule: 'FREQ=WEEKLY;BYDAY=WE;INTERVAL=2', }, { text: 'Install New Router in Dev Room', startDate: '2021-03-29T08:00:00.000Z', endDate: '2021-03-29T09:00:00.000Z', }, { text: 'Upgrade Personal Computers', startDate: '2021-03-30T01:00:00.000Z', endDate: '2021-03-30T03:00:00.000Z', }, { text: 'Install New Database', startDate: '2021-03-31T08:30:00.000Z', endDate: '2021-03-31T10:00:00.000Z', }, { text: 'Update Customer Shipping Profiles', startDate: '2021-04-01T09:30:00.000Z', endDate: '2021-04-01T11:00:00.000Z', recurrenceRule: 'FREQ=WEEKLY;BYDAY=TH', }, { text: 'Upgrade Server Hardware', startDate: '2021-03-30T08:30:00.000Z', endDate: '2021-03-30T11:00:00.000Z', recurrenceRule: 'FREQ=MONTHLY;BYMONTHDAY=30', }, ];
<!DOCTYPE html> <html 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" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/26.1.5/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="./bundle.css" /> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> <script src="bundles/vendor/react.vendor.js"></script> <script src="./bundle.js"></script> </body> </html>
.options { background-color: rgba(191, 191, 191, 0.15); margin-top: 20px; display: flex; align-items: flex-start; height: 100%; } .option { padding: 16px; display: flex; align-items: center; } .label, .value { display: inline-block; vertical-align: middle; } .label { width: 100px; }