Drag & Resize
Toggle and fine-tune drag-and-drop and resizing in the dash-mui-scheduler EventCalendar, including per-event overrides and external drag.
---
.. llms_copy::Drag & Resize
.. toc::
Drag & Resize
The MUI X Scheduler lets users reschedule an event by dragging it to a new time, and change its duration by dragging its edges. dms.EventCalendar exposes both behaviours through props and they are on by default — a calendar with no callbacks at all is already fully interactive. Every move or resize is written back to the events array (input *and* output) and announced through lastAction, so all you have to do is read those props.
.. admonition::The data boundary :color: blue
events is both an input and an output. When the user drags or resizes an event, the component sends the *entire* new array back to Dash. Dates are plain ISO strings (e.g. "2024-01-15T10:00:00"), never Python datetime objects. lastAction is output-only and reports the most recent interaction — its type is one of create, update, delete, move, resize, or change.
Dragging — areEventsDraggable
areEventsDraggable (bool, default True) controls whether events can be picked up and dropped onto a new time or day. Set it to False to pin every event in place while still allowing creation and deletion. Dragging an event emits a lastAction of type move.
Resizing — areEventsResizable
areEventsResizable (default True) controls whether an event's edges can be dragged to change its duration. It accepts:
True— both the start and end edges are resizable.False— the event keeps a fixed duration.'start'— only the leading (start) edge can be dragged.'end'— only the trailing (end) edge can be dragged.
Resizing emits a lastAction of type resize.
Live toggles
The example below wires a dmc.Switch to areEventsDraggable and a dmc.SegmentedControl to areEventsResizable, so you can feel the difference between each mode. A read-out below the calendar shows the latest lastAction, which makes it easy to tell a move apart from a resize.
.. exec::docs.drag_resize.drag_resize_toggles
```python
File: docs/drag_resize/drag_resize_toggles.py
"""Toggle drag-and-drop and resizing on an EventCalendar at runtime.
A dmc.Switch drives areEventsDraggable and a dmc.SegmentedControl drives areEventsResizable (True / False / 'start' / 'end'). The read-out shows the latest lastAction so you can tell a move apart from a resize. """ from dash import html, Input, Output, callback import dash_mantine_components as dmc import dash_mui_scheduler as dms
EVENTS = [ {"id": 1, "title": "Team Meeting", "start": "2024-01-15T10:00:00", "end": "2024-01-15T11:00:00", "color": "blue"}, {"id": 2, "title": "Project Review", "start": "2024-01-16T14:00:00", "end": "2024-01-16T15:30:00", "color": "purple"}, {"id": 3, "title": "Client Call", "start": "2024-01-17T09:00:00", "end": "2024-01-17T10:00:00", "color": "green"}, {"id": 4, "title": "Locked: Sprint Demo", "start": "2024-01-18T13:00:00", "end": "2024-01-18T14:00:00", "color": "grey", "draggable": False, "resizable": False}, ]
component = dmc.Stack( [ dmc.Group( [ dmc.Switch( id="drag_resize-draggable-switch", label="areEventsDraggable", checked=True, ), dmc.SegmentedControl( id="drag_resize-resizable-control", data=[ {"label": "Both", "value": "true"}, {"label": "Off", "value": "false"}, {"label": "Start edge", "value": "start"}, {"label": "End edge", "value": "end"}, ], value="true", ), ], align="center", gap="lg", ), dms.EventCalendar( id="drag_resize-cal", events=EVENTS, defaultVisibleDate="2024-01-15", areEventsDraggable=True, areEventsResizable=True, height=600, ), dmc.Code(id="drag_resize-readout", block=True), ], gap="md", )
@callback( Output("drag_resize-cal", "areEventsDraggable"), Output("drag_resize-cal", "areEventsResizable"), Input("drag_resize-draggable-switch", "checked"), Input("drag_resize-resizable-control", "value"), ) def set_interactions(draggable, resizable): # Map the SegmentedControl string back to the prop's bool/'start'/'end' shape. resizable_value = {"true": True, "false": False, "start": "start", "end": "end"}[resizable] return draggable, resizable_value
@callback( Output("drag_resize-readout", "children"), Input("drag_resize-cal", "lastAction"), ) def show_last_action(last_action): if not last_action: return "Drag an event to move it, or drag its edge to resize it — lastAction shows up here." event = last_action.get("event") or {} return ( f"lastAction.type: {last_action.get('type')}\n" f"event: {event.get('title', '-')} " f"{event.get('start', '-')} -> {event.get('end', '-')}" ) ```
Per-event and per-resource overrides
The calendar-wide props set the default, but individual events and resources can opt in or out:
- Per event: add
draggable(bool) and/orresizable(bool | 'start' | 'end')
to an event dict. A locked event might use {"draggable": False, "resizable": False} even while the rest of the calendar stays movable. (readOnly: True locks an event completely.)
- Per resource: a resource dict accepts
areEventsDraggable,
areEventsResizable, and areEventsReadOnly, applying that policy to every event assigned to the resource.
These overrides are read straight off the events / resources data — there is no extra prop to enable them.
External drag — drag in and out of the calendar
Two props control whether events can cross the calendar's boundary:
canDragEventsFromTheOutside(bool, defaultFalse) — allow an item from
outside the calendar to be dropped onto it as a new event.
canDropEventsToTheOutside(bool, defaultFalse) — allow an event to be
dragged out of the calendar (for example, to remove it or hand it to another surface).
These enable the cross-boundary drag *targets*; wiring an actual external drag source (a palette of draggable items elsewhere on the page) is left to your own layout. Both default to False, so the calendar is self-contained until you opt in.
.. admonition::Beta :color: yellow
The MUI X Scheduler is in beta. Drag-and-drop and resizing work, but finer external-drag integration may change in future releases.
EventCalendar props
.. kwargs::dash_mui_scheduler.EventCalendar
---
*Source: /drag-resize*
Note for AI agents: This is the static, prerendered view of an interactive Dash application served because we detected a non-JS user agent. Full prose docs:
- /drag-resize/llms.txt — LLM-friendly documentation
- /sitemap.xml
- /robots.txt