DevExtreme v26.1 is now available.

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

Your search did not match any results.

Vue 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
<template> <div class="options"> <div class="option"> <div class="label">Work Hours:</div> <div class="value"> <DxRadioGroup :items="shifts" :value="shifts[0]" layout="horizontal" :on-value-changed="onShiftChanged" /> </div> </div> </div> <br> <DxScheduler time-zone="America/Los_Angeles" :data-source="appointments" :current-date="currentDate" :views="views" current-view="workWeek" :start-day-hour="0" :end-day-hour="8" :offset="currentOffset" :cell-duration="60" :show-all-day-panel="false" /> </template> <script setup lang="ts"> import { ref } from 'vue'; import DxScheduler from 'devextreme-vue/scheduler'; import DxRadioGroup, { type DxRadioGroupTypes } from 'devextreme-vue/radio-group'; import { appointments, shifts } from './data.ts'; const views = ['day', 'workWeek']; const currentDate = new Date(2021, 2, 30); const currentOffset = ref(shifts[0].offset); function onShiftChanged(e: DxRadioGroupTypes.ValueChangedEvent) { currentOffset.value = e.value.offset as number; } </script> <style> .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; } </style>
type Shift = { text: string; offset: number; }; type Appointment = { text: string, startDate: string, endDate: string, recurrenceRule?: string, }; export const shifts: Shift[] = [{ text: 'First shift', offset: -120, }, { text: 'Second shift', offset: 360, }, { text: 'Third shift', offset: 840, }]; export const appointments: 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 { createApp } from 'vue'; import App from './App.vue'; createApp(App).mount('#app');
<!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/vue.vendor.js"></script> <script src="./bundle.js"></script> </body> </html>