Views
Switch, restrict, and control the day, week, month, and agenda views of the dash-mui-scheduler EventCalendar.
---
.. llms_copy::Views
.. toc::
Calendar views
dms.EventCalendar ships four built-in views: day, week, month, and agenda. By default all four are available and the calendar opens on "week". A standalone calendar already lets the user switch views with its built-in view switcher — you only need a callback when you want to *restrict*, *preset*, or *programmatically drive* the view from elsewhere in your layout.
The two props that govern this are view (the currently active view) and views (the list of views the user is allowed to choose from).
.. admonition::ISO strings, not datetimes :color: blue
view is a plain string — one of "day", "week", "month", "agenda". Keep defaultVisibleDate an ISO date string (here "2024-01-15") so the seeded events land on screen at load.
Available views
The four view names are fixed:
"day"— a single day, hour by hour."week"— seven day columns (the default)."month"— a month grid."agenda"— a chronological list of upcoming events.
You set the starting view with defaultView (uncontrolled) or view (controlled). defaultView defaults to "week".
Restricting views
Pass views=[...] to limit which view buttons the calendar renders. Anything omitted from the list is hidden from the switcher. Combine it with defaultView to choose which of the allowed views shows first — just make sure defaultView is one of the values in views.
.. exec::docs.views.views_basic
```python
File: docs/views/views_basic.py
from dash import html, Input, Output, State, callback import dash_mantine_components as dmc import dash_mui_scheduler as dms
Dates are ISO strings (wall time, no Z). The component writes the full
events array back to Dash on every create / move / resize / delete.
events = [ {"id": "1", "title": "Sprint planning", "start": "2024-01-15T09:00:00", "end": "2024-01-15T10:30:00", "color": "blue"}, {"id": "2", "title": "Design review", "start": "2024-01-16T13:00:00", "end": "2024-01-16T14:00:00", "color": "purple"}, {"id": "3", "title": "1:1", "start": "2024-01-17T11:00:00", "end": "2024-01-17T11:30:00", "color": "green"}, ]
ALL_VIEWS = ["day", "week", "month", "agenda"]
views controls which view buttons the calendar offers. The CheckboxGroup
below drives it live — uncheck a view and its button disappears from the
calendar's toolbar. view (controlled) is kept on a value that still exists.
component = html.Div( [ dmc.CheckboxGroup( id="views-restrict-group", label="View buttons to offer", description="Toggle which views appear in the calendar's toolbar.", value=ALL_VIEWS, mb="md", children=dmc.Group( [dmc.Checkbox(label=v.capitalize(), value=v) for v in ALL_VIEWS], mt="xs", ), ), dms.EventCalendar( id="views-restrict-cal", events=events, views=ALL_VIEWS, view="week", defaultVisibleDate="2024-01-15", height=560, ), ] )
@callback( Output("views-restrict-cal", "views"), Output("views-restrict-cal", "view"), Input("views-restrict-group", "value"), State("views-restrict-cal", "view"), prevent_initial_call=True, ) def restrict_views(selected, current_view): # Keep the canonical order; always leave at least one view available. views = [v for v in ALL_VIEWS if v in selected] or ["week"] # If the active view was just removed, fall back to the first remaining one. view = current_view if current_view in views else views[0] return views, view ```
Controlling the active view
To drive the view from your own controls, treat view as a controlled prop: it is both an input and an output. The example below wires a dmc.SegmentedControl to the calendar's view prop. The first callback pushes the segmented control's value into the calendar; the second reads view back out — so when the user clicks the calendar's own view buttons, the segmented control follows along. Both callbacks use prevent_initial_call=True to avoid a fight on load.
.. exec::docs.views.controlled_view
```python
File: docs/views/controlled_view.py
from dash import html, Input, Output, callback import dash_mantine_components as dmc import dash_mui_scheduler as dms
events = [ { "id": "1", "title": "Standup", "start": "2024-01-15T09:00:00", "end": "2024-01-15T09:15:00", "color": "teal", }, { "id": "2", "title": "Workshop", "start": "2024-01-16T14:00:00", "end": "2024-01-16T16:00:00", "color": "orange", }, { "id": "3", "title": "Retro", "start": "2024-01-18T15:00:00", "end": "2024-01-18T16:00:00", "color": "pink", }, ]
view is controlled IN + OUT. The SegmentedControl writes it, and the
calendar writes it back when the user clicks a built-in view button —
the second callback keeps the SegmentedControl in sync.
component = dmc.Stack( [ dmc.SegmentedControl( id="views-controlled-segmented", value="week", data=[ {"label": "Day", "value": "day"}, {"label": "Week", "value": "week"}, {"label": "Month", "value": "month"}, {"label": "Agenda", "value": "agenda"}, ], ), dms.EventCalendar( id="views-controlled-cal", events=events, view="week", defaultVisibleDate="2024-01-15", height=600, ), ], gap="sm", )
@callback( Output("views-controlled-cal", "view"), Input("views-controlled-segmented", "value"), prevent_initial_call=True, ) def set_view(value): return value
@callback( Output("views-controlled-segmented", "value"), Input("views-controlled-cal", "view"), prevent_initial_call=True, ) def read_view(view): return view ```
.. admonition::Controlled in + out :color: green
view has an uncontrolled twin, defaultView. Use defaultView for a fixed starting view you never read back, and view when you need two-way binding like the example above. Don't set both.
EventCalendar props
.. kwargs::dash_mui_scheduler.EventCalendar
---
*Source: /views*
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:
- /views/llms.txt — LLM-friendly documentation
- /sitemap.xml
- /robots.txt