Your search did not match any results.
Scheduler

Custom Drag-and-Drop

Appointment drag-and-drop is enabled out-of-the-box, but only if appointments are moved within the Scheduler. In this demo, appointments can be moved between the Scheduler and a list. Follow the steps below to implement this functionality:

  1. Configure the Scheduler
    In the appointmentDragging object, implement the onAdd function (in which you should add an appointment) and the onRemove function (in which you should delete an appointment and create a corresponding list item).

  2. Configure list items
    Attach an instance of the Draggable widget to every list item. The widget has the data option that can contain custom data. In this demo, it is an appointment's subject. Implement the onDragStart function in which you should pass the subject to the Scheduler where it is used to add new appointments.

  3. Configure the list
    Attach another Draggable instance to the list which only serves as the drop target. Implement the onDragStart function to ensure the list cannot be dragged.

  4. Add the controls to the same group
    To enable drag-and-drop operations between the controls, assign the same value to the group option of the Scheduler's appointmentDragging object and both Draggable widgets.

Copy to CodeSandBox
Apply
Reset
<template> <div id="demo-container"> <dx-scroll-view id="scroll"> <dx-draggable id="list" :group="draggingGroupName" :on-drag-start="onListDragStart" data="dropArea" > <dx-draggable v-for="task in tasks" :key="task.text" :clone="true" :group="draggingGroupName" :data="task" :on-drag-start="onItemDragStart" :on-drag-end="onItemDragEnd" class="item dx-card dx-theme-text-color dx-theme-background-color" > {{ task.text }} </dx-draggable> </dx-draggable> </dx-scroll-view> <dx-scheduler id="scheduler" :data-source="appointments" :current-date="currentDate" :views="views" :height="600" :start-day-hour="9" :editing="true" > <dx-appointment-dragging :group="draggingGroupName" :on-remove="onAppointmentRemove" :on-add="onAppointmentAdd" /> </dx-scheduler> </div> </template> <script> import DxScheduler, { DxAppointmentDragging } from 'devextreme-vue/scheduler'; import DxDraggable from 'devextreme-vue/draggable'; import DxScrollView from 'devextreme-vue/scroll-view'; import { appointments, tasks } from './data.js'; export default { components: { DxScheduler, DxDraggable, DxScrollView, DxAppointmentDragging }, data() { return { draggingGroupName: 'appointmentsGroup', views: [{ type: 'day', intervalCount: 3 }], currentDate: new Date(2017, 4, 22), tasks: tasks, appointments: appointments }; }, methods: { onAppointmentRemove(e) { const index = this.appointments.indexOf(e.itemData); if (index >= 0) { this.appointments.splice(index, 1); this.tasks.push(e.itemData); } }, onAppointmentAdd(e) { const index = this.tasks.indexOf(e.fromData); if (index >= 0) { this.tasks.splice(index, 1); this.appointments.push(e.itemData); } }, onListDragStart(e) { e.cancel = true; }, onItemDragStart(e) { e.itemData = e.fromData; }, onItemDragEnd(e) { if (e.toData) { e.cancel = true; } } } }; </script> <style> #scroll, #list { position: absolute; left: 0; top: 0; bottom: 0; width: 240px; } .item { box-sizing: border-box; padding: 10px 20px; margin-bottom: 10px; } #scheduler { margin-left: 270px; } .dx-draggable-source { opacity: 0.5; } .dx-draggable-dragging > * { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 6px 8px rgba(0, 0, 0, 0.2); } </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.2.4/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.2.4/css/dx.light.css" /> <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"> </div> </div> </body> </html>
export const tasks = [ { text: 'New Brochures' }, { text: 'Brochure Design Review' }, { text: 'Upgrade Personal Computers' }, { text: 'Install New Router in Dev Room' }, { text: 'Upgrade Server Hardware' }, { text: 'Install New Database' }, { text: 'Website Re-Design Plan' }, { text: 'Create Icons for Website' }, { text: 'Submit New Website Design' }, { text: 'Launch New Website' } ]; export const appointments = [ { text: 'Book Flights to San Fran for Sales Trip', startDate: new Date(2017, 4, 22, 12, 0), endDate: new Date(2017, 4, 22, 13, 0), allDay: true }, { text: 'Approve Personal Computer Upgrade Plan', startDate: new Date(2017, 4, 23, 10, 0), endDate: new Date(2017, 4, 23, 11, 0) }, { text: 'Final Budget Review', startDate: new Date(2017, 4, 23, 12, 0), endDate: new Date(2017, 4, 23, 13, 35) }, { text: 'Approve New Online Marketing Strategy', startDate: new Date(2017, 4, 24, 12, 0), endDate: new Date(2017, 4, 24, 14, 0) }, { text: 'Customer Workshop', startDate: new Date(2017, 4, 25, 11, 0), endDate: new Date(2017, 4, 25, 12, 0), allDay: true }, { text: 'Prepare 2015 Marketing Plan', startDate: new Date(2017, 4, 25, 11, 0), endDate: new Date(2017, 4, 25, 13, 30) } ];
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.2', 'devextreme-vue': 'npm:devextreme-vue@19.2', jszip: 'npm:jszip@3.1.3/dist/jszip.min.js', 'quill': 'npm:quill@1.3.7/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram', 'devexpress-gantt': 'npm:devexpress-gantt', 'plugin-babel': 'npm:systemjs-plugin-babel@0/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0/systemjs-babel-browser.js' }, meta: { '*.vue': { loader: 'vue-loader' } }, packages: { 'devextreme-vue': { main: 'index.js' }, 'devextreme': { defaultExtension: 'js' } }, babelOptions: { sourceMaps: false, stage0: true } });