DevExtreme v24.1 is now available.

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

Your search did not match any results.

Adaptability

When the adaptivityEnabled property is set to true, Scheduler elements adapt to small screens as follows:

  • Cell overflow indicators become larger to accommodate touch gestures.
  • The appointment list for a chosen date slides in from the edge of the screen.
  • The appointment details form occupies the entire screen.
  • Instead of the view switcher, a drop-down menu is used to switch between views. To open this menu, users should click or tap a button in the upper right corner.
Backend API
<template> <div> <DxScheduler ref="schedulerRef" time-zone="America/Los_Angeles" :data-source="dataSource" :current-date="currentDate" :cell-duration="cellDuration" :views="views" :height="590" :start-day-hour="9" :adaptivity-enabled="true" current-view="month" > <DxResource :data-source="priorities" field-expr="priorityId" label="Priority" /> </DxScheduler> <DxSpeedDialAction :on-click="showPopup" icon="plus" /> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; import DxScheduler, { DxResource } from 'devextreme-vue/scheduler'; import DxSpeedDialAction from 'devextreme-vue/speed-dial-action'; import { data, priorities } from './data.ts'; const views = ['week', 'month']; const currentDate = new Date(2021, 2, 25); const cellDuration = 30; const dataSource = data; const schedulerRef = ref<DxScheduler>(); function showPopup() { schedulerRef.value?.instance?.showAppointmentPopup(); } </script>
window.exports = window.exports || {}; window.config = { transpiler: 'plugin-babel', meta: { '*.vue': { loader: 'vue-loader', }, '*.ts': { loader: 'demo-ts-loader', }, '*.svg': { loader: 'svg-loader', }, 'devextreme/time_zone_utils.js': { 'esModule': true, }, 'devextreme/localization.js': { 'esModule': true, }, 'devextreme/viz/palette.js': { 'esModule': true, }, }, paths: { 'root:': '../../../../', 'npm:': 'https://unpkg.com/', }, map: { 'vue': 'npm:vue@3.2.47/dist/vue.esm-browser.js', 'vue-loader': 'npm:dx-systemjs-vue-browser@1.1.1/index.js', 'demo-ts-loader': 'root:utils/demo-ts-loader.js', 'svg-loader': 'root:utils/svg-loader.js', 'mitt': 'npm:mitt/dist/mitt.umd.js', 'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.28.1/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@24.1.4/cjs', 'devextreme-vue': 'npm:devextreme-vue@24.1.4/cjs', 'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.7.1/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.10/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.56/dist/dx-gantt.js', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.13', 'inferno': 'npm:inferno@7.4.11/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@7.4.11/dist/inferno-create-element.min.js', 'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js', 'inferno-hydrate': 'npm:inferno-hydrate@7.4.11/dist/inferno-hydrate.min.js', 'inferno-clone-vnode': 'npm:inferno-clone-vnode/dist/inferno-clone-vnode.min.js', 'inferno-create-class': 'npm:inferno-create-class/dist/inferno-create-class.min.js', 'inferno-extras': 'npm:inferno-extras/dist/inferno-extras.min.js', 'plugin-babel': 'npm:systemjs-plugin-babel@0.0.25/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0.0.25/systemjs-babel-browser.js', // Prettier 'prettier/standalone': 'npm:prettier@2.8.8/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.8/parser-html.js', }, packages: { 'devextreme-vue': { main: 'index.js', }, 'devextreme': { defaultExtension: 'js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.13/inferno/package.json', ], babelOptions: { sourceMaps: false, stage0: true, }, }; System.config(window.config);
export const data = [ { text: 'Website Re-Design Plan', startDate: new Date('2021-03-01T16:30:00.000Z'), endDate: new Date('2021-03-01T18:30:00.000Z'), recurrenceRule: 'FREQ=WEEKLY;BYDAY=MO,FR;WKST=TU;INTERVAL=2;COUNT=32', }, { text: 'Book Flights to San Fran for Sales Trip', startDate: new Date('2021-03-01T16:30:00.000Z'), endDate: new Date('2021-03-01T18:30:00.000Z'), recurrenceRule: 'FREQ=WEEKLY;BYDAY=MO,FR;INTERVAL=4;COUNT=32', allDay: true, priorityId: [1], }, { text: 'Install New Router in Dev Room', startDate: new Date('2021-03-01T16:30:00.000Z'), endDate: new Date('2021-03-01T18:30:00.000Z'), recurrenceRule: 'FREQ=WEEKLY;BYDAY=FR;INTERVAL=2;COUNT=32', }, { text: 'Approve Personal Computer Upgrade Plan', startDate: new Date('2021-02-10T17:00:00.000Z'), endDate: new Date('2021-02-10T18:00:00.000Z'), recurrenceRule: 'FREQ=WEEKLY;BYDAY=WE;INTERVAL=2;COUNT=32', priorityId: [2], }, { text: 'Final Budget Review', startDate: new Date('2021-04-01T19:00:00.000Z'), endDate: new Date('2021-04-01T20:35:00.000Z'), }, { text: 'New Brochures', startDate: new Date('2021-04-01T21:30:00.000Z'), endDate: new Date('2021-04-01T22:45:00.000Z'), }, { text: 'Install New Database', startDate: new Date('2021-04-01T16:45:00.000Z'), endDate: new Date('2021-04-01T18:15:00.000Z'), }, { text: 'Approve New Online Marketing Strategy', startDate: new Date('2021-04-01T19:00:00.000Z'), endDate: new Date('2021-04-01T21:00:00.000Z'), }, { text: 'Upgrade Personal Computers', startDate: new Date('2021-04-01T22:15:00.000Z'), endDate: new Date('2021-04-01T23:30:00.000Z'), }, { text: 'Upgrade Personal Computers', startDate: new Date('2021-04-02T22:15:00.000Z'), endDate: new Date('2021-04-02T23:30:00.000Z'), }, ]; export const priorities = [ { text: 'High priority', id: 1, color: '#cc5c53', }, { text: 'Low priority', id: 2, color: '#ff9747', }, ];
import { createApp } from 'vue'; import App from './App.vue'; createApp(App).mount('#app');
@media only screen and (max-width: 370px) { .dx-popup:not(.dx-scheduler-appointment-popup) .dx-dialog .dx-popup-bottom.dx-toolbar .dx-toolbar-items-container { height: auto; } .dx-popup:not(.dx-scheduler-appointment-popup) .dx-dialog .dx-toolbar-items-container .dx-toolbar-center { display: flex; flex-direction: column; } .dx-popup:not(.dx-scheduler-appointment-popup) .dx-dialog .dx-toolbar-items-container .dx-toolbar-center .dx-toolbar-button { padding: 0; } .dx-popup:not(.dx-scheduler-appointment-popup) .dx-dialog .dx-toolbar-items-container .dx-toolbar-center .dx-toolbar-button .dx-button { width: 200px; } .dx-popup:not(.dx-scheduler-appointment-popup) .dx-dialog .dx-toolbar-items-container .dx-toolbar-center .dx-toolbar-button:nth-child(1) { margin-bottom: 12px; } }
<!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/24.1.4/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="styles.css" /> <script src="https://unpkg.com/typescript@4.9.5/lib/typescript.js"></script> <script type="module"> import * as vueCompilerSFC from "https://unpkg.com/@vue/compiler-sfc@3.4.16/dist/compiler-sfc.esm-browser.js"; window.vueCompilerSFC = vueCompilerSFC; </script> <script src="https://unpkg.com/core-js@2.6.12/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.ts"); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"> </div> </div> </body> </html>

In this demo, we also added the floating action button as an alternative way to create a new appointment. The button is implemented with the SpeedDialAction component.