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
<template> <div class="schedulers"> <div class="column-1"> <dx-scheduler :data-source="store2" :current-date="currentDate" :views="views" :height="600" :start-day-hour="9" :end-day-hour="19" :remote-filtering="true" current-view="day" text-expr="Text" description-expr="Description" start-date-expr="StartDate" end-date-expr="EndDate" all-day-expr="AllDay" /> </div> <div class="column-2"> <dx-scheduler :data-source="store2" :current-date="currentDate" :views="views" :height="600" :start-day-hour="9" :end-day-hour="19" :remote-filtering="true" current-view="day" text-expr="Text" start-date-expr="StartDate" end-date-expr="EndDate" all-day-expr="AllDay" /> </div> </div> </template> <script> import DxScheduler from 'devextreme-vue/scheduler'; import * as AspNetData from 'devextreme-aspnet-data-nojquery'; import { HubConnectionBuilder, HttpTransportType } from '@aspnet/signalr'; 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(); var 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 }]); }); }); export default { components: { DxScheduler }, data() { return { views: ['day', 'workWeek'], currentDate: new Date(2017, 4, 23), store1: store1, store2: store2 }; } }; </script> <style scoped> .schedulers { display: flex; } .column-1 { padding-right: 5px; } .column-2 { padding-left: 5px; } .dx-scheduler-small .dx-scheduler-view-switcher.dx-tabs { display: table; } </style>
import Vue from 'vue'; import App from './App.vue'; new Vue({ el: '#app', components: { App }, template: '<App/>' });
<!DOCTYPE html> <html> <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.7/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.1.7/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/systemjs@0.21.3/dist/system.js"></script> <script type="text/javascript" src="config.js"></script> <script type="text/javascript"> System.import('./index.js'); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"> <span v-if="false">Loading...</span> </div> </div> </body> </html>
System.config({ transpiler: 'plugin-babel', paths: { 'npm:': 'https://unpkg.com/' }, map: { vue: 'npm:vue@2.6.3/dist/vue.esm.browser.js', 'vue-loader': 'npm:dx-systemjs-vue-browser@latest/index.js', 'devextreme': 'npm:devextreme@19.1', 'devextreme-vue': 'npm:devextreme-vue@19.1', 'devextreme-aspnet-data-nojquery': 'npm:devextreme-aspnet-data-nojquery@2.5.1', jszip: 'npm:jszip@3.1.3/dist/jszip.min.js', 'quill': 'npm:quill@1.3.7/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram', 'plugin-babel': 'npm:systemjs-plugin-babel@0/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0/systemjs-babel-browser.js', 'tslib': 'npm:tslib@1.6.1', '@aspnet/signalr': 'npm:@aspnet/signalr@1.0.0/dist/cjs/index.js' }, meta: { '*.vue': { loader: 'vue-loader' }, 'devextreme-aspnet-data-nojquery': { 'esModule': true } }, packages: { 'devextreme-vue': { main: 'index.js' }, 'devextreme': { defaultExtension: 'js' } }, babelOptions: { sourceMaps: false, stage0: true } });