Skip to main content
iVentureTeam

task_done_checkmark

A tick instead of a switch, with one rule worth knowing: in a list or a kanban it saves as soon as you click, and on a form it waits for you.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 27, 2026Updated September 7, 20265 min read
Technical nametask_done_checkmark
Field typesboolean
Viewslist, kanban, form
Moduleproject, the Project app
Used in core1 occurrence, the reached flag on project milestones in project
VersionsOdoo 20.0, Odoo 19.0
No-code setupNo. Studio offers a checkbox or a toggle; this variant is set in view XML
Alternativesboolean_toggle, boolean, todo_done_checkmark, project_is_favorite

What the done checkmark does

Marking something done is the most common single action in a project tool, and it happens in two different situations. Ticking items off a list is a rapid, repeated action with no intention of editing anything else. Setting the flag on a form is part of a larger edit that ends with a save.

This widget renders the flag as a checkmark rather than a switch, which suits completion better than an on and off setting, and then adapts to those two situations. In a list or a kanban, clicking writes and saves at once. On a form, clicking updates the record and leaves the save to the user.

Everything else about the value comes from the toggle widget it extends. The difference is entirely in the visual and in that one decision.

What this means for your team

The saving rule is the part worth knowing, because it explains behavior that otherwise looks inconsistent. A user who ticks five milestones in a list expects them to stay ticked without pressing anything, and a user who ticks one on a form expects to be able to discard it along with the rest of their edit. Both expectations are correct, and the widget serves both.

The general lesson is that immediacy should follow the surface, not the field. A widget that always saves is wrong on forms, and one that never saves is wrong in lists. Reading the view type is a small amount of code for a noticeable improvement in how the interface feels.

Supported options in Odoo 19

The widget declares no options of its own. It spreads the toggle widget's descriptor, so the option below is inherited. Its own behavior is decided from the view type rather than from configuration. Read from task_done_checkmark.js and the boolean toggle field, Odoo 19.0.

OptionTypeWhat it does
autosavebooleanInherited from the toggle widget. Note that this widget makes its own saving decision from the view type, so the inherited option has little effect.(default: true)

The saving rule is not configurable. The widget reads the view type from the environment and saves only in lists and kanbans. There is no option to force saving on a form or to prevent it in a list.

Working examples

The core usage

<field name="is_reached"
       widget="task_done_checkmark"
       class="oe_inline"/>

No options. Whether the click saves depends on which view the field is rendered in.

In a list

# clicking writes and saves in one operation
record.update({ is_reached: true }, { save: true })

Which is what makes ticking through a list of milestones feel immediate.

On a form

# clicking updates only; the form save applies it
record.update({ is_reached: true })

So the change can be discarded along with any other edits.

One branch on the view type

The change handler is the widget. It computes the inverted value, then branches on the view type taken from the environment configuration: for a list or a kanban it updates with saving switched on, and for anything else it updates without.

Reading the view type from the environment rather than from a prop is what lets the same field element behave correctly in both places without the view author choosing. It also means the behavior is not overridable from XML, which is deliberate.

The other detail is how the current state is exposed to the template. Odoo 19 keeps a small piece of local state and refreshes it on every render, which works but is more machinery than the job needs. The development branch replaces it with a plain getter reading the record directly, which is both simpler and immune to the state drifting out of step with the record.

Everything else is inherited, including the underlying value handling and the toggle's own options. The widget contributes a template and one branch.

Version compatibility

VersionStatusNotes
Odoo 20.0Partial / changedNot released. Same saving rule; the local state is replaced by a getter.
Odoo 19.0VerifiedFirst version. Verified against the shipped source.
Odoo 18.0Not availableWidget does not exist.
Odoo 17.0Not availableWidget does not exist.
Odoo 16.0Not availableWidget does not exist.

Upgrade note. The widget is new in Odoo 19. On Odoo 18 and earlier the milestone flag used a different control, so an upgrade changes its appearance and its saving behavior with the standard project views, and there is nothing to migrate.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The development branch is unstable and this may still change; we re-verify the page after release.

The saving rule is unchanged. Lists and kanbans still save on click and forms still do not.

The state handling is simplified. The local state refreshed on every render is replaced by a getter reading the record directly, which removes a small opportunity for the displayed tick to disagree with the stored value.

Common problems and fixes

SymptomCause and fix
Ticking on a form does not saveIntended. Only lists and kanbans save on click. Save the form as usual.
Ticking in a list saves before I am readyIntended, and not configurable. Use the plain toggle widget if the immediacy is unwanted.
The tick and the stored value disagreeThe displayed state is refreshed on render in Odoo 19. Reload the view; the development branch removes the intermediate state entirely.
It renders as a switchThe field is using the plain toggle widget rather than this one. Set widget="task_done_checkmark" on the field.
Options are ignoredThe widget declares none of its own and its saving decision overrides the inherited autosave. Nothing to configure here.
Missing widget errorThe project module is not installed in that database. Install Project, or use the toggle widget.

Done checkmark vs the alternatives

WidgetBest forKey difference
task_done_checkmarkCompletion flags that should feel immediate in lists and deliberate on formsSaves on click in lists and kanbans, and defers to the form save elsewhere
boolean_toggleSettings shown as a switchOne saving behavior everywhere, driven by an option
booleanA plain checkboxNo completion semantics and no view-aware saving
todo_done_checkmarkThe same idea in the to-do moduleA sibling widget in a different app
project_is_favoriteMarking a project as a favoriteA star rather than a completion tick

Use the toggle widget where the field is a setting rather than a completion, and a plain checkbox where the surrounding form already establishes that everything saves together. The related to-do checkmark widget covers the same idea elsewhere in Odoo, and choosing between them is mostly about which module you are in.

Frequently asked questions

Why does ticking save in a list but not on a form?+
The widget reads the view type and saves immediately in lists and kanbans, where ticking is a rapid repeated action, but defers on forms, where the tick is part of an edit you confirm.
Can I change that behavior?+
No. The decision is made from the view type in the environment and there is no option for it. Use the plain toggle widget if you need one behavior everywhere.
Why is it a checkmark rather than a switch?+
Because completion is not a setting. A tick reads as done, a switch reads as on, and on a milestone list the first is what people mean.
Does it support options?+
Only the inherited ones, and the toggle's autosave option has little effect because the widget makes its own saving decision.
Which versions have it?+
Odoo 19 onwards. The development branch keeps the same rule and replaces the intermediate display state with a plain getter.

Project screens people update as they work

Milestones, task stages and the reporting on top of them only stay accurate if updating them is faster than not. We configure Odoo Project around how your teams actually work, on versions 16 through 19.

Book a free consultation

How this page was produced

The view type branch, the two update calls and the local state refreshed on render were read from task_done_checkmark.js on the Odoo 19.0 branch, with the inherited option set read from the boolean toggle field in web. The usage comes from project/views/project_milestone_views.xml. Version coverage comes from the absence of the file on 16.0, 17.0 and 18.0, and a comparison against the public development branch. Spotted an error? Tell us and we will correct the page.