Skip to main content
iVentureTeam

event_state_selection

Events in Odoo carry a fourth kanban state, Cancelled, and event_state_selection is the widget built around it: icon-based states in a fixed order, a divider isolating the cancel action, and one surprising omission inherited from how it skips its parent's setup.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 26, 2026Updated August 26, 20265 min read
Technical nameevent_state_selection
Field typesselection
Viewsform, kanban
Moduleevent
Used in core2 occurrences across 1 module: the event form title area and the event kanban footer in event
VersionsOdoo 20.0, Odoo 19.0
No-code setupNo. Applied in XML; Studio does not list it
Alternativesstate_selection, hr_applicant_state_selection, event_icon_selection

What the Event state widget does

The event form and kanban cards show a state icon that opens a four-entry dropdown: In Progress, Ready for Next Stage, Blocked, and, after a divider, Cancelled. That is event_state_selection, introduced in Odoo 19 alongside the cancel value on the event model's kanban_state.

It subclasses the generic state_selection widget with its own template. Instead of colored bullets for every state, it assigns each value an icon and a color class: the neutral circle for In Progress, the green circle for Ready for Next Stage, an exclamation-circle for Blocked, and a red times-circle for Cancelled.

The options getter is stricter than the parent's: it maps a hardcoded list of the four values, in that order, looking each label up from the field's actual selection. A custom fifth value on the field would render on the button when active but never appear in the dropdown.

What this means for your team

Events fail differently than tasks: they get canceled. Folding cancellation into the same one-click state control that handles day-to-day triage means an organizer can flag a canceled session from the kanban without opening the record, and the divider in the dropdown keeps that destructive choice visually separate from routine state flips.

The state is also computed server-side: kanban_state on event.event is a stored compute that resets as the event moves through stages, with manual writes allowed on top. The widget is the manual half of that loop; automations, stage changes and the widget all write the same field, and the icon reflects whoever acted last.

For teams running large event calendars, the practical value is the kanban footer usage: a wall of event cards where the red crosses and green circles carry the state of the whole program at a glance.

Supported options in Odoo 19

The widget declares no new options; it explicitly copies the parent state_selection option list into its descriptor, so the two rows below pass through, verified in the Odoo 19.0 source of both files.

OptionTypeWhat it does
autosavebooleanInherited from state_selection. Picking a state saves the whole record immediately, other pending edits included, unless you pass {'autosave': False}.(default: true)(since Odoo 19.0)
hide_labelbooleanInherited from state_selection. The label renders only when you explicitly pass {'hide_label': False}; the text then follows the widget's own four-value mapping through formatSelection.(default: true (label hidden))(since Odoo 19.0)

No hotkeys on this one. Unlike its siblings, the widget's setup() does not invoke the parent's, and the parent's setup is where the form-view command palette entries with the Alt+D/F/G hotkeys are registered. The dropdown works normally; the keyboard shortcuts silently do not exist.

Working examples

How core applies it on the event form

<field name="kanban_state" widget="event_state_selection" class="ms-auto float-end"/>

In the kanban footer

<field class="ms-1 my-auto" name="kanban_state" widget="event_state_selection"/>

Deferring the save

<field name="kanban_state" widget="event_state_selection"
       options="{'autosave': False}"/>

As with the whole state_selection family, the default is an immediate save of the entire record when a state is picked.

What skipping the parent setup really drops

The widget is short, and each of its choices has a visible consequence.

Skipping super.setup() costs more than it looks. The parent's setup does two jobs: install the default color map and register the command palette entries when the descriptor passes withCommand for form views. By not calling it, this widget opts out of both. The colors it does not need, its own icon maps replace them, but the command entries are lost as a side effect, which is why events have no state hotkeys while tasks and applicants do.

The fixed order is a curation layer. super.options returns the field's selection with stage legend substitution; this widget re-maps it through the hardcoded list normal, done, blocked, cancel. The effect is a stable menu order regardless of how the selection is declared, at the price of dropping unknown values from the menu.

The label getter reformats too. It runs formatSelection over the filtered options, so when you enable the label with hide_label: False the text follows the same four-value mapping as the menu.

