DevExtreme v26.1 is now available.

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

Your search did not match any results.

Angular 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
<div class="options"> <div class="option"> <div class="label">Work Hours:</div> <div class="value"> <dx-radio-group [items]="shifts" [(value)]="currentShift" layout="horizontal" > </dx-radio-group> </div> </div> </div> <br /> <dx-scheduler timeZone="America/Los_Angeles" [dataSource]="appointments" [views]="['day', 'workWeek']" currentView="workWeek" [currentDate]="currentDate" [startDayHour]="0" [endDayHour]="8" [cellDuration]="60" [offset]="currentShift.offset" [showAllDayPanel]="false" > </dx-scheduler>
import { bootstrapApplication } from '@angular/platform-browser'; import { Component, enableProdMode, provideZoneChangeDetection } from '@angular/core'; import { DxSchedulerModule, DxRadioGroupModule } from 'devextreme-angular'; import { Service, Appointment, Shift } from './app.service'; if (!/localhost/.test(document.location.host)) { enableProdMode(); } @Component({ selector: 'demo-app', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], providers: [Service], imports: [ DxSchedulerModule, DxRadioGroupModule, ], }) export class AppComponent { appointments: Appointment[]; shifts: Shift[]; currentShift: Shift; currentDate: Date = new Date(2021, 2, 30); constructor(service: Service) { this.appointments = service.getAppointments(); this.shifts = service.getShifts(); this.currentShift = this.shifts[0]; } } bootstrapApplication(AppComponent, { providers: [ provideZoneChangeDetection({ eventCoalescing: true, runCoalescing: true }), ], });
.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; }
import { Injectable } from '@angular/core'; export type Shift = { text: string; offset: number; }; export 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', }]; @Injectable() export class Service { getShifts() { return shifts; } getAppointments() { return appointments; } }
<!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" /> </head> <body class="dx-viewport"> <div class="demo-container"> <demo-app>Loading...</demo-app> </div> <script src="https://cdn.jsdelivr.net/npm/zone.js@0.16.2/bundles/zone.umd.js"></script> <script src="./bundle.js" type="module"></script> </body> </html>