Your search did not match any results.
Scheduler

SignalR Service

Documentation

This demo shows how two users can edit data in the Scheduler simultaneously. A SignalR service is used to broadcast push notifications.

Each Scheduler has an individual store to emulate the situation when Schedulers are being edited on two different clients. Changes made in one Scheduler are repeated in the other and persist until the browser session has expired.

Copy to CodeSandBox
Apply
Reset
<div class="schedulers"> <div class="column-1"> <dx-scheduler [dataSource]="store1" [remoteFiltering] ="true" [views]='["day", "workWeek"]' currentView="day" [currentDate]="currentDate" [startDayHour]="9" [endDayHour]="19" [height]="600" textExpr="Text" descriptionExpr="Description" startDateExpr="StartDate" endDateExpr="EndDate" allDayExpr="AllDay"> </dx-scheduler> </div> <div class="column-2"> <dx-scheduler [dataSource]="store2" [remoteFiltering] ="true" [views]='["day", "workWeek"]' currentView="day" [currentDate]="currentDate" [startDayHour]="9" [endDayHour]="19" [height]="600" textExpr="Text" startDateExpr="StartDate" endDateExpr="EndDate" allDayExpr="AllDay"> </dx-scheduler> </div> </div>
import { NgModule, Component, enableProdMode } from '@angular/core'; import {BrowserModule} from '@angular/platform-browser'; import {platformBrowserDynamic} from '@angular/platform-browser-dynamic'; import { HubConnectionBuilder, HttpTransportType } from '@aspnet/signalr'; import {DxSchedulerModule} from 'devextreme-angular'; import * as AspNetData from 'devextreme-aspnet-data-nojquery'; if (!/localhost/.test(document.location.host)) { enableProdMode(); } const BASE_PATH = 'https://js.devexpress.com/Demos/NetCore/'; const url = BASE_PATH + 'api/SchedulerSignalR'; const createStore = () => AspNetData.createStore({ key: 'AppointmentId', loadUrl: url, insertUrl: url, updateUrl: url, deleteUrl: url, onBeforeSend: function(method, ajaxOptions) { ajaxOptions.xhrFields = { withCredentials: true }; } }); const store1 = createStore(); const store2 = createStore(); const connection = new HubConnectionBuilder() .withUrl(BASE_PATH + 'schedulerSignalRHub', { skipNegotiation: true, transport: HttpTransportType.WebSockets }) .build(); connection .start() .then(() => { connection.on('update', (key, data) => { store1.push([{ type: 'update', key: key, data: data }]); store2.push([{ type: 'update', key: key, data: data }]); }); connection.on('insert', (data) => { store1.push([{ type: 'insert', data: data }]); store2.push([{ type: 'insert', data: data }]); }); connection.on('remove', (key) => { store1.push([{ type: 'remove', key: key }]); store2.push([{ type: 'remove', key: key }]); }); }); @Component({ selector: 'demo-app', templateUrl: 'app/app.component.html', styleUrls: ['app/app.component.css'] }) export class AppComponent { store1: any; store2: any; currentDate: Date = new Date(2017, 4, 23); constructor() { this.store1 = store1; this.store2 = store2; } } @NgModule({ imports: [ BrowserModule, DxSchedulerModule ], declarations: [AppComponent], bootstrap: [AppComponent] }) export class AppModule { } platformBrowserDynamic().bootstrapModule(AppModule)
::ng-deep .schedulers { display: flex; } ::ng-deep .column-1 { padding-right: 5px; } ::ng-deep .column-2 { padding-left: 5px; } ::ng-deep .dx-scheduler-small .dx-scheduler-view-switcher.dx-tabs { display: table; }
// In real applications, you should not transpile code in the browser. You can see how to create your own application with Angular 2 and DevExtreme here: // https://github.com/DevExpress/devextreme-angular/blob/master/README.md System.config({ transpiler: 'ts', typescriptOptions: { module: "commonjs", emitDecoratorMetadata: true, experimentalDecorators: true }, meta: { 'typescript': { "exports": "ts" }, 'devextreme-aspnet-data-nojquery': { "esModule": true } }, paths: { 'npm:': 'https://unpkg.com/' }, map: { 'ts': 'npm:plugin-typescript@8.0.0/lib/plugin.js', 'typescript': 'npm:typescript@3.4.5/lib/typescript.js', '@angular/core': 'npm:@angular/core@8.0.0/bundles/core.umd.js', '@angular/common': 'npm:@angular/common@8.0.0/bundles/common.umd.js', '@angular/compiler': 'npm:@angular/compiler@8.0.0/bundles/compiler.umd.js', '@angular/platform-browser': 'npm:@angular/platform-browser@8.0.0/bundles/platform-browser.umd.js', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic@8.0.0/bundles/platform-browser-dynamic.umd.js', '@angular/router': 'npm:@angular/router@8.0.0/bundles/router.umd.js', '@angular/forms': 'npm:@angular/forms@8.0.0/bundles/forms.umd.js', '@angular/common/http': 'npm:@angular/common@8.0.0/bundles/common-http.umd.js', '@aspnet/signalr': 'npm:@aspnet/signalr@1.0.0/dist/cjs/index.js', 'tslib': 'npm:tslib/tslib.js', 'rxjs': 'npm:rxjs@6.3.3', 'rxjs/operators': 'npm:rxjs@6.3.3/operators', 'devextreme': 'npm:devextreme@19.1', 'jszip': 'npm:jszip@3.1.3/dist/jszip.min.js', 'quill': 'npm:quill@1.3.6/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram', 'devextreme-angular': 'npm:devextreme-angular@19.1', 'devextreme-aspnet-data-nojquery': 'npm:devextreme-aspnet-data-nojquery@2.4.2' }, packages: { 'app': { main: './app.component.ts', defaultExtension: 'ts' }, 'devextreme': { defaultExtension: 'js' }, 'rxjs': { main: 'index.js', defaultExtension: 'js' }, 'rxjs/operators': { main: 'index.js', defaultExtension: 'js' }, 'devextreme-angular': { main: 'index.js', defaultExtension: 'js' } } });
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <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=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.1.5/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.1.5/css/dx.light.css" /> <script src="js/signalr/signalr-session-id.js"></script> <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <script src="https://unpkg.com/zone.js@0.6.25/dist/zone.js"></script> <script src="https://unpkg.com/reflect-metadata@0.1.3/Reflect.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script src="config.js"></script> <script> System.import('app').catch(console.error.bind(console)); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <demo-app>Loading...</demo-app> </div> </body> </html>