Dead code ships. this.dialog = useService("dialog") sits in setup with no caller in the class or template, in 19 and still on the development branch. Harmless, but a nice reminder that reading the source beats trusting it.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Icon font migration only on the development branch; see below.
Odoo 19.0VerifiedWidget introduced together with the cancel state value. Verified against the shipped source.
Odoo 18.0Not availableWidget does not exist; events used the generic state_selection with three values.
Odoo 17.0Not availableWidget does not exist.
Odoo 16.0Not availableWidget does not exist.

Upgrade note. The widget and the cancel state value both arrive in Odoo 19. Views migrated from 18 that still name state_selection keep working but render Cancelled with the generic gray bullet and keep it mixed into the dropdown without the divider.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026; the development branch can change until release.

For this widget the branch is an icon migration, not a behavior change: the Font Awesome classes give way to the new oi icon font, with glyph names like error and cancel carried in data-icon attributes and a new stateIconClass getter splitting class from glyph. Order, divider, options and the missing hotkeys are all unchanged, and the unused dialog service is still there. We re-verify against the shipped release.

Common problems and fixes

SymptomCause and fix
Alt+D, Alt+F or Alt+G do nothing on the event formThe widget's setup skips the parent's, where those command palette entries are registered. Expected behavior in 19 and on the development branch; use the dropdown or the command palette by name.
A custom selection value never appears in the dropdownThe options getter maps a hardcoded normal/done/blocked/cancel list; other values are dropped from the menu. Extend the widget in JS if you add states; the button still displays an active unknown value.
The state resets by itself after stage changeskanban_state on event.event is a stored compute with readonly=False; stage movements recompute it. Expected; manual choices hold until the next recompute trigger.
Cancelled renders as a gray bullet, not a red crossThe view still uses the generic state_selection widget from a pre-19 customization. Switch the field to widget="event_state_selection".
Choosing a state saves the form mid-editThe inherited autosave option defaults to true. Pass options="{'autosave': False}" where the change should stay pending.

Event state widget vs the alternatives

WidgetBest forKey difference
event_state_selectionThe four-value event kanban state, including cancellation, on event.eventIcon-per-state rendering with a hardcoded order and divider, at the cost of the family's hotkeys
state_selectionThe standard three-value kanban_state on generic modelsColored bullets, full hotkey support, keeps every selection value in the menu
hr_applicant_state_selectionRecruitment's four-value applicant stateAdds a color rather than icons and keeps the parent's setup, hotkeys included
event_icon_selectionRead-only status icons on event communication rowsPure display widget with an XML-defined icon map, no editing at all

The widget assumes the event model's four-value state vocabulary. On other models, reach for the generic state_selection, or the model-specific subclasses recruitment and project ship for their own vocabularies.

Frequently asked questions

What is the event_state_selection widget in Odoo?+
It is the Events app's version of the kanban state control, added in Odoo 19 when event.event gained a fourth state value, cancel. It renders each state as an icon and separates Cancelled behind a divider in the dropdown.
Why do the state hotkeys work on tasks but not on events?+
The event widget's setup method does not call its parent's, and the parent setup is where the Alt+D/F/G command palette entries are registered. The omission ships in 19 and persists on the development branch.
Can I add my own state to the event dropdown?+
Adding a value to the selection is not enough: the widget's options getter maps a hardcoded four-value list, so extra values are dropped from the menu. You would need a small JS extension overriding that getter.
Does picking a state save the event immediately?+
Yes by default; the inherited autosave option is true even when omitted and saves the whole record. Pass options="{'autosave': False}" to defer.
What changes for event_state_selection in Odoo 20?+
Only the visuals as of the current development branch: Font Awesome glyphs are replaced by the new oi icon font with data-icon attributes. Order, options and behavior stay the same.

Event operations without dropped balls?

We configure Odoo Events for organizers who run real calendars: state flows with cancellation handling, automated attendee communication, and kanban boards your whole team steers by, across Odoo 16 to 19.

Upgrade my event workflows

How this page was produced

This page was verified by reading event_state_selection_field.js and its template in the Odoo 19.0 event module, the base state_selection_field.js in web to confirm what the skipped setup would have registered, the kanban_state declaration in event_event.py, and both core view usages. The Odoo 20 section is a diff against the public development branch. Corrections welcome via our contact page